SkLearn 用于文本分类的模型

3

我有一个多类分类器,使用Sklearn库提供的LinearSVC模型进行训练。

该模型提供了decision_function方法,我使用numpy库函数来正确解释结果集。

但是,我不明白为什么这个方法总是试图将概率总和(在我的情况下为1)分配给每一个可能的类别。

我预期我的分类器会有不同的行为。

我的意思是,例如,假设我有一个像这样的短文本:

"There are a lot of types of virus and bacterias that cause disease."

但是我的分类器是用三种类型的文本进行训练的,比如说“数学”,“历史”和“技术”。因此,当我尝试对其进行分类时,每个题目都有一个非常接近于零的概率(因此远不到1的总和)。

是否有更合适的方法或模型来获得我刚才描述的结果?

我是否错误地使用了decision_function

有时,您可能会有一些与用于训练分类器的任何主题都无关的文本,反之亦然,可能会有一个主题的概率超过1。

我认为我需要在这些问题上找到一些线索(文本分类,非二元分类等)。

非常感谢您提前的帮助!

3个回答

2

你的问题有多个方面,我会尽力回答。

  1. 我不理解为什么这种方法总是尝试分配概率总和?

这是大多数机器学习模型的本质,需要将给定的示例放入某个类别中,并且每个模型都有一些机制来计算给定数据点属于某个类别的概率,具有最高概率的类别将被预测为相应的类别。

为了解决您的问题,即存在不属于任何类别的示例,您可以在训练模型时始终创建一个名为其他的伪类别。这样,即使您的数据点不对应于实际类别中的任何一个,例如按照您的示例,mathshistorytechnology,它也将被归入other类别。

  1. 解决数据点可能属于多个类别的问题。

这通常使用多标签分类来解决。


1
你需要的是多标签分类模型。请参考这里了解多标签分类和支持多标签分类任务的模型列表。
演示多标签分类的简单示例:
from sklearn.datasets import fetch_20newsgroups

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.preprocessing import OneHotEncoder
categories = ['sci.electronics', 'sci.space', 'talk.religion.misc',]
newsgroups_train = fetch_20newsgroups(subset='all',
                                      remove=('headers', 'footers', 'quotes'),
                                      categories=categories)

from sklearn.multioutput import MultiOutputClassifier
from sklearn.pipeline import make_pipeline

X, y = newsgroups_train.data, OneHotEncoder(sparse=False)\
    .fit_transform([[newsgroups_train.target_names[i]]
                      for i in newsgroups_train.target])

model = make_pipeline(TfidfVectorizer(stop_words='english'),
                      MultiOutputClassifier(LinearSVC()))

model.fit(X, y)

print(newsgroups_train.target_names)
# ['sci.electronics', 'sci.space', 'talk.religion.misc']


print(model.predict(['religion followers of jesus']))
# [[0. 0. 1.]]


print(model.predict(['Upper Atmosphere Satellite Research ']))
# [[0. 1. 0.]]


print(model.predict(['There are a lot of types of virus and bacterias that cause disease.']))
# [[0. 0. 0.]]


0

处理这个问题的常见方法是将文本样本转换为某种向量空间,并测量与该向量空间中代表分类的一些典型位置之间的“距离”。

这种分类器模型很方便,因为如果您将文本样本折叠成词汇频率向量,它几乎可以被表达为一个向量 - 其中维度由您选择跟踪的词汇特征数量定义。

通过对更广泛的文本语料库进行聚类分析,您可以尝试确定常出现在聚类中心的中心点,并且可以用它们所处的向量位置来描述它们。

最后,通过定义少量聚类中心,您可以简单地使用勾股定理找到您选择的样本最接近的主题聚类,但您还可以轻松获取样本与所有其他聚类中心之间的相对距离 - 因此它不太可能性化,而更像是一种空间度量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接