文本分类任务的最佳 scikit 分类器

Posted

技术标签:

【中文标题】文本分类任务的最佳 scikit 分类器【英文标题】:Best scikit classifier for text classification task 【发布时间】:2013-06-29 10:11:56 【问题描述】:

我正在使用 scikit 对短语进行文本分类以使其具有含义。一些例子是:

"Yes" - label.yes
"Yeah" - label.yes
...
"I don't know" - label.i_don't_know
"I am not sure" - label.i_don't_know
"I have no idea" - label.i_don't_know

使用 TfidfVectorizer 和 MultinomialNB 分类器一切正常。

当我添加新的文本/标签对时出现问题:

"I" - label.i

预测“I”的类仍然会返回 label.i_don't_know,即使文本恰好在这样的训练数据中,这可能是由于一元词“I” 在 label.i_don't_know 中比在 label.i 中出现的频率更高。

是否有分类器可以在此任务上提供可比或更好的性能,并保证正确返回训练数据元素的预测?

这段代码进一步说明了这个问题:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB

#instantiate classifier and vectorizer
clf=MultinomialNB(alpha=.01)
vectorizer =TfidfVectorizer(min_df=1,ngram_range=(1,2))

#Apply vectorizer to training data
traindata=['yes','yeah','i do not know','i am not sure','i have no idea','i'];
X_train=vectorizer.fit_transform(traindata)

#Label Ids
y_train=[0,0,1,1,1,2];

#Train classifier
clf.fit(X_train, y_train)

print clf.predict(vectorizer.transform(['i']))

代码输出标签 1,但正确的分类应该是标签 2。

【问题讨论】:

如果没有可重现的代码示例,很难说解决方案是使用不同的分类器,还是改变您使用当前分类器的方式。 谢谢,我添加了示例代码。 【参考方案1】:

问题不在于分类器,而在于矢量化器。 TfidfVectorizer 有一个参数token_pattern : string,它是一个“正则表达式,表示什么是‘token’,仅在tokenize == 'word' 时使用。默认的正则表达式选择2 个或更多字母字符 (标点符号被完全忽略并始终视为标记分隔符)。” (强调补充)。分词器抛出单词i,导致一个空文档。然后朴素贝叶斯将其归类为 1 类,因为这是训练数据中出现频率最高的类。

根据数据,您可能需要考虑对朴素贝叶斯使用统一先验。


关于为什么事情可能无法正常工作的进一步提示:

您的管道设置方式可能还有其他一些奇怪之处。我发现检查每个阶段的输入和输出(标记器、矢量器、分类器等)很有用。从长远来看,花一些时间编写单元测试将为您节省大量时间。

一旦您对一切正常工作感到满意,请尝试根据测试数据评估您的分类器。我怀疑您的课程之间存在相当大的重叠,尤其是label.i_don't_knowlabel.i。如果是这种情况,分类器的性能就会很差。

【讨论】:

谢谢,这对上述数据集有帮助。奇怪的是,在包含数千个训练文档的真实数据集上,它并没有帮助。还有什么可能导致这种行为? 当你说“有帮助”时,你指的是token_pattern参数还是class_prior 我使用了token_pattern="\w1,"。我还没有更改class_prior

以上是关于文本分类任务的最佳 scikit 分类器的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn 进行多标签文本分类,使用哪些分类器?

使用 python scikit-learn 执行无监督文本分类(聚类)的最佳算法是啥?

需要帮助将 scikit-learn 应用于这个不平衡的文本分类任务

如何识别已用于对每个类别进行分类的最佳特征

scikit-learn 中为文本分类排列文本数据的标准方法是啥?

Scikit learn/python中自然文本的有效分类