【问题标题】:DictVectorizer Recognize Feature as StringDictVectorizer 将特征识别为字符串
【发布时间】:2014-01-08 06:36:47
【问题描述】:

我通过 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(sparse=False)
X = vec.fit_transform(dictionary_list)

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

我目前正在更新此列表中的字典,以将键“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 团队的出色工作。

【问题讨论】:

  • 我不确定你的意思。数据最初是什么样的?
  • 谢谢@larsmans,我刚刚编辑了问题。

标签: python dictionary numpy scikit-learn


【解决方案1】:

如果您将代码更改为类似的东西,我想您可以加快速度

for dct in dictionary_list:
    if 'gene_name' in dct:
        dct['gene_name'] = str(dct['gene_name'])

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

【讨论】:

  • 感谢您的帮助和耐心先生们。我将考虑为 sklearn 做出贡献,以添加有关将特定列数组强制为字符串的功能。
【解决方案2】:

如果我对您的代码理解正确,您将遍历所有键以查看其中一个是否为 "gene_name" 我猜您正在这样做,因为并非所有字典都可能具有该键。

如果你这样做了:

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

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

【讨论】:

  • 嘿麦哲伦,我相信您提供的内容与我在上面分享的列表理解相同。我只是编辑了我的问题以帮助澄清。感谢您的努力。
  • @KLDavenport 虽然等效,但由于答案中所述的原因,此答案中的代码应该比您的代码更有效。
  • 请原谅我的无知,但我很难看出其中的区别,我也在做一个 for 和 if 语句,对吗?
  • @KLDavenport 您的 if 在生成器 comprehensis 内,因此它会检查所有 dict 项,即 O(n)(n 是 dict 长度),if key in dct 是使用 O( 1) 复杂性。
  • 我必须把它交给 alko,他的代码更清晰很可能更有效。如果您确定每个字典都包含“gene_name”关键字,您也可以省略 if 语句。您也可以考虑使用 try:... 除了 KeyError: 子句
猜你喜欢
  • 1970-01-01
  • 2018-10-10
  • 2019-11-13
  • 2015-05-13
  • 2014-06-12
  • 2017-09-08
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多