【问题标题】:SGDClassifier generates Keyerror from sparse datasetSGDClassifier 从稀疏数据集中生成 Keyerror
【发布时间】:2013-09-03 08:12:38
【问题描述】:

我正在执行一些文本分析,使用 Pandas 提取数据。

X = pd.read_Csv('../data/training.tsv', sep ='\t', na_values=['?'])
X['json'] = X['json'].apply(json.loads)
extractBody = lambda x: x['body'] if x.has_key('body') and x['body'] is not None else u'empty'
X_all['body'] = X['json'].map(extractBody)

我把它放入一个 scikit-learn 向量中,分离 tf-idf 加权步骤:

body_counter = CountVectorizer()
body_counts = body_counter.fit_transform(X_all['body'])
body_transform = TfidfTransformer()
body_counts = body_tranform.fit_transform(body_counts)

我想使用 SGDClassifier 来预测某种意义上的“垃圾邮件”/“非垃圾邮件”的简单二元分类。

model - SGDClassifier(n_iter = 5, loss = log)
model.fit(body_counts, labels)

运行时,fit 方法会生成以下 KeyError:

...
return self.index.get_value(self,key)
...
return self._engine.get)value(series, key)

File "index.pyx", line 96, in pandas.index.INdexEngine.get_value (pandas/index.c:2873)
File "index.pyx", line 104, in pandas.index.IndexEngine.get_value (pandas/index.c:2685)
File "index.pyx", line 148, in pandas.index.IndexEngine.get_loc (pandas/index.c:3422)
File "hashtable.pyx", line 382, in pandas.hashtable.Int64HashTable.get_item (pandas/hashtable.c:6570)
File "hashtable.pyx", line 388, in pandas.hashtable.Int64HashTable.get_item (pandas/hashtable.c:6511)
KeyError: 0

我不确定这里发生了什么。当我只想交叉验证它(cross_val_score)时,这个模型工作得很好。我可以在 scikit learn 中使用 naive_bayes 或 TruncatedSVD 运行这个数据集。仅当我尝试拟合此模型时才会发生这种情况,我不确定为什么。

我该如何解决这个问题?还是我在查看 scikit learn 中的错误?

编辑

是的,不幸的是我不得不将我的代码重写到这篇文章中而不是复制,所以可能有一些错误。我在没有 wifi 连接的笔记本电脑上编写代码。

X.shape = 7396, 105273
labels.len() = 7395
labels type = 'pandas.core.series.Series'

...我将标签转换为 numpy 数组,它通过了!

cross_val_score 会按原样接受标签,但 model.fit 不会。

谢谢!

【问题讨论】:

  • 您是否复制了 sn-ps 而不是复制和粘贴?您的示例代码和错误消息有许多拼写错误、随机大小写、不平衡和缺少引号。
  • 您能否通过添加以下输出来编辑您的问题:print()(type(labels))print(len(labels))print(list(labels)[0])。您提供的截断回溯没有给我们任何线索,SGDClassifier 可以参与其中,因为我们只会在访问 SGDClassifier 内部未使用的 pandas 数据结构时出错。
  • 请附上short working example,我们无法帮助您。

标签: python pandas scikit-learn


【解决方案1】:

我刚刚遇到了同样的问题。供将来参考:只需调用 labels.values 将 pandas 系列标签转换为 numpy 数组。

【讨论】:

  • 晚了,但这对于 sklearn 的数据格式化非常有用!谢谢!
猜你喜欢
  • 2015-09-14
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
相关资源
最近更新 更多