1. 程式人生 > >Python與機器學習(五)樸素貝葉斯分類

Python與機器學習(五)樸素貝葉斯分類

1.安裝中文分詞器

由於本文是對中文文字進行分類,故需要用到中文分詞器,而結巴分詞則是Python支援較好的一款分詞器。

使用命令安裝:

pip3 install jieba3k

或者下載結巴分詞檔案下載

結巴分詞測試:

結巴分詞支援三種分詞模式:

  • 精確模式,也是結巴分詞的預設模式,可以將句子以最精確的方式分開;
  • 全模式,可以將句子中所有能夠組成詞語的詞分割開來,速度較快,但有些詞語並不正確;
  • 搜尋引擎模式,該模式可以說是對精確模式的加深,即對精確模式產生的長詞進一步分割。

結巴分詞是基於Trie樹結構實現高效的詞圖掃描,採用動態規劃找最大概率路徑,找出基於詞頻的最大切分組合,對於詞典中不存在的詞,則採用基於漢字成詞能力的HMM模型,使用Viterbi演算法。

import jieba
seg = jieba.cut("這裡的櫻花真美麗,還是去武大看櫻花,聽說那裡的電腦科學學院還不錯",cut_all=True)
print('全模式:',"/".join(seg))
seg = jieba.cut("這裡的櫻花真美麗,還是去武大看櫻花,聽說那裡的電腦科學學院還不錯",cut_all=False)
print('精確模式:',"/".join(seg))
seg = jieba.cut_for_search("這裡的櫻花真美麗,還是去武大看櫻花,聽說那裡的電腦科學學院還不錯")
print('搜尋引擎模式:',"/".join(seg))

結巴分詞的分詞方法有兩種形式,一種是cut(),一種是cut_for_search()

cut()方法包含兩個引數,第一個是待切分的字串,第二個是切分的模式,True表示全模式,False表示精確模式

cut_for_search()方式只有一個引數,即待切分的字串

從上圖的輸出可以看出,全模式的分詞結果很多,有的詞還不能成詞,如"科學學"等;精確模式就相對要少很多,而且切分的也比較準確;搜尋引擎模式對精確模式的結果進一步切分,如“電腦科學”就被切分出了“計算”、“科學”等。

當然,結巴分詞除了分詞功能外,還有詞性標註、關鍵詞提取等功能,具體內容可以參考Python結巴分詞

2.樸素貝葉斯概念

概率論是許多機器學習演算法的基礎,前面說到的決策樹也是用概率來判斷資料屬於某一類別。樸素貝葉斯是貝葉斯決策理論的一部分,其分類的整個形式化過程只做最簡單最原始的假設。

貝葉斯決策理論的思想是給定兩個類別資料的統計引數,然後計算另給的資料點分別屬於這兩個類別的概率,選擇最大的概率作為該資料點的分類。

下面先來熟悉一下幾個公式:

先驗概率P(c),是從已有訓練集中計算分類為c類樣本佔總樣本的概率;

條件概率P(x|c),表示已知x在c中,從c中得到x的概率;

貝葉斯準則     

           

如果已知P(x|c),那麼就可以計算出P(c|x),該概率表示樣本x屬於類別c的概率

那麼,當一個樣本中有多個特徵(x1,x2,x3......xn)時,則有:

           

【這裡的每個特徵都是獨立的】

然後根據i個類別的概率大小,選擇概率最大的那個類別

2.樸素貝葉斯優缺點

優點:在資料較少的請胯下仍然有效,可以處理多類別問題;

缺點:對於輸入資料的準備方式較為敏感。

使用資料型別:標稱型資料

3.使用樸素貝葉斯進行文件分類

實驗文字:

negative

positive


#bayes.py
#coding=utf-8
def createVocabList(dataSet):
    vocabSet = set([])  #建立一個空集
    for document in dataSet:
        vocabSet = vocabSet | set(document) #建立兩個空集的並集
    return list(vocabSet)

def setOfWord2Vec(vocabList,inputSet):#詞集模型
    returnVec = [0]*len(vocabList)  #建立一個元素都是0的向量
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] = 1
        else:
            print('the word: %s is not in my Vocabulary!'%word)
    return returnVec

def bagOfWords2VecMN(vocabList,inputSet): #詞袋模型
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] +=1
    return returnVec

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    p0Num = ones(numWords)  #初始化概率
    p1Num = ones(numWords)
    p0Denom = 2.0 
    p1Denom = 2.0
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:
            p1Num += trainMatrix[i]   #向量相加
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = log(p1Num/p1Denom)  #對每個元素做除法
    p0Vect = log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive


def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
    p1 = sum(vec2Classify*p1Vec)+log(pClass1)  #元素對應相乘
    p0 = sum(vec2Classify*p0Vec)+log(1.0-pClass1)
    if p1>p0:
        return 1
    else:
        return 0

