0

我正在执行一些文本分析,使用 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 不会,这仍然让我感到困惑。

谢谢!

4

1 回答 1

4

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

于 2013-09-05T19:45:30.187 回答