1. 程式人生 > >sklearn+python:樸素貝葉斯及文字分類

sklearn+python:樸素貝葉斯及文字分類

樸素貝葉斯

貝葉斯定理用來計算條件概率,即:

image

然後進行一種樸素(naive)的假設-每對特徵之間都相互獨立:

image

在給定的輸入中 P(x_1, \dots, x_n) 是一個常量,我們使用下面的分類規則:

image

可以使用最大後驗概率(Maximum A Posteriori, MAP) 來估計 P(y) 和 P(x_i | y) ; 前者是訓練集中類別 y 的相對頻率。

各種各樣的的樸素貝葉斯分類器的差異大部分來自於處理 P(x_i | y) 分佈時的所做的假設不同。

P(x_i | y)在有足夠多資料時,也可以從資料集中統計出來,或者使用各種分佈模型估計。

概率分佈

描述連續隨機變數概率分佈的函式稱為概率密度函式

。典型的概率密度函式是高斯分佈函式。

描述離散隨機變數概率分佈的函式叫概率質量函式。典型的概率質量函式是多項式分佈函式。可用於文字分類或者垃圾郵件檢測。

這兩種分佈函式統稱為概率分佈函式

伯努利高斯和多項式分佈類似,但是它明確地懲罰類 y 中沒有出現作為預測因子的特徵 i ,而多項分佈分佈樸素貝葉斯只是簡單地忽略沒出現的特徵。在文字分類的例子中,詞頻向量(word occurrence vectors)的 BernoulliNB 可能在一些資料集上可能表現得更好,特別是那些更短的文件。 如果時間允許,建議對兩個模型都進行評估。

程式碼:使用多項式分佈的樸素貝葉斯進行文字分類

from time
import time from sklearn.datasets import load_files from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix # 步驟1:載入新聞語料文件 print("loading train dataset ..."
) t = time() # load file 專門用於載入分類的文件,每個分類一個單獨的目錄,目錄名就是類名 news_train = load_files('D:/專案/機器學習和機器視覺/scikit-learn機器學習-原始碼/code/datasets/mlcomp/379/train') print("summary: {0} documents in {1} categories.".format( len(news_train.data), len(news_train.target_names))) # news_train.target是長度為13180的一維向量,每個值代表相應文章的分類id print('news_categories_names:\n{}, \nlen(target):{}, target:{}'.format(news_train.target_names, len(news_train.target), news_train.target)) print("done in {0} seconds\n".format(round(time() - t, 2))) # 步驟2:將文件資料轉化為TF-IDF向量 print("vectorizing train dataset ...") t = time() vectorizer = TfidfVectorizer(encoding='latin-1') X_train = vectorizer.fit_transform((d for d in news_train.data)) print("n_samples: %d, n_features: %d" % X_train.shape) # X_train每一行代表一篇文件,每個成員表示一個詞的TF-IDF值,表示這個詞對這個文章的重要性。 # X_train的形狀是13180X130274 print("number of non-zero features in sample [{0}]: {1}".format( news_train.filenames[0], X_train[0].getnnz())) print("done in {0} seconds\n".format(round(time() - t, 2))) # 步驟3:使用多項式分佈的樸素貝葉斯演算法訓練 print("traning models ...".format(time() - t)) t = time() y_train = news_train.target clf = MultinomialNB(alpha=0.0001) clf.fit(X_train, y_train) train_score = clf.score(X_train, y_train) print("train score: {0}".format(train_score)) print("done in {0} seconds\n".format(round(time() - t, 2))) # 步驟4:載入測試資料集 print("loading test dataset ...") t = time() news_test = load_files('D:/專案/機器學習和機器視覺/scikit-learn機器學習-原始碼/code/datasets/mlcomp/379/test') print("summary: {0} documents in {1} categories.".format( len(news_test.data), len(news_test.target_names))) print("done in {0} seconds\n".format(round(time() - t, 2))) # 步驟5:把測試資料集向量化 print("vectorizing test dataset ...") t = time() # 注意這裡呼叫的是transform而非上面的fit_transform。因為上面已經把資料統計好了 X_test = vectorizer.transform((d for d in news_test.data)) y_test = news_test.target print("n_samples: %d, n_features: %d" % X_test.shape) print("number of non-zero features in sample [{0}]: {1}".format( news_test.filenames[0], X_test[0].getnnz())) print("done in %fs\n" % (time() - t)) # 步驟6:使用測試資料集測試。測試第一篇文章 print("predict for {} ...".format(news_test.filenames[0])) pred = clf.predict(X_test[0]) print("predict: {0} is in category {1}".format( news_test.filenames[0], news_test.target_names[pred[0]])) print("actually: {0} is in category {1}\n".format( news_test.filenames[0], news_test.target_names[news_test.target[0]])) # 步驟7:評估演算法的預測效果 print("predicting test dataset ...") t = time() pred = clf.predict(X_test) print("done in %fs" % (time() - t)) print("classification report on test set for classifier:") print(clf) print(classification_report(y_test, pred, target_names=news_test.target_names)) # 步驟8:生成混淆矩陣 cm = confusion_matrix(y_test, pred) print("confusion matrix:") print(cm)

