2014-01-27 15 views
2

我想在sklearn中使用DictVectorizer來訓練分類特徵。一些功能是整數,一些雙打和一些字符串。機器學習:轉換數組到字典列表

我有數據的數組:

array([['SalesPerson', 'Customer', 'Createdon', ..., 
     'TotEmailsOnFRIPM', 'TotEmailsOnSATPM', 'TotEmailsOnSUNPM'], 
     ['Jim Bean', 
     'Acme Inc', '30:52.0', ..., '0', '0', 
     '0'], 
     ['Stephie Graph', 
     'BigOil', '47:12.0', ..., '0', '0', 
     '0'], 
     ..., 
     ['Steven Amos', 
     'BBF Industries', '35:41.0', ..., '0', '0', 
     '0']]) 

其中第一行是列標題,並且行是下面的值。

爲了使用DictVectorizer我轉換這個數組字典列表如下:

features = data[0,:] 

dict_list = [] 
N, F = data.shape 
d = {} 

for n in range(N): 
    for f in range(F): 
     feature = features[f] 
     d[feature] = data[n,f] 

    dict_list.append(d) 

這產生字典列表如下:

[{'SalesPerson':'Jim Bean', 'Customer':'Acme Inc', 'Createdon':'35:41.0',...,'TotEmailsOnSUNPM':'0'}, 
... 
{'SalesPerson':'Stephen Amos', 'Customer':'BBF Industries', 'Createdon':'30:52.0',...,'TotEmailsOnSUNPM':'0'}] 

然而,當我運行DictVectorizer在這我得到一個數組滿1。

from sklearn.feature_extraction import DictVectorizer 
v = DictVectorizer() 

X_train = v.fit_transform(data_list) 

X_train.toarray() 

產地:

array([[ 1., 1., 1., ..., 1., 1., 1.], 
     [ 1., 1., 1., ..., 1., 1., 1.], 
     [ 1., 1., 1., ..., 1., 1., 1.], 
     ..., 
     [ 1., 1., 1., ..., 1., 1., 1.], 
     [ 1., 1., 1., ..., 1., 1., 1.], 
     [ 1., 1., 1., ..., 1., 1., 1.]]) 

我要去哪裏錯了? 任何幫助將不勝感激。 預先感謝您

回答

2

的錯誤是在循環:

d = {} 
for n in range(N): 
    for f in range(F): 
     feature = features[f] 
     d[feature] = data[n,f] 
    dict_list.append(d) 

,你真的打算這樣做,而不是:

for n in range(N): 
    d = {} 
    for f in range(F): 
     feature = features[f] 
     d[feature] = data[n,f] 
    dict_list.append(d) 

那麼,爲什麼結果都是一個?

由於dict是可變的,在循環中,您一直在修改相同的dict一遍又一遍。換句話說,最後dict_list只是持有一堆參考相同的dict

實際上,您在待被矢量化的數據集中有N個相同的樣本。 DictVectorizer將爲您的功能做一個熱門的編碼,並且由於它僅爲每個單獨的功能部件查看單個值,因此每個功能值僅用1位進行編碼,從而導致全1陣列作爲輸出。

+0

謝謝,愚蠢的錯誤。我現在有另一個問題,這是工作,我有不同的數據類型(字符串,浮點數和整數)的單獨列,我想連接它們,而不會丟失它們的類型。堆棧和列堆棧會丟失類型並將其全部推廣到字符串。 – user3240210

+0

你有沒有考慮在[''pandas''](http://pandas.pydata.org/)中使用''DataFrame''?否則,您可能需要像[結構化數組](http://docs.scipy.org/doc/numpy/user/basics.rec.html)這樣的異構數據。 –