機器學習系列之樸素貝葉斯演算法(監督學習-分類問題)
阿新 • • 發佈:2019-02-09
'''
@description :一級分類:監督學習,二級分類:分類(離散問題),三級分類:貝葉斯演算法
演算法優點:
a 樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率
b 對缺失的資料不太敏感,演算法也比較簡
c 分類問題準確度高、速度快
演算法缺點:
a 由於使用了樣本屬性獨立性的假設,所以如果樣本屬性有關聯時其效果不好
應用場景:常用於文字分類問題
@author wolf
@time 2018-05-02
'''
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
from sklearn.metrics import classification_report
def naivebases():
# 1 讀取資料,載入sscikitLearn官方資料集
'''
資料集官方地址:http://sklearn.apachecn.org/cn/0.19.0/datasets/twenty_newsgroups.html
資料集背景:20類別,18846篇文章
資料集類別:news.target_names,news.target
檢視文章內容:
orign_data = list(news.data)
for x in range(10):
print(orign_data[x])
print("*" * 100)
type(news.data) 是list不是ndarray
'''
news = fetch_20newsgroups(subset='all')
# 2 資料集分割:訓練集、測試集
'''
通用標準:測試集佔比25%
type(x_train) 是list不是ndarray
'''
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
# 3 特徵工程:資料集特徵抽取
'''
使用tf-idf演算法:
a 提取文章內容中分詞(通用規則按空格,英文文章不需要處理,中文需要藉助開源工具jieba按中文語義拆分中文分詞)
b 計算分詞在文章中重要性(大部分語氣詞詞頻很高,但不能代表文件的屬性)
c tf-idf = tf(term frequnce分詞在文章中詞頻) * idf(inverse document frequnce)
idf = log(總文件數/該分詞出現的文件數) log:對資料函式
d 返回所有分詞(特徵)相對於文章的重要性矩陣 tf.get_feature_names(),返回結果預設是sparse矩陣:
x_train.toarray()
e type(x_train) <class 'scipy.sparse.csr.csr_matrix'>,scipy基於numpy,最終資料結構ndarray
x_train.shape:(14134, 149647)
'''
tf = TfidfVectorizer()
# 訓練集
x_train = tf.fit_transform(x_train)
# 測試集
x_test = tf.transform(x_test)
# 4 樸素貝葉斯演算法
'''
演算法思想:根據目標(測試集)分詞-特徵(根據tf-idf演算法計算出重要性的分詞並在分詞中刷選重要的分詞,預設是刷選出的
全部重要分詞)在資料集(訓練集、測試集)
計算文章歸屬類別的概率(貝葉斯概率),最終選中概率最大類別。為了保證計算出的概率不為0,概率計算中增加拉普拉
斯平滑係數
數學原理:
聯合概率:P(A&B) = P(A) * P(B)
條件概率:P(A|C, B|C) = P(A|C) * P(B|C)
貝葉斯公式:P(C|F1,F2...) = P(F1,F2...|C) * P(C) / P(F1,F2...)
Ni = P(F1,F2...|C) * P(C) 指定分類特徵分詞概率
P(C) 總文章數指定類別的概率
P(W) = P(F1,F2...) 指定特徵分詞概率
拉普拉斯平滑係數: (Ni + a) / (m * a) a常為1、 m常為總特徵分詞數
'''
# 樸素貝葉斯模型
mlt = MultinomialNB(alpha=1.0)
mlt.fit(x_train, y_train)
# 預測測試集類別
y_predict = mlt.predict(x_test)
print("預測的文章類別為:", y_predict)
# 模型評估
'''
TP、FP、TN、FN構成混淆矩陣
準確率(accuracy) = (TP+TN) / ALL
精確率(precision) = TP / (TP + FP)
召回率(recall) = TP / (TP + FN)
F1-score = 2 * precision * recall / (precision + recall)表示模型的穩定性
'''
print("準確率:", mlt.score(x_test, y_test))
rp = classification_report(y_test, y_predict, target_names=news.target_names)
print(rp)
if __name__ == "__main__":
naivebases()