我正在尝试在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.]])
我哪里错了? 任何帮助将不胜感激。 提前谢谢
答案 0 :(得分:3)
错误在循环中:
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数组作为输出。