1. 程式人生 > >sklearn——樸素貝葉斯文字分類6

sklearn——樸素貝葉斯文字分類6

使用了countVectorizer和TfidfVectorizer兩個統計統計模型,來比較使用哪個模型效果更好(其實都知道tfidf比較好,數學之美中比較好講解),我們將通過影象可以看出兩個統計模型的效果,並且使用了交叉驗證
#使用交叉驗證
from sklearn.datasets import fetch_20newsgroups
from sklearn.cross_validation import cross_val_score
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
import matplotlib.pyplot as plt
from sklearn.naive_bayes import MultinomialNB
news=fetch_20newsgroups(subset='all')
X,Y=news.data,news.target
k=list(range(10000,180000,10000))
k_count_score=[]
k_tfidf_score=[]
for i in k:
    #tfidf分類器
    tfidf=TfidfVectorizer(analyzer='word',stop_words='english' ,max_features=i)
    X_tfidf=tfidf.fit_transform(X)
    mnb_tfidf=MultinomialNB()
    scores_tfidf=cross_val_score(mnb_tfidf,X_tfidf,Y,cv=10,scoring='accuracy')
    score_tfidf=scores_tfidf.mean()
    k_tfidf_score.append(score_tfidf)

    #tf分類器
    count=CountVectorizer(analyzer='word',stop_words='english' ,max_features=i)
    X_count=count.fit_transform(X)
    mnb_count=MultinomialNB()
    scores_count=cross_val_score(mnb_count,X_count,Y,cv=10,scoring='accuracy')
    score_count=scores_count.mean()
    print(score_count)
    d=()
    d=X_count.get_shape()
    print("維數",d[1])
    k_count_score.append(score_count)
plt.xlabel('dimension')
plt.ylabel('accuracy')
plt.plot(k,k_count_score)
plt.plot(k,k_tfidf_score,color='red')
plt.legend()
plt.show()

結果:


紅線是tfidf

藍線是tf

橫座標是選擇輸入的詞的維度

可以看出使用tfidf只要選擇40000時效果最好,增加之後會出現過擬合

tf則選擇100000時最佳