机器学习:将数组转换为字典列表

时间:2014-01-27 13:31:07

标签: python dictionary numpy machine-learning scikit-learn

我正在尝试在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.]])

我哪里错了? 任何帮助将不胜感激。 提前谢谢

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数组作为输出。