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



我正在尝试使用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数组作为输出。

相关内容

  • 没有找到相关文章

最新更新