我正在尝试使用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时,我会得到一个装满1s的数组。
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.]])
我要去哪里?任何帮助将不胜感激。预先感谢
错误在循环中:
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位编码,从而将All-1数组作为输出。