【发布时间】:2016-10-20 20:07:40
【问题描述】:
我有一个包含文本和标签的 pandas 数据框,我正在尝试使用 scikit-learn 的 CountVectorizer、TfidfTransformer 和 MultinomialNB 预测标签。数据框如下所示:
text party
0 Herr ålderspresident! Att vara talman i Sverig... S
1 Herr ålderspresident! Ärade ledamöter av Sveri... M
2 Herr ålderspresident! Som företrädare för Alli... M
3 Val av andre vice talman Herr ålderspresident!... SD
4 Herr ålderspresident! Vänsterpartiet vill utny... V
当我使用上面提到的三个估计器构建管道时,我的预测准确度只有约 35%,但当我删除 TfidfTransformer 时,准确度会提高到更合理的约 75% 准确度。
text_clf = Pipeline([('vect', CountVectorizer()),
('tfidf', TfidfTransformer()), # problematic row
('clf', MultinomialNB()),
])
text_clf = text_clf.fit(df.text.values, df.party.values)
test = df.sample(500, random_state=42)
docs_test = test.text.values
predicted = text_clf.predict(docs_test)
np.mean(predicted == test.party.values)
# Out: either 0.35 or 0.75 depending on whether I comment out the problematic row above
当我得到 0.35 并检查 predicted 时,我发现它几乎只包含一个标签 ('S')。这是原始数据集中最常见的标签,但这不应该影响预测,对吧?关于我为什么会得到这些奇怪结果的任何想法?
编辑:Link to data,其中anforandetext 和parti 是相关列。
【问题讨论】:
-
为什么要在用于训练模型的相同数据上进行测试?这是机器学习中的一大禁忌。不过,这可能无关紧要,但您应该使用交叉验证来获得准确度估计。
标签: python pandas scikit-learn classification