輸出為:

loading train dataset ...
summary: 13180 documents in 20 categories.
news_categories_names:
['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles', 'rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt', 'sci.electronics', 'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns', 'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc'], 
len(target):13180, target:[18 13  1 ... 14 15  4]
done in 1.97 seconds

vectorizing train dataset ...
n_samples: 13180, n_features: 130274
number of non-zero features in sample [D:/專案/機器學習和機器視覺/scikit-learn機器學習-原始碼/code/datasets/mlcomp/379/train\talk.politics.misc\17860-178992]: 108
done in 5.35 seconds

traning models ...
train score: 0.9978755690440061
done in 0.37 seconds

loading test dataset ...
summary: 5648 documents in 20 categories.
done in 0.86 seconds

vectorizing test dataset ...
n_samples: 5648, n_features: 130274
number of non-zero features in sample [D:/專案/機器學習和機器視覺/scikit-learn機器學習-原始碼/code/datasets/mlcomp/379/test\rec.autos\7429-103268]: 61
done in 2.129905s

predict for D:/專案/機器學習和機器視覺/scikit-learn機器學習-原始碼/code/datasets/mlcomp/379/test\rec.autos\7429-103268 ...
predict: D:/專案/機器學習和機器視覺/scikit-learn機器學習-原始碼/code/datasets/mlcomp/379/test\rec.autos\7429-103268 is in category rec.autos
actually: D:/專案/機器學習和機器視覺/scikit-learn機器學習-原始碼/code/datasets/mlcomp/379/test\rec.autos\7429-103268 is in category rec.autos

predicting test dataset ...
done in 0.041888s
classification report on test set for classifier:
MultinomialNB(alpha=0.0001, class_prior=None, fit_prior=True)
                          precision    recall  f1-score   support

             alt.atheism       0.90      0.91      0.91       245
           comp.graphics       0.80      0.90      0.85       298
 comp.os.ms-windows.misc       0.82      0.79      0.80       292
comp.sys.ibm.pc.hardware       0.81      0.80      0.81       301
   comp.sys.mac.hardware       0.90      0.91      0.91       256
          comp.windows.x       0.88      0.88      0.88       297
            misc.forsale       0.87      0.81      0.84       290
               rec.autos       0.92      0.93      0.92       324
         rec.motorcycles       0.96      0.96      0.96       294
      rec.sport.baseball       0.97      0.94      0.96       315
        rec.sport.hockey       0.96      0.99      0.98       302
               sci.crypt       0.95      0.96      0.95       297
         sci.electronics       0.91      0.85      0.88       313
                 sci.med       0.96      0.96      0.96       277
               sci.space       0.94      0.97      0.96       305
  soc.religion.christian       0.93      0.96      0.94       293
      talk.politics.guns       0.91      0.96      0.93       246
   talk.politics.mideast       0.96      0.98      0.97       296
      talk.politics.misc       0.90      0.90      0.90       236
      talk.religion.misc       0.89      0.78      0.83       171

             avg / total       0.91      0.91      0.91      5648

