朴素贝叶斯算法-分类算法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 樸素貝葉斯算法-分類算法
1 概率基礎
概率定義為一件事情發生的可能性
聯合概率:包含多個條件,且所有條件同時成立的概率,記作P(A,B)
條件概率:事件A在另一個事件B已經發生條件下的發送概率,記作P(A|B)
在A1,A2相互獨立的情況下,條件概率的特性:P(A1,A2|B)=P(A1|B)P(A2|B)
2 貝葉斯公式
W:特征向量? ? ? ? ? ?C:類別
貝葉斯公式最常用于文本分類,上式左邊可以理解為給定一個文本詞向量W,那么它屬于類別C的概率是多少。式子右邊分幾部分,P(W∣C??)為在給定類別的情況下,該文檔的詞向量(被預測文檔中出現詞)的概率,P(C)為每個文檔類別的概率(某文檔類型詞數/總文檔詞數),P(F1,F2..)預測文檔中每個詞的概率
可以理解為:
C可以是不同類別
假如有個訓練集統計結果如下:
| 特征/統計 | 科技 | 歷史 | 匯總 |
| 諸葛亮 | 2 | 60 | 60 |
| 原子彈 | 55 | 20 | 75 |
| 飛機 | 60 | 23 | 83 |
| 盧溝橋事變 | 0 | 65 | 65 |
| 匯總 | 117 | 168 | 285 |
現有一篇被預測文檔:出現了原子彈,飛機,盧溝橋事變屬于科技、歷史的類別概率?
因為P(原子彈,飛機,盧溝橋事變)在每個統計中都是一樣的,所有忽略。
P(科技|原子彈,飛機,盧溝橋事變)=P(原子彈,飛機,盧溝橋事變|科技)P(科技)=(2/55)(60/117)(0/117)(117/285)=0
P(歷史|原子彈,飛機,盧溝橋事變)=P(原子彈,飛機,盧溝橋事變|歷史)P(歷史)=(20/168)(23/168)(65/168)(168/285)
上面的例子中,因為某個某個詞的出現概率為0導致屬于某個類別為0,這是不合理的,所以引入拉普拉斯平滑
3 拉普拉斯平滑
為了避免訓練集樣本對一些特征的缺失,即某一些特征出現的次數為0,在計算P(X?1??,X?2??,X?3??,...,X?n??∣Y?i??)的時候,各個概率相乘最終結果為零,這樣就會影響結果。我們需要對這個概率計算公式做一個平滑處理,即拉普拉斯平滑系數
其中m為特征詞向量的個數,α為平滑系數,當α=1,稱為拉普拉斯平滑
4?sklearn樸素貝葉斯實現API
sklearn.naive_bayes.MultinomialNB
sklearn.naive_bayes.MultinomialNB(alpha = 1.0) 樸素貝葉斯分類 alpha:拉普拉斯平滑系數
常用方法:
| 名稱 | 解釋 |
| fit(X y[,sample_weight]) | 根據X y擬合樸素貝葉斯分類器 |
| get_params(deep=) | 獲取此估計器的參數 |
| set_params(PARAMS) | 設置此估計器的參數 |
| partial_fit(X y[,classes,sample_weight]) | 增量擬合一批樣本 |
| predict(X) | 對測試向量X組執行分類 |
| predict_log_proda(X) | 返回測試矢量X的對數概率統計 |
| predict_proda(X) | 測試矢量X的返回概率估計 |
| score(X y[,sample_weight]) | 返回給定測試數據和標簽的平均精度 |
5?樸素貝葉斯算法案例
sklearn20類新聞分類 ,20個新聞組數據集包含20個主題的18000個新聞組帖子
步驟:①加載20類新聞數據,并進行分割
②生成文章特征詞
③樸素貝葉斯estimator流程進行預估
| from sklearn.naive_bayes import MultinomialNB from sklearn.datasets import fetch_20newsgroups from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics import classification_report #1加載20類新聞數據,并進行分割 newsgroups = fetch_20newsgroups(subset='all') #分割 x_train,x_test,y_train,y_test = train_test_split(newsgroups.data,newsgroups.target,test_size=0.25)#2 生成文章特征詞,對數據集進行特征抽取 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) mlt.fit(x_train,y_train) y_predict = mlt.predict(x_test) print("預測的文章類別為",y_predict) score = mlt.score(x_test,y_test) print("準確率為:", score) print("每個類別的精確率,召回率和F1:", classification_report(y_test, y_predict, target_names=newsgroups.target_names)) |
6?樸素貝葉斯分類優缺點
優點: ①樸素貝葉斯模型發源于古典數學理論,有穩定的分類效率。 ②對缺失數據不太敏感,算法也比較簡單,常用于文本分類。 ③分類準確度高,速度快
缺點:需要知道先驗概率P(F1,F2,…|C),因此在某些時候會由于假設的先驗模型的原因導致預測效果不佳。
特點:不需要調參,如果訓練集誤差大,結果肯定不好。
總結
以上是生活随笔為你收集整理的朴素贝叶斯算法-分类算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R语言第八讲 评估模型之交叉验证法分析
- 下一篇: java自动加空格吗_程序加上空格和不加