探索文本数据

#探索文本数据
from sklearn.datasets import fetch_20newsgroups
data=fetch_20newsgroups()#类字典的方式
#不同类型的新闻,标签的分类
data.target_names

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import numpy as np
import pandas as pd
categories=["sci.space"
           ,"rec.sport.hockey"
           ,"talk.politics.guns"
           ,"talk.politics.mideast"]
train=fetch_20newsgroups(subset="train",categories=categories)
test=fetch_20newsgroups(subset="test",categories=categories)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

from sklearn.feature_extraction.text import TfidfVectorizer as TFIDF
Xtrain=train.data
Xtest=test.data
ytrain=train.target
ytest=test.target
tfidf=TFIDF().fit(Xtrain)
Xtrain_=tfidf.transform(Xtrain)
Xtest_=tfidf.transform(Xtest)

在这里插入图片描述

#在贝叶斯上分别建模,查看分类结果,因为高斯不适合稀疏矩阵,所以不适用
from sklearn.naive_bayes import MultinomialNB,ComplementNB,BernoulliNB
from sklearn.metrics import brier_score_loss as BS
names=["MultinomialNB","ComplementNB","BernoulliNB"]
models=[MultinomialNB(),ComplementNB(),BernoulliNB()]
for clf,name in zip(models,names):
    clf.fit(Xtrain_,ytrain)#在实例化的类上调用这些接口
    y_pred=clf.predict(Xtest_)
    prob=clf.predict_proba(Xtest_)
    score=clf.score(Xtest_,ytest)
    print(name)
    bsscore=[]
    for i in range(len(np.unique(ytrain))):
        bs=BS(ytest,prob[:,i],pos_label=i)
        bsscore.append(bs)
        print("\tBrier under {}:{:.3f}".format(train.target_names[i],bs))
    print("\tAverage Brier:{:.3f}".format(np.mean(bsscore)))
    print("\taccuracy:{:.3f}".format(score))
    print("\n")
     #题目报错的原因是因为新版的布里尔分数只能进行二分类了   
        #新版sklearn的brier_score_loss不支持多分类了

在这里插入图片描述
在这里插入图片描述
剔除掉2类,剩余2类之后,运行结果如上图所示

#使用概率校准
from sklearn.calibration import CalibratedClassifierCV
names = ["Multinomial"
,"Multinomial + Isotonic"
,"Multinomial + Sigmoid"
,"Complement"
,"Complement + Isotonic"
,"Complement + Sigmoid"
,"Bernoulli"
,"Bernoulli + Isotonic"
,"Bernoulli + Sigmoid"]
models=[MultinomialNB()
        ,CalibratedClassifierCV(MultinomialNB(),cv=2,method="isotonic")
       ,CalibratedClassifierCV(MultinomialNB(),cv=2,method="sigmoid")
       ,ComplementNB()
        ,CalibratedClassifierCV(ComplementNB(),cv=2,method="isotonic")
       ,CalibratedClassifierCV(ComplementNB(),cv=2,method="sigmoid")
        ,BernoulliNB()
        ,CalibratedClassifierCV(BernoulliNB(),cv=2,method="isotonic")
       ,CalibratedClassifierCV(BernoulliNB(),cv=2,method="sigmoid")]
for clf,name in zip(models,names):
    clf.fit(Xtrain_,ytrain)#在实例化的类上调用这些接口
    y_pred=clf.predict(Xtest_)
    prob=clf.predict_proba(Xtest_)
    score=clf.score(Xtest_,ytest)
    print(name)
    bsscore=[]
    for i in range(len(np.unique(ytrain))):
        bs=BS(ytest,prob[:,i],pos_label=i)
        bsscore.append(bs)
        print("\tBrier under {}:{:.3f}".format(train.target_names[i],bs))
    print("\tAverage Brier:{:.3f}".format(np.mean(bsscore)))
    print("\taccuracy:{:.3f}".format(score))
    print("\n")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

多项式分布下无论如何调整,算法的效果都不如补集朴素贝叶斯来得好。因此我们在分类的时候,应该
选择补集朴素贝叶斯。对于补集朴素贝叶斯来说,使用Sigmoid进行概率校准的模型综合最优秀:准确率最高,对数
损失和布里尔分数都在0.1以下,可以说是非常理想的模型了。
对于机器学习而言,朴素贝叶斯也许不是最常用的分类算法,但作为概率预测算法中唯一一个真正依赖概率来进行计
算,并且简单快捷的算法,朴素贝叶斯还是常常被人们提起。并且,朴素贝叶斯在文本分类上的效果的确非常优秀。
由此可见,只要我们能够提供足够的数据,合理利用高维数据进行训练,朴素贝叶斯就可以为我们提供意想不到的效


版权声明:本文为weixin_45271076原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。