confusion matrix:
[[224   0   0   0   0   0   0   0   0   0   0   0   0   0   2   5   0   0   1  13]
 [  1 267   5   5   2   8   1   1   0   0   0   2   3   2   1   0   0   0   0   0]
 [  1  13 230  24   4  10   5   0   0   0   0   1   2   1   0   0   0   0   1   0]
 [  0   9  21 242   7   2  10   1   0   0   1   1   7   0   0   0   0   0   0   0]
 [  0   1   5   5 233   2   2   2   1   0   0   3   1   0   1   0   0   0   0   0]
 [  0  20   6   3   1 260   0   0   0   2   0   1   0   0   2   0   2   0   0   0]
 [  0   2   5  12   3   1 235  10   2   3   1   0   7   0   2   0   2   1   4   0]
 [  0   1   0   0   1   0   8 300   4   1   0   0   1   2   3   0   2   0   1   0]
 [  0   1   0   0   0   2   2   3 283   0   0   0   1   0   0   0   0   0   1   1]
 [  0   1   1   0   1   2   1   2   0 297   8   1   0   1   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   2   2 298   0   0   0   0   0   0   0   0   0]
 [  0   1   2   0   0   1   1   0   0   0   0 284   2   1   0   0   2   1   2   0]
 [  0  11   3   5   4   2   4   5   1   1   0   4 266   1   4   0   1   0   1   0]
 [  1   1   0   1   0   2   1   0   0   0   0   0   1 266   2   1   0   0   1   0]
 [  0   3   0   0   1   1   0   0   0   0   0   1   0   1 296   0   1   0   1   0]
 [  3   1   0   1   0   0   0   0   0   0   1   0   0   2   1 280   0   1   1   2]
 [  1   0   2   0   0   0   0   0   1   0   0   0   0   0   0   0 236   1   4   1]
 [  1   0   0   0   0   1   0   0   0   0   0   0   0   0   0   3   0 290   1   0]
 [  2   1   0   0   1   1   0   1   0   0   0   0   0   0   0   1  10   7  212  0]
 [ 16   0   0   0   0   0   0   0   0   0   0   0   0   0   0  12   4   1   4 134]]

相關推薦

sklearn+python:樸素文字分類

樸素貝葉斯 貝葉斯定理用來計算條件概率,即: 然後進行一種樸素(naive)的假設-每對特徵之間都相互獨立: 在給定的輸入中 P(x_1, \dots, x_n) 是一個常量,我們使用下面的分類規則: 可以使用最大後驗概率(Maximum A

sklearn——樸素文字分類2

使用sklearn中的tf-idf向量選擇器對向量進行選擇,是一個特徵選擇的過程 程式碼: # 從sklearn.feature_extraction.text裡分別匯入TfidfVectorizer。 from sklearn.feature_extraction.tex

(三)樸素運用——文字分類

1、貝葉斯理論 當我們有樣本(包含特徵和類別)的時候,我們非常容易通過 p(x)p(y|x)=p(y)p(x|y) p ( x

jieba和樸素實現文字分類

#盜取男票年輕時候的程式碼,現在全給我教學使用了,感恩臉#分類文件為多個資料夾 資料夾是以類別名命名 內含多個單個文件#coding: utf-8 from __future__ import print_function, unicode_literals import

基於的樸素文字分類(附完整程式碼(spark/java)

本文主要包括以下內容: 1)模型訓練資料生成(demo) 2 ) 模型訓練(spark+java),資料儲存在hdfs上 3)預測資料生成(demo) 4)使用生成的模型進行文字分類。 一、訓練資料生成 spark mllib模型訓練的輸入資料格

(資料探勘-入門-8)基於樸素文字分類

主要內容: 1、動機 2、基於樸素貝葉斯的文字分類器 3、python實現 一、動機 之前介紹的樸素貝葉斯分類器所使用的都是結構化的資料集,即每行代表一個樣本,每列代表一個特徵屬性。 但在實際中,尤其是網頁中,爬蟲所採集到的資料都是非結構化的,如新聞、微博、帖子等,如果要對對這一類資料進行分類,應該怎麼辦

樸素】實戰樸素_文字分類

【文字分類】 文字分類是經典的NLP問題,就是把一個文字自動分到若干個類別之一當中。類別可以是政治、經濟、女性、財經等,既可以用字串形式表示,也可以內部用整數形式來表示。對於我的文字過濾問題,則類別只有兩個:不應該過濾 和 應該過濾。接下來是文字表示問題,即用什麼量來代表一