def testingNB():
    listOPosts,listClasses = loadDataSet()
    myVocabList = createVocabList(listOPosts)
    trainMat = []
    for postinDoc in listOPosts:
        trainMat.append(setOfWord2Vec(myVocabList, postinDoc))
    p0V,p1V,pAb = trainNB0(array(trainMat), array(listClasses))
    testEntry = ['love','my','dalmation']
    thisDoc = array(setOfWord2Vec(myVocabList, testEntry))
    print(testEntry,' classified as: ',classifyNB(thisDoc, p0V, p1V, pAb))
    testEntry = ['stupid','garbage']
    thisDoc = array(setOfWord2Vec(myVocabList, testEntry))
    print(testEntry,' classified as: ',classifyNB(thisDoc, p0V, p1V, pAb))

def textParse(bigString):
    import re
    import jieba
    listOfTokens = jieba.cut(bigString)
    return [tok for tok in listOfTokens if len(tok)>1]

def spamTest():
    import linecache
    docList = []
    classList = []
    fullText = []
    #linecache.clearcache() 清楚快取,當檔案有變更時
    #file = open('data/negative.txt')
    for i in range(1,26): #匯入並解析文字檔案
        linecache.clearcache()
        string = linecache.getline('data/negative.txt', i)
        wordList = textParse(string)
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(1)
        
        linecache.clearcache()
        string = linecache.getline('data/positive.txt', i)
        wordList = textParse(string)
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)
    
    print(docList)    
    vocabList = createVocabList(docList)
    trainingSet = list(range(50))
    testSet = []
    print(trainingSet)
    for i in range(10): #隨機構建訓練集
        randIndex = int(random.uniform(0,len(trainingSet)))
        print(randIndex)
        testSet.append(trainingSet[randIndex])
        del(trainingSet[randIndex])
        
    trainMat = []
    trainClasses = []
    for docIndex in trainingSet:
        trainMat.append(setOfWord2Vec(vocabList, docList[docIndex]))
        trainClasses.append(classList[docIndex])
    p0V,p1V,pSpam = trainNB0(array(trainMat),array(trainClasses) )
    print(pSpam)
    
    errorCount = 0
    for docIndex in testSet:#對測試集分類
        wordVector = setOfWord2Vec(vocabList, docList[docIndex])
        if classifyNB(array(wordVector), p0V, p1V, pSpam) != classList[docIndex]:
            errorCount += 1
    print('the error rate is : ',float(errorCount)/len(testSet))
    return float(errorCount)/len(testSet)

#test.py
import bayes
rate = 0.0
for i in range(10):
    rate += bayes.spamTest()
print('rate = ',rate/10)

在此進行了10次交叉驗證,由於每次的訓練樣本和測試樣本是隨機選取的,因此計算10次的平均值也有所不同,這裡得到的結果是rate =  0.14。

相關推薦

Python機器學習樸素分類

1.安裝中文分詞器 由於本文是對中文文字進行分類,故需要用到中文分詞器,而結巴分詞則是Python支援較好的一款分詞器。 使用命令安裝: pip3 install jieba3k 或者下載結巴分詞檔案【下載】 結巴分詞測試: 結巴分詞支援三種分詞模式: 精確模式,也是結巴

Python開始機器學習6:樸素分類

樸素貝葉斯分類器是一個以貝葉斯定理為基礎,廣泛應用於情感分類領域的優美分類器。本文我們嘗試使用該分類器來解決上一篇文章中影評態度分類。1、貝葉斯定理假設對於某個資料集,隨機變數C表示樣本為C類的概率,F1表示測試樣本某特徵出現的概率,套用基本貝葉斯公式,則如下所示:上式表示對

python機器學習入門3】樸素2——垃圾郵件分類

