分類算法----樸素貝葉斯算法
貝葉斯公式:
計算方法:𝑃𝐹1𝐶=𝑁𝑖/𝑁方法:P(F1│C)=Ni/N (訓練文檔中去計算)
𝑁𝑖爲該𝐹1詞Ni爲該F1詞在C類別所有文檔中出現的次數
N爲所屬類別C下的文檔所有詞出現的次數和
例如:求一篇文章是屬於科技還是屬於娛樂,分別求他的樸素貝葉斯值進行判別屬於哪一類別:
特徵\統計 |
科技 |
娛樂 |
彙總(求和) |
“影院” |
8 |
56 |
64 |
“支付寶” |
20 |
15 |
35 |
“雲計算” |
63 |
0 |
63 |
彙總(求和) |
100 |
121 |
221 |
科技: P(影院,支付寶,雲計算 │科技)∗P(科技)=8/100∗20/100∗63/100∗(100/221) =0.00456109
娛樂: P(影院,支付寶,雲計算│娛樂)∗P(娛樂)=56/121∗15/121∗0/121∗(121/221)=0
上面顯示娛樂概率爲0,這顯然不合理,爲解決這個問題,我們需要新的方法-----拉普拉斯平滑
拉普拉斯平滑:
P(F1│C)=(Ni+α)/(N+αm)
𝛼爲指定的係數α爲指定的係數一般爲1,m爲訓練文檔中統計出的特徵詞個數
API:
算法:
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
def naviebayes():
"""樸素貝葉斯"""
# 獲取數據
news = fetch_20newsgroups(subset="all")
# 進行數據分割 特徵值 = 文章,目標值 = 文章匪類
train_x, test_x, train_y, test_y = train_test_split(news.data, news.target, test_size=0.25)
# 特徵抽取
tf = TfidfVectorizer()
# 以訓練集中的詞的列表進行每篇文章的重要性統計
train_x = tf.fit_transform(train_x)
# 因爲都是以訓練集進行統計,所以測試集只需要統計訓練集中的關鍵詞就可以啦
test_x = tf.transform(test_x)
# 進行樸素貝葉斯計算
# 實例化貝葉斯
mlt = MultinomialNB(alpha=1.0)
# 對訓練集進行訓練
mlt.fit(train_x, train_y)
# 測試集進行結果判斷,得出預測類別
y_predict = mlt.predict(test_x)
print("預測類別:", y_predict)
# 準確率,模型的準確率
print(mlt.score(test_x, test_y))
if __name__ == '__main__':
naviebayes()
模型的原因導致預測效果不佳。