DictVectorizer将特征识别为字符串

时间:2014-01-07 19:08:37

标签: python dictionary numpy scikit-learn

我通过DictVectorizer(0.14)运行的字典列表具有已编码为整数的特定分类值:

> dictionary_list[0:2]

输出:

[{u'Life': 3377, u'SerumX': 1015, u'duration': 3, u'gene_name': 37},
 {u'Life': 11655, u'SerumX': 1913, u'duration': 3, u'gene_name': 1}]
  

vec = DictVectorizer(稀疏=假)
  X = vec.fit_transform(dictionary_list)

例如,基因APC,AXIN1,BLM可以通过某种任意方法编码为37,1,15。也就是说这些数字不是字符/ ngram等的NLP表达式。

我目前正在更新此列表中的dicts,以将键'gene_name'的值从int转换为str:

for dicts in dictionary_list:
   dicts.update((k, str(v)) for k, v in dicts.iteritems() if k == 'gene_name')

> dictionary_list[0:2]

输出:

[{u'Life': 3377, u'SerumX': 1015, u'duration': 3, u'gene_name': '37'},
 {u'Life': 11655, u'SerumX': 1913, u'duration': 3, u'gene_name': '1'}]

我希望优化速度,避免在通过DictVectorizer之前更新dict。我很好奇是否有办法将我的列表传递给DictVectorizer,我可以让它将'gene_name'的值强制为字符串以利用内置编码。

非常感谢scikit-learn团队的出色工作。

2 个答案:

答案 0 :(得分:2)

如果您将代码更改为

,我猜您可以加快速度
for dct in dictionary_list:
    if 'gene_name' in dct:
        dct['gene_name'] = str(dct['gene_name'])

我认为你无法避免将值强制转换为字符串,因为DictVectorizer使用isinstance(value, six.string_types)作为条件来过滤掉提供的数据中的分类值。

答案 1 :(得分:1)

如果我理解你的代码是正确的,那么你循环遍历所有密钥以查看其中一个密钥是否"gene_name"我猜你正在这样做,因为并非所有字典都有这个密钥。

如果你这样做了:

for dic in records_list:
    if 'gene_name' in dic:
        dic.update({ 'gene_name' , str(dic['gene_name']) })

您只能访问要更改的密钥。