我通过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团队的出色工作。
答案 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']) })
您只能访问要更改的密钥。