機器學習基礎——帶你實戰樸素模型文字分類

本文始發於個人公眾號:TechFlow 上一篇文章當中我們介紹了樸素貝葉斯模型的基本原理。 樸素貝葉斯的核心本質是假設樣本當中的變數服從某個分佈,從而利用條件概率計算出樣本屬於某個類別的概率。一般來說一個樣本往往會含有許多特徵,這些特徵之間很有可能是有相關性的。為了簡化模型,樸素貝葉斯模型假設這些變數是獨

資料探勘入門系列教程(七)之樸素進行文字分類

資料探勘入門系列教程(七)之樸素貝葉斯進行文字分類 貝葉斯分類演算法是一類分類演算法的總和,均以貝葉斯定理為基礎,故稱之為貝葉斯分類。而樸素貝葉斯分類演算法就是其中最簡單的分類演算法。 樸素貝葉斯分類演算法 樸素貝葉斯分類演算法很簡單很簡單,就一個公式如下所示: P(B|A) = \frac{P(A|B) P

pythonsklearn樸素方法(sklearn.naive_bayes.GaussianNB)的簡單使用

#測試資料 import numpy as np features_train = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3

機器學習之路: python 樸素分類器 預測新聞類別

groups group news ckey put epo test electron final 使用python3 學習樸素貝葉斯分類api 設計到字符串提取特征向量 歡迎來到我的git下載源代碼: https://github.com/linyi0604/kag

機器學習實踐(九)—sklearn樸素演算法

一、樸素貝葉斯演算法 什麼是樸素貝葉斯分類方法 屬於哪個類別概率大,就判斷屬於哪個類別 概率基礎 概率定義為一件事情發生的可能性 P(X) : 取值在[0, 1] 聯合概率、條件概率與相互獨立

情感分析背後的樸素實現基於評論語料庫的影評情感分析(附程式碼)

一.情感分析的介紹       一句話概括情感分析:判斷出一句評價/點評/影評的正/負傾向性;       情感分析是一個二分類的問題,一種是可以直接判斷正負,一種是可以判斷情感偏向正負性的一個打分; 二,詞袋模型(向量空間模型) 2.1情感分析的流程    中文分

python樸素實現-2

本文主要內容: 1. 樸素貝葉斯為何需要特徵條件獨立 2. 樸素貝葉斯三種模型: 特徵是離散的時候,使用多項式模型 特徵是連續變數的時候,應該採用高斯模型 特徵的取值只能是1和0伯努利模型) 3. 多項式模型的python實現 樸

Python 樸素分類

def loadDataSet(): postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], ['maybe', 'not', 'take', 'him', '

python樸素實現-1( 定理,全概率公式 )

樸素貝葉斯 (naive Bayes) 法是基於貝葉斯定理與特徵條件獨立假設的分類方法。 在研究樸素貝葉斯 之前,先回顧下:概率論中的條件概率以及貝葉斯定理。 本部分內容基本來源於 盛驟, 謝

【演算法】樸素法之分類演算法

樸素貝葉斯法之分類演算法 說明         本文只是對於樸素貝葉斯法的其中的一個分類演算法的學習。參考來源《統計學習方法》。 一、 輸入 訓練資料 T={(x1,y1),(x2,y2),...(

樸素演算法實現分類以及Matlab實現

開始 其實在學習機器學習的一些演算法,最近也一直在看這方面的東西,並且嘗試著使用Matlab進行一些演算法的實現。這幾天一直在看得就是貝葉斯演算法實現一個分類問題。大概經過了一下這個過程: 看書→演算法公式推演→網上查詢資料→進一步理解→蒐集資料集開始嘗

樸素演算法實現分類問題(三類)matlab程式碼

資料簡介 本訓練資料共有625個訓練樣例,每個樣例有4個屬性x1,x2,x3,x4,每個屬性值可以取值{1,2,3,4,5}。 資料集中的每個樣例都有標籤"L","B"或"R"。 我們在這裡序號末尾為1的樣本當作測試集,共有63個,其他的作為訓練集,共有562個。 下