參考部落格:樸素貝葉斯基礎篇之言論過濾器 (po主Jack-Cui,《——大部分內容轉載自                   參考書籍:《機器學習實戰》——第四章4.6

OpenCV機器學習1分類器實現程式碼分析

OpenCV的機器學習類定義在ml.hpp檔案中,基礎類是CvStatModel,其他各種分類器從這裡繼承而來。 今天研究CvNormalBayesClassifier分類器。 1.類定義 在ml.hpp中有以下類定義: class CV_EXPORTS_W CvNorm

機器學習 - 樸素- 樸素分類

機器學習 - 樸素貝葉斯(下)- 樸素貝葉斯分類器 樸素貝葉斯 重要假設 特徵型別 樸素貝葉斯分類模型 舉例 貝葉斯估計 模型特點

機器學習 深入淺出-Thomas Bayes

注意:貝葉斯是一個偉大的發明,給人工智慧以及社會發展帶來了巨大貢獻**。 引言        隨著對貝葉斯的不斷應用,對貝葉斯有了從新的認識,以前認為貝葉斯知識用來解決二分類問題,是大錯特錯發現貝葉斯是一種

python機器學習入門3】樸素1——過濾惡意留言

參考部落格:(po主Jack-Cui,《——大部分內容轉載自 參考書籍:《機器學習實戰》——第四章4.5 一 樸素貝葉斯理論 二 demo:過濾網站惡意留言 以線上社群留言為例。為了不影響社群的發展,我們要遮蔽侮辱性的言論,所以要構建一個快速過濾器,如果某

機器學習筆記參考吳恩達機器學習視訊筆記17_分類

17 貝葉斯分類器 貝葉斯分類是一種分類演算法的總稱,這種演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。貝葉斯分類器的分類原理是通過某物件的先驗概率,利用貝葉斯公式計算出其後驗概率,即該物件屬於某一類的概率,選擇具有最大後驗概率的類作為該物件所屬的類。 17.1 貝葉斯

機器學習實戰》基於樸素分類演算法構建文字分類器的Python實現

Python程式碼實現:#encoding:utf-8 from numpy import * #詞表到向量的轉換函式 def loadDataSet(): postingList = [['my','dog','has','flea','problems','help','please'],

機器學習經典演算法之樸素分類

很多人都聽說過貝葉斯原理,在哪聽說過?基本上是在學概率統計的時候知道的。有些人可能會說,我記不住這些概率論的公式,沒關係,我儘量用通俗易懂的語言進行講解。 /*請尊重作者勞動成果,轉載請標明原文連結:*/ /* https://www.cnblogs.com/jpcflyer/p/11069659

機器學習筆記樸素Python程式碼實現

上研究生的時候,一心想讀生物資訊學的方向,由此也選修了生物數學,計算生物學等相關課程。給我印象最深的是給我們計算生物學的主講老師,他北大數學系畢業,後來做起了生物和數學的交叉學科研究。課上講的一些演算法比如貝葉斯,馬爾科夫,EM等把我給深深折磨了一遍。由於那時候

R語言機器學習學習筆記分類演算法3樸素

演算法三:樸素貝葉斯演算法 在貝葉斯決策中,對於先驗概率p(y),分為已知和未知兩種情況。 1. p(y)已知,直接使用貝葉斯公式求後驗概率即可; 2. p(y)未知,可以使用聶曼-皮爾遜決策(N-P決策)來計算決策面。 而最大最小損失規則主要就是使用解決最小損失規則時先驗概率未知或難以計算的問題的

Python Scikit-learn 實現機器學習十大演算法--樸素演算法文末有程式碼

  1,前言 很久不發文章,主要是Copy別人的總感覺有些不爽,所以整理些乾貨,希望相互學習吧。不囉嗦,進入主題吧,本文主要時說的為樸素貝葉斯分類演算法。與邏輯迴歸,決策樹一樣,是較為廣泛使用的有監督分類演算法,簡單且易於理解(號稱十大資料探勘演算法中最簡單的演算法)。但

Python機器學習實戰》讀書筆記——樸素

第四章 基於概率論的分類方法:樸素貝葉斯 4-1 基於貝葉斯決策理論的分類方法 優點:在資料較小的情況下仍然有效,可以處理多類別問題 缺點:對於輸入資料的準備方式較為敏感。 適用資料型別:標稱型資料。 假設現在我們有一個數據集,它由兩類資

Python機器學習:Windows下科學計算環境搭建

【注意:安裝numpy和scipy模組時注意與Python版本保持一致】 1.安裝numpy 測試: 沒有報錯,bingo~ 2.安裝scipy 在官網中下載scipy3.4版本:scipy-0

Python機器學習決策樹

1.決策樹概念: 決策樹經常用於處理分類問題,也是最經常使用的資料探勘演算法。決策樹的一個重要任務是為了資料中所蘊含的知識資訊,並從中提取一系列的規則,而建立這些規則的過程就是機器學習的過程。例如一個典型例子就是根據天氣情況分類星期天是否適合打球。 如果星期天的天氣是晴天

筆記斯坦福機器學習第六講--樸素

span || -h 沒有 height 單純 去除 變量 logistic 本講內容 1. Naive Bayes(樸素貝葉斯) 2.Event models(樸素貝葉斯的事件模型) 3.Neural network (神經網絡) 4.Support vector mac

機器學習讀書筆記樸素基礎篇之網站賬號分類

pan 技巧 nbsp 增強 就是 使用 分類問題 預測 結果 一、條件概率 在學習計算p1和p2概率之前,我們需要了解什麽是條件概率,就是指在事件B發生的情況下,事件A發生的概率,用P(A|B)來表示。 根據文氏圖,可以很清楚地看到在事件B發生的情況下,事件A發

機器學習實戰樸素NBNaive Bayes

目錄 0. 前言 1. 條件概率 2. 樸素貝葉斯(Naive Bayes) 3. 樸素貝葉斯應用於文字分類 4. 實戰案例 4.1. 垃圾郵件分類案例 學習完機器學習實戰的樸素貝葉斯,簡單的做個筆記。文中

[學習筆記]機器學習——演算法及模型演算法

傳統演算法(五) 貝葉斯演算法 一、貝葉斯定理 簡介 貝葉斯定理是18世紀英國數學家托馬斯·貝葉斯(Thomas Bayes)提出得重要概率論理論;貝葉斯方法源於他生前為解決一個“逆概”問題寫的一篇文章