聯合機率:包含多個條件,且全部條件同時成立的機率算法
記做 𝑃(𝐴,𝐵) 、 P(AB) 、 P(A∩B):𝑃(𝐴,𝐵) = P(A) * P(B)fetch
條件機率:就是事件A在另一個事件B已經發生條件下的發生機率雲計算
記做:𝑃(𝐴|𝐵) = P(A,B) / P(B)spa
特性:P(A1,A2|B) = P(A1|B)P(A2|B)
注意:此條件機率的成立,是因爲A1,A2相互獨立的結果3d
樸素貝葉斯-貝葉斯公式code
注:w爲給定文檔的特徵值(頻數統計,預測文檔提供),c爲文檔類別。
公式能夠理解爲:orm
其中c能夠是不一樣類別。blog
公式分爲三個部分:事件
計算方法:𝑃(𝐹1│𝐶)=𝑁𝑖/𝑁 (訓練文檔中去計算)。支付寶
𝑁𝑖爲該𝐹1詞在C類別全部文檔中出現的次數。
N爲所屬類別C下的文檔全部詞出現的次數和。
例子:
訓練集統計結果(指定統計詞頻):
現有一篇被預測文檔:出現了影院,支付寶,雲計算,計算屬於科技、娛樂的類別機率?
思考:屬於某個類別爲0,合適嗎?
問題:從上面的例子咱們獲得娛樂機率爲0,這是不合理的,若是詞頻列表裏面有不少出現次數都爲0,極可能計算結果都爲零
解決方法:拉普拉斯平滑係數
𝛼爲指定的係數通常爲1,m爲訓練文檔中統計出的特徵詞個數
sklearn.naive_bayes.MultinomialNB
sklearn.naive_bayes.MultinomialNB(alpha = 1.0)樸素貝葉斯分類
alpha:拉普拉斯平滑係數
(1) 準確率
estimator.score()
通常最多見使用的是準確率,即預測結果正確的百分比。
(2) 精確率和召回率
在分類任務下,預測結果(Predicted Condition)與正確標記(True Condition)之間存在四種不一樣的組合,構成混淆矩陣(適用於多分類)
預測結果爲正例樣本中真實爲正例的比例(查得準)
真實爲正例的樣本中預測結果爲正例的比例(查的全,對正樣本的區分能力)
(3) 分類模型評估API
sklearn.metrics.classification_report
sklearn.metrics.classification_report(y_true, y_pred, target_names=None)
sklearn20類新聞分類
20個新聞組數據集包含20個主題的18000個新聞組帖子
# coding=utf-8 from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import classification_report from sklearn.feature_extraction import DictVectorizer from sklearn.tree import DecisionTreeClassifier, export_graphviz import pandas as pd def naviebayes(): """ 樸素貝葉斯進行文本分類 :return: None """ news = fetch_20newsgroups(subset="all") # print(news.data) # print(news.target) # 進行數據集分割 x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25) # print(x_test) # 對數據集進行特徵抽取 tf = TfidfVectorizer() # 對訓練集中的列表進行每篇文章重要性統計 x_train = tf.fit_transform(x_train) print(tf.get_feature_names()) x_test = tf.transform(x_test) # 進行樸素貝葉斯算法預測 mlt = MultinomialNB(alpha=1.0) # print(x_train.toarray()) mlt.fit(x_train, y_train) y_predict = mlt.predict(x_test) print("預測文章類別爲:\n", y_predict) print("準確率爲:\n", mlt.score(x_test, y_test)) print("每一個類別的精確率和召回率\n", classification_report(y_test, y_predict, target_names=news.target_names)) if __name__ == '__main__': naviebayes()
優勢:
缺點: