算法總結2:樸素貝葉斯算法

1.機率基礎

聯合機率:包含多個條件,且全部條件同時成立的機率算法

記做 𝑃(𝐴,𝐵)  、 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

2.算法原理

樸素貝葉斯-貝葉斯公式code

注:w爲給定文檔的特徵值(頻數統計,預測文檔提供),c爲文檔類別。
公式能夠理解爲:orm

其中c能夠是不一樣類別。blog

公式分爲三個部分:事件

    • 𝑃(𝐶):每一個文檔類別的機率(某文檔類別詞數/總文檔詞數)。
    • 𝑃(𝑊│𝐶):給定類別下特徵(被預測文檔中出現的詞)的機率。

計算方法:𝑃(𝐹1│𝐶)=𝑁𝑖/𝑁 (訓練文檔中去計算)。支付寶

𝑁𝑖爲該𝐹1詞在C類別全部文檔中出現的次數。

N爲所屬類別C下的文檔全部詞出現的次數和。

    • 𝑃(𝐹1,𝐹2,…) 預測文檔中每一個詞的機率。

 

例子:

訓練集統計結果(指定統計詞頻):

現有一篇被預測文檔:出現了影院,支付寶,雲計算,計算屬於科技、娛樂的類別機率?

思考:屬於某個類別爲0,合適嗎?

3. 拉普拉斯平滑

問題:從上面的例子咱們獲得娛樂機率爲0,這是不合理的,若是詞頻列表裏面有不少出現次數都爲0,極可能計算結果都爲零

解決方法:拉普拉斯平滑係數

𝛼爲指定的係數通常爲1,m爲訓練文檔中統計出的特徵詞個數

4.sklearn樸素貝葉斯實現API

sklearn.naive_bayes.MultinomialNB

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

alpha:拉普拉斯平滑係數

5. 分類模型的評估

(1) 準確率

estimator.score()
通常最多見使用的是準確率,即預測結果正確的百分比。

(2) 精確率和召回率

    • 混淆矩陣

在分類任務下,預測結果(Predicted Condition)與正確標記(True Condition)之間存在四種不一樣的組合,構成混淆矩陣(適用於多分類)

 

    • 精確率

預測結果爲正例樣本中真實爲正例的比例(查得準)

 

    • 召回率

真實爲正例的樣本中預測結果爲正例的比例(查的全,對正樣本的區分能力)

 

    • 其餘分類標準,F1-score,反映了模型的穩健型

 

(3) 分類模型評估API

sklearn.metrics.classification_report

sklearn.metrics.classification_report(y_true, y_pred, target_names=None)

    • y_true:真實目標值
    • y_pred:估計器預測目標值
    • target_names:目標類別名稱
    • return:每一個類別精確率與召回率

6. 樸素貝葉斯算法案例

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()

 

 7. 樸素貝葉斯分類優缺點

優勢:

  • 樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率。
  • 對缺失數據不太敏感,算法也比較簡單,經常使用於文本分類。
  • 分類準確度高,速度快

缺點:

  • 須要知道先驗機率P(F1,F2,…|C),所以在某些時候會因爲假設的先驗
  • 模型的緣由致使預測效果不佳。
相關文章
相關標籤/搜索