樸素貝葉斯算法與文本分類分析,工具(python)

一、樸素貝葉斯算法原理

1、聯合概率、條件概率與相互獨立

·聯合概率:包含多個條件,且所有事件同時成立的概率

。記作:P(A,B)
。例如:P(程序員,體型勻稱),P(程序員,超重,喜歡)

·條件概率:就是事件A在另外一個事件B已經發生條件下的發生概率

。記作:P(A|B)
。例如:P(程序員|男生),P(程序員,體重標準|女性)

·相互獨立:如果P(A,B)=P(A)P(B),則稱事件A與事件B相互獨立。

2、貝葉斯公式:P(C|W) = [ P(W|C)*P© ] / P(W)

注:w爲給定文檔的特徵值(頻數統計,預測文檔提供),c爲文檔類別

轉化一下:P(Y|X1,X2,…) = [ P(X1,X2,…|Y)*P(Y) ] / P(X1,X2,…)

簡單理解一下:在已知特徵信息X1,X2,...的條件下,事件Y發生的概率,
等於在事件Y發生的條件下這些特徵信息的聯合概率(所有特徵信息都成立的概率),
乘以在這個樣本中事件Y發生的概率,再去除以在整個樣本中這些特徵信息的聯合概率。

3、樸素貝葉斯算法原理

樸素 + 貝葉斯

樸素: 假設特徵信息X1,X2,…之間是相互獨立的。即P(X1,X2,…)=P(X1) * P(X2)*…

貝葉斯:P(Y|X1,X2,…) = [ P(X1,X2,…|Y)*P(Y) ] / P(X1,X2,…)

樸素貝葉斯:P(Y|X1,X2,…)=P(X1,X2,…|Y)* P(Y) / P(X1,X2,…) = P(X1|Y)* P(X2|Y)…P(Xn|Y) * P(Y) / P(X1)P(X2)…P(Xn)

簡單理解一下:在已知相互獨立的特徵信息X1,X2,...的條件下,事件Y發生的概率,
等於在時間Y發生的條件下每個獨立特徵信息發生的概率乘積,
乘以在這個樣本中事件Y發生的概率,
再去除以在整個樣本中這些特徵信息的聯合概率(這些特徵信息發生的概率乘積)。

應用場景:如文本分類(關鍵詞之間是相互獨立的),垃圾郵件的分類,信用評估,釣魚網站檢測等等

優缺點:優點對缺失值不敏感。缺點特徵變量(特徵值,特徵信息)間需要相互獨立。

4、防止計算出的分類概率爲0

不管是貝葉斯公式還是樸素貝葉斯公式,我們發現都是概率的乘法和除法,所以一旦有某個概率爲0,就會導致結果概率爲0的錯誤結果。

所以在實際的算法中我們需要引入拉普拉斯平滑係數,解決這一問題。

拉普拉斯平滑係數 :p(Fi|C)=(Ni+alpha)/(N+alpha*m)

alpha是指定的係數一般是1,m是訓練文檔中統計出來的特徵詞的個數。

5、案例說明

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4wu9yUxC-1582454196426)(attachment:image.png)]

6、pyhon的樸素貝葉斯API

sklearn.naive_bayes.MultinomialNB(alpha=1.0) #樸素貝葉斯分類

ealpha:拉普拉斯平滑係數

7、算法代碼實現

# 1 獲取數據----對新聞分類
from sklearn.datasets import fetch_20newsgroups  
news=fetch_20newsgroups(data_home=r'E:\fetch_20newsgroups',subset='all')  #將數據下載到本地

# 2 數據處理(略),查驗數據
# display(news.data[0])  #返回特徵值(自變量)列表,每個元素是一篇新聞
print(len(news.data))  #查看有多數篇新聞
# display(news.target) #返回目標值(因變量)數組,用數字表示的每篇新聞的分類
# display(news.target_names) #返回目標值數字對應的解釋
18846
#3 數據集的劃分
from sklearn.model_selection import train_test_split

#語法:x_train,x_test,y_train,y_test = sklearn.model_selection.train_test_split(x,y,test_size=,random_state=)
#解釋:訓練的特徵值(自變量),測試的特徵值,訓練的目標值,測試的目標值= 劃分函數(x特徵值,y目標值,test_size=測試集比例,隨機種子)

#datasets.base.Bunch(繼承自字典)類
x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25,random_state=11)
print(len(x_train),len(x_test),len(y_train),len(y_test))
14134 4712 14134 4712
# 4 特徵工程 -- 文本特徵抽取
import pandas as pd
import numpy as np
from  sklearn.feature_extraction.text import TfidfVectorizer
import jieba  #(jieba 分詞,安裝:pip install jieba)

#數據
#x_train,x_test

#分詞 --英文文檔不需要分詞操作
# cut_data=[]
# for s in data:
#     cut_s=jieba.cut(s)
#     l_cut_s=' '.join(list(cut_s))
#     cut_data.append(l_cut_s)
# print(cut_data)

#TF-IDF
transfer = TfidfVectorizer() #實例化一個文本處理轉換器類
x_train = transfer.fit_transform(x_train) #調用fit_transform() ,先轉化訓練集
#print(x_train)  #非零值的座標  值
#print(transfer.get_feature_names())
#print(x_train.toarray())
x_test = transfer.transform(x_test) #調用transform() ,再轉化測試集
#print(x_test)  #非零值的座標  值
#print(transfer.get_feature_names())
#print(x_test.toarray())
# 5 樸素貝葉斯預估器流程
    #語法:sklearn.naive_bayes.MultinomiaNB(alpha=1.0) #樸素貝葉斯分類
    #  模型調優(略)
from sklearn.naive_bayes import MultinomialNB  #樸素貝葉斯
from sklearn.model_selection import GridSearchCV    #網格搜索和交叉驗證

#estimator = MultinomialNB(alpha=1.0) #實例化一個轉換器類,不進行模型調優的時候用

#加入模型選擇與調優,網格搜索和交叉驗證
estimator = MultinomialNB()
#準備參數
param_dict = {"alpha":[1,2,3]} #ealpha:拉普拉斯平滑係數值設定的可能取值
estimator = GridSearchCV(estimator,param_grid=param_dict,cv=4) #cv=4是4折交叉驗證(實際中經常用10)

#執行預估器,訓練模型
estimator.fit(x_train,y_train)
GridSearchCV(cv=4, error_score='raise',
       estimator=MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True),
       fit_params=None, iid=True, n_jobs=1,
       param_grid={'alpha': [1, 2, 3]}, pre_dispatch='2*n_jobs',
       refit=True, return_train_score='warn', scoring=None, verbose=0)
# 6 模型評估
#方法1:比對真實值和預測值
y_predict = estimator.predict(x_test)  #計算預測值
print(y_predict)
y_test == y_predict  #比對真實值和預測值,相同的返回True
#方法2:直接計算準確率
accuracy=estimator.score(x_test,y_test)
print(accuracy)

# 3、查看網格搜索和交叉驗證返回結果
# 最佳參數:best_params_
print("最佳參數k:",estimator.best_params_)
# 驗證集的最佳結果:best_score_
print("驗證集的最佳結果準確率:",estimator.best_score_)
# 最佳估計器:best_estimator_
print("最佳估計器",estimator.best_estimator_)
# 交叉驗證結果:cv_results_
#print(estimator.cv_results_)  #比較長這裏就不輸出了
[11  2 13 ... 18  1  5]
0.8520797962648556
最佳參數k: {'alpha': 1}
驗證集的最佳結果準確率: 0.8340172633366351
最佳估計器 MultinomialNB(alpha=1, class_prior=None, fit_prior=True)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章