Python 文本分类的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." 但我的分类器

我有一个分类器多类,使用Sklearn库提供的
LinearSVC
模型进行训练。 这个模型提供了一个
decision\u函数
方法,我使用它与numpy库函数一起正确解释结果集

但是,我不明白为什么这个方法总是试图将概率总数(在我的例子中是1)分配到每个可能类之间

我期望我的分类器有不同的行为

我的意思是,例如,假设我有一段很短的文本,如下所示:

"There are a lot of types of virus and bacterias that cause disease."
但我的分类器是用三种文本训练的,比如说“数学”、“历史”和“技术”

所以,当我尝试分类时,我认为这三个主题中的每一个都有一个非常接近于零的概率(因此,到目前为止为和1)

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

我是否以错误的方式使用了
决策功能

有时,您可能有与用于训练分类器的任何主题无关的文本,反之亦然,多个主题的概率可能为1

我想我需要在这些问题上找到一些线索(文本分类、非二进制分类等)


非常感谢您的帮助

你的问题有多个部分,我会尽量回答

  • 我不明白为什么这个方法总是试图分配总的概率
  • 这是大多数ML模型的本质,一个给定的例子必须放在某个类中,每个模型都有某种机制来计算给定数据点属于某个类的概率,以及预测相应类的概率最高的类

    为了解决您的问题,即示例的存在不属于任何类,您可以在训练模型时始终创建一个名为
    其他
    的伪类,即使您的数据点与任何实际类(例如
    数学
    )不对应,
    历史
    技术
    根据您的示例,它将被绑定到
    其他

  • 解决数据点可能属于多个类的问题
  • 这就是通常使用的


    希望这有帮助

    处理这一问题的一种常见方法是尝试将文本样本投射到某种向量空间中,并测量它与同一向量空间中表示分类的某些原型位置之间的“距离”

    这种分类器模型很方便,因为如果将文本样本压缩为词汇频率向量,它几乎可以简单地表示为一个向量,其中维度由您选择跟踪的词汇特征的数量定义

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


    最后,通过定义几个聚类中心,你可以简单地用毕达哥拉斯的方法找到你选择的样本最接近的主题聚类,但是你也可以在指尖上找到样本和所有其他聚类中心之间的相对距离,所以概率较小,更多的是空间尺度

    您需要的是多标签分类模型。请参阅了解多标签分类和支持多标签分类任务的模型列表

    演示多标签分类的简单示例:

    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.]]