Python 文本分类的SkLearn模型
我有一个分类器多类,使用Sklearn库提供的Python 文本分类的SkLearn模型,python,machine-learning,scikit-learn,artificial-intelligence,text-classification,Python,Machine Learning,Scikit Learn,Artificial Intelligence,Text Classification,我有一个分类器多类,使用Sklearn库提供的LinearSVC模型进行训练。 这个模型提供了一个decision\u函数方法,我使用它与numpy库函数一起正确解释结果集 但是,我不明白为什么这个方法总是试图将概率总数(在我的例子中是1)分配到每个可能类之间 我期望我的分类器有不同的行为 我的意思是,例如,假设我有一段很短的文本,如下所示: "There are a lot of types of virus and bacterias that cause disease." 但我的分类器
LinearSVC
模型进行训练。
这个模型提供了一个decision\u函数
方法,我使用它与numpy库函数一起正确解释结果集
但是,我不明白为什么这个方法总是试图将概率总数(在我的例子中是1)分配到每个可能类之间
我期望我的分类器有不同的行为
我的意思是,例如,假设我有一段很短的文本,如下所示:
"There are a lot of types of virus and bacterias that cause disease."
但我的分类器是用三种文本训练的,比如说“数学”、“历史”和“技术”
所以,当我尝试分类时,我认为这三个主题中的每一个都有一个非常接近于零的概率(因此,到目前为止为和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.]]