1. 程式人生 > 其它 >樸素貝葉斯——分類模型

樸素貝葉斯——分類模型

樸素貝葉斯的簡介,和基本使用sample。

樸素貝葉斯——分類模型

樸素貝葉斯:首先貝葉斯推論就是通過結論推條件。專業點就是先假定先驗概率,然後通過後驗概率來判斷先驗概率的正確性,若不準確,則修正。(感覺好像邏輯迴歸的反向傳播)

然後樸素的意思是:各個因素相互獨立。互不干擾

優點

樸素貝葉斯發源於古典數學理論,有穩定的分類效率。

對缺失資料不太敏感,演算法也比較簡單,常用於文字分類

分類準確度高,速度快

缺點

由於使用了樣本屬性獨立性的假設,所以如果樣本屬性有關聯時其效果不好

鳶尾花

from sklearn.naive_bayes import GaussianNB
from sklearn import datasets
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()
feature = iris.data
target = iris.target

g = GaussianNB()
g.fit(x_train,y_train)
g.score(x_test,y_test) #0.8333333333333334

# 檢視第一條測試資料的分類
g.predict(x_test[1].reshape((1,-1)))

tmp = g.predict_proba(x_test[10].reshape(1,-1))  #獲得預測值,求和=1,注意這裡沒有取log
import numpy as np
data= np.around(tmp, 2)  #保留兩位小數
data

手寫數字

import sklearn.datasets as datasets
import numpy as np
digist = datasets.load_digits()
feature= digist.data
target = digist.target

x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.1,random_state=2020)

#訓練模型
g = GaussianNB()
g.fit(x_train,y_train)

g.score(x_test,y_test)#0.8333333333333334

y_pred = g.predict(x_test)
print('模型分類結果:',y_pred[:10])
print('真實的分類結果:',y_test[:10])

#看各種分類的概率 其中4的概率也是最大的
tmp = g.predict_proba(x_test[3].reshape(1,-1))  
data= np.around(tmp, 2) 
data

# g.predict_log_proba(x_test[3].reshape(1,-1))  這個是把概率取log了,就不會發生很大的精度誤差了

資料使用- 實戰:資料使用fetch_20newsgroups中的資料,包含了20個主題的18000個新聞組的帖子

  • 什麼是TF-IDF
    • 在資訊檢索中,tf-idf(詞頻-逆文件頻率)是一種統計方法,用以評估一個單詞在一個文件集合或語料庫中的重要程度。
    • 如果某個詞或短語在一篇文章中出現的頻率高(即TF高),並且在其他文章中很少出現(即IDF高),則認為此詞或者短語具有很好的類別區分能力,適合用來分類。
import sklearn.datasets as datasets
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
news = datasets.fetch_20newsgroups(data_home='./')                  #載入20類新聞資料

feature = news.data#返回的是列表,列表中為一篇篇的文章
target = news.target#返回的ndarray,儲存的是每一篇文章的類別

print(feature[1])

t = TfidfVectorizer()
feature_t = t.fit_transform(feature) #提取Tf_idf

x_train,x_test,y_train,y_test = train_test_split(feature_t,target,test_size=0.01,random_state=2020)

m = MultinomialNB()
m.fit(x_train,y_train)

m.score(x_test,y_test) #0.868421052631579
m.predict(x_test)
m.predict_log_proba(x_test[10])