1. 程式人生 > >Python高階--樸素貝葉斯

Python高階--樸素貝葉斯

一、貝葉斯

1)貝葉斯原理

這裡寫圖片描述

這裡寫圖片描述
公式中,事件Bi的概率為P(Bi),事件Bi已發生條件下事件A的概率為P(A│Bi),事件A發生條件下事件Bi的概率為P(Bi│A)。

2)貝葉斯解決的問題

例項一:
我們想預測北京的冬天某一天下雪,當天堵車的概率是多少P(B|A)
A是下雪P(A) = 0.1
B是堵車P(B) = 0.8
如果某一天堵車,下雪的概率是 0.1 P(A|B) = 0.1
P(B|A) = 0.8*0.1/0.1 = 0.8
可以看出下雪天堵車的概率為0.8
例項二:
一座別墅在過去的 20 年裡一共發生過 2 次被盜,
別墅的主人有一條狗,狗平均每週晚上叫 3 次,
在盜賊入侵時狗叫的概率被估計為 0.9,
問題是:在狗叫的時候發生入侵的概率是多少?

A 事件為狗在晚上叫 P(A) = 3/7
B 為盜賊入侵 P(B) = 2 / (20*365)
P(A|B) = 0.9
狗叫了 發生 盜賊 入侵 的 概率 P(B|A) = P(A|B)*P(B)/P(A)
(9/10)*(2/(20*365))/(3/7) = 0.0005753424657534247
可以預測到狗叫了,盜賊入侵的概率

二、樸素貝葉斯原理

1)樸素貝葉斯與貝葉斯的關係

樸素貝葉斯是對貝葉斯的一種簡化
通過引入獨立性假設,從而大大降低了計算量
樸素的概念:獨立性假設,假設各個特徵之間是獨立不相關的

獨立性假設:

一直小狗是母狗與這隻狗是一個泰迪 這兩個假設就相互獨立

非獨立性假設:

庫裡是籃球運動員與 庫裡的投籃很準
這兩個特徵有關係,因為庫裡是籃球運動員,訓練很刻苦,多以投籃很準。

2)實際中主要用於自然語言處理

三、3種貝葉斯模型

1)導包、獲取資料

from sklearn.naive_bayes import GaussianNB,MultinomialNB,BernoulliNB

from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

取前兩列繪圖檢視

data = iris.data[:,:2]  # 所有行 前兩列  特徵值
target = iris.target # 目標值 plt.scatter(data[:,0],data[:,1],c=target)

這裡寫圖片描述

2)高斯分佈樸素貝葉斯

高斯樸素貝葉斯 一般是用來對 符合正態分佈的 資料 進行分類的
這類資料 的分佈 一般是 中間多 周圍少

1、呼叫建構函式 獲取模型 並訓練

gnb = GaussianNB()
gnb.fit(data,target)

2、測試資料

x = np.linspace(data[:,0].min(),data[:,0].max(),100)
y = np.linspace(data[:,1].min(),data[:,1].max(),100)
xx,yy = np.meshgrid(x,y)
X_test = np.c_[xx.flatten(),yy.flatten()]

3、模型預測

y_ =gnb.predict(X_test)

4、預測資料繪圖

# 建立指定點的顏色
from matplotlib.colors import ListedColormap
cmap1 =ListedColormap(['r','g','b'])

plt.scatter(X_test[:,0],X_test[:,1],c=y_)
plt.scatter(data[:,0],data[:,1],c=target,cmap=cmap1)

這裡寫圖片描述

5、簡單看分類的準確率

取所有特徵,並且要 把 資料集 分成 訓練集 和 測試集

#自帶的可以打亂順序並將資料集分成訓練集和測試集
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(data,target,test_size=0.2)
#獲取模型並訓練
gnb = GaussianNB()
gnb.fit(X_train,y_train)
#獲取準確率
gnb.score(X_test,y_test)

0.9666666666666667

3)多項式分佈樸素貝葉斯

適用於文字資料(特徵表示的是次數,例如某個詞語的出現次數)

4)伯努利分佈樸素貝葉斯

適用於伯努利分佈,也適用於文字資料(此時特徵表示的是是否出現,例如某個詞語的出現為1,不出現為0)

絕大多數情況下表現不如多項式分佈,但有的時候伯努利分佈表現得要比多項式分佈要好,尤其是對於小數量級的文字資料

四、文字分類實戰

對簡訊進行二分類,資料為SMSSpamCollection

1)載入資料

import pandas as pd
from pandas import Series,DataFrame
# spam是垃圾郵件 ham是正常郵件
df = pd.read_table('./data/SMSSpamCollection.tsv',header=None)
df   # 最開始的一列不是列索引 header=None

資料處理

data = df[1]  # 內容 (特徵值)
target = df[0]  # 目標值

2)使用機器學習模型 對 郵件進行分類

1、獲取模型

mnb = MultinomialNB()
bnb = BernoulliNB()

2、訓練模型

注意: 不能直接用文字內容去訓練機器學習模型
mnb.fit(data,target) 機器學習模型 肯定無法直接對 文字資訊進行學習
我們需要對文字資訊 進行特徵值抽取
最後是使用文字的特徵值 對 機器學習模型 進行訓練

3、對訓練集處理

from sklearn.feature_extraction.text import TfidfVectorizer

'''
feature_extraction 特徵抽取
text 文字特徵的抽取
Tfidf Vectorizer   詞頻逆文件頻率
Tfidf tf idf
tf term frequency 詞頻 詞語在文章中出現的頻率
idf inverse document frequency 逆文件頻率
Tfidf 其實就是 某個詞在當前文章中出現的頻率/這個詞語在所有文章中出現的頻率
'''

4、建立 詞頻逆文件頻率 抽取文章特徵

tf = TfidfVectorizer()  # 用來抽取文章的特徵
tf.fit(data)  # 對所有內容進行學習
data_tf = tf.transform(data)  #對學習的內容進行特徵抽取

5、訓練資料

使用 抽取特徵後的 資料 對機器學習模型進行 訓練了

mnb.fit(data_tf,target)
bnb.fit(data_tf,target)

6、測試資料

X_test= [
    'I love you',
    'Please call our customer service as you have WON £1000 cash prize!',
    'Dear customer, welcome to the UAE and thank you for choosing du',
    'Congratulations, you won a prize',
    'We will reply to your inquiry within the next two business days.',
    'this is a spam',
    'prize and cash',
    'Sign up to 3Plus for a chance to win your dream trip for two'
]

對測試資料進行處理
這裡可以直接傳入一個列表 列表中是各個文件內容

# 對 測試資料進行 處理
X_test_tf = tf.transform(X_test)

7、測試結果

預測的時候 也是先要把 測試文件的特徵抽取出來 然後 讓機器學習模型去預測

資料量大的情況下 肯定是 多項式樸素貝葉斯更好 (資料量小的情況下 有可能伯努利效果更好 只是可能)

mnb.predict(X_test_tf)

array(['ham', 'spam', 'ham', 'spam', 'ham', 'ham', 'spam', 'ham'],
      dtype='<U4')
bnb.predict(X_test_tf)

array(['ham', 'spam', 'ham', 'ham', 'ham', 'ham', 'ham', 'ham'],
      dtype='<U4')

五、垃圾郵件分類

對email進行二分類,兩種郵件分別在ham和spam目錄下

1)資料讀取

1、先嚐試讀取一個

file_path = './data/email/ham/1.txt'
open(file_path).read()

'Hi Peter,\n\nWith Jose out of town, do you want to\nmeet once in a while to keep things\ngoing and do some interesting stuff?\n\nLet me know\nEugene'

2、將25個檔案都讀取

讀取ham中的所有檔案

ham = []
# ham 目錄下的25個都讀取
for i in range(1,26):
    file_path = './data/email/ham/%d.txt'%(i)
    # print(file_path)
    data = open(file_path,encoding='gbk',errors='ignore').read()
    ham.append([data,'ham'])
df1 = DataFrame(ham)

讀取spam 中的所有檔案

spam = []
# spam 目錄下的25個都讀取
for i in range(1,26):
    file_path = './data/email/spam/%d.txt'%(i)
    # print(file_path)
    data = open(file_path,encoding='gbk',errors='ignore').read()
    spam.append([data,'spam'])

df2 = DataFrame(spam)

將兩個DataFrame合併起來

df = pd.concat([df1,df2])

2)資料處理

1、先對資料整體 進行 抽取特徵

tf = TfidfVectorizer() # 呼叫建構函式 獲取模型

tf.fit(df[0]) #使用模型對資料進行獲取
tf.transform(df[0])  # 對資料進行轉換

訓練個轉換同時進行

data_tf = tf.fit_transform(df[0])  # 如果 訓練 和 轉換 用的是一個數據集 直接使用fit_transform即可

3)分離訓練資料和測試資料

X_train, X_test, y_train, y_test = train_test_split(data_tf,df[1],test_size=0.25)

# 特徵值是 data_tf 也就是 抽取了特徵後的文字資訊
# 目標值是 df裡1那一列 也就是 標記的 ham和spam
# test_size是切分的比列

4)使用機器學習模型訓練

多項式分佈樸素貝葉斯

mnb = MultinomialNB()  #獲取模型
mnb.fit(X_train,y_train)  #訓練模型
mnb.score(X_test,y_test)  # 查看準確立率

0.9230769230769231

伯努利分佈樸素貝葉斯

bnb = BernoulliNB()
bnb.fit(X_train,y_train)
bnb.score(X_test,y_test)

0.9230769230769231

相關推薦

Python高階--樸素

一、貝葉斯 1)貝葉斯原理 公式中,事件Bi的概率為P(Bi),事件Bi已發生條件下事件A的概率為P(A│Bi),事件A發生條件下事件Bi的概率為P(Bi│A)。 2)貝葉斯解決的問題 例項一: 我們想預測北京的冬天某一天下雪,當天堵車

Python 實現樸素 MNIST資料集

Python實現樸素貝葉斯演算法 樸素貝葉斯是機器學習的一種演算法,之所以成為樸素,是因為它的想法“簡單”,簡單地認為樣本中所有的特徵都無關,即P(AB) = P(A)P(B)。所以,有 P(y|xi) = P(y)P(x0 = xi0|y)P(x1 = xi1|y)P(x2 = x

【機器學習實踐】用Python實現樸素分類器

       閱讀學習了《機器學習》第7章的貝葉斯分類器後,為了加深理解和加強python的程式碼能力,因此嘗試使用Python實現樸素貝葉斯分類器,由於初學Python的緣故,程式碼的一些實現方法可能比較繁瑣,可閱讀性有待提高。程式碼如下: #import numpy a

Python實現樸素演算法 --- 過濾垃圾郵件

# -*- coding:utf-8 -*- import numpy as np import random import re __author__ = 'yangxin' """ 過濾垃圾郵件 """ class FilterSpam(object): #

Python--基於樸素演算法的情感分類

環境 win8, python3.7, jupyter notebook 正文 什麼是情感分析?(以下引用百度百科定義) 情感分析(Sentiment analysis),又稱傾向性分析,意見抽取(Opinion extraction),意見挖掘(Opinion mining),情感挖掘(Sentiment

Python利用樸素進行評分的分類

利用樸素貝葉斯可以對文件進行分類,比如說進行垃圾郵件的過濾等接下來的案例是對評分進行分類的,經過學習判斷一句話應該屬於幾分,0-5分之間。 先利用爬蟲爬取樣本資料,該資料來自公開課的評論。 # coding=utf-8 import urllib2 from sgmllib impo

python樸素程式碼的實現

程式碼主要參考機器學習實戰那本書,發現最近老外的書確實比中國人寫的好,由淺入深,程式碼通俗易懂,不多說上程式碼: #encoding:utf-8 ''' Created on 2015年9月6日 @author: ZHOUMEIXU204 樸素貝葉斯實現過程 '''

機器學習及python實現——樸素分類器

問題引入 考慮構建一個垃圾郵件分類器,通過給定的垃圾郵件和非垃圾郵件的資料集,通過機器學習構建一個預測一個新的郵件是否是垃圾郵件的分類器。郵件分類器是通常的文字分類器中的一種。 樸素貝葉斯方法 貝葉斯假設 假設當前我們已經擁有了一批標識有是垃圾郵

Python實現樸素(NB)

      這篇文章主要關於樸素貝葉斯演算法的用python具體實現,網上關於NB演算法的文章很多,大多圍繞著《機器學習實戰》這本書來著。在此,對於NB演算法的原理我大概介紹一下。 貝葉斯定理:     已知某條件概率,如何得到兩個條件交換後的概率。即:已知 求 假設

Python實現樸素分類器

# -*-coding:utf-8-*- '''     樸素貝葉斯演算法 ''' from __future__ import division  global className className = "class" def calc_class(trai

Python實現樸素演算法 --- 遮蔽社群留言板的侮辱性言論

# -*- coding:utf-8 -*- import numpy as np __author__ = 'yangxin' """ 貝葉斯公式 p(xy)=p(x|y)p(y)=p(y|x)p(x) p(x|y)=p(y|x)p(x)/p(y) """ """ 遮蔽社

樸素分類算法介紹及python代碼實現案例

urn bus 人的 元素 1.2 -s index 代碼 步驟 樸素貝葉斯分類算法 1、樸素貝葉斯分類算法原理 1.1、概述 貝葉斯分類算法是一大類分類算法的總稱 貝葉斯分類算法以樣本可能屬於某類的概率來作為分類依據 樸素貝葉斯分類算法是貝葉斯分類算法中最簡單的一種 註:

樸素算法的python實現 -- 機器學習實戰

cut ocl add set 分類器 觀察 problem enc 兩個 1 import numpy as np 2 import re 3 4 #詞表到向量的轉換函數 5 def loadDataSet(): 6 postingLi

【黎明傳數==>機器學習速成寶典】模型篇05——樸素【Naive Bayes】(附python代碼)

pytho res tex 機器學習 樸素貝葉斯 spa 什麽 之一 類別 目錄   先驗概率與後驗概率   什麽是樸素貝葉斯   模型的三個基本要素   構造kd樹   kd樹的最近鄰搜索   kd樹的k近鄰搜索   Python代碼(sklearn庫) 先

【Spark MLlib速成寶典】模型篇04樸素【Naive Bayes】(Python版)

width pla evaluate 特征 mem order 一個數 ble same 目錄   樸素貝葉斯原理   樸素貝葉斯代碼(Spark Python) 樸素貝葉斯原理   詳見博文:http://www.cnblogs.com/itmor

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

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

樸素python小樣本實例

else take dataset 核心 inpu lis def hle 模型 樸素貝葉斯優點:在數據較少的情況下仍然有效,可以處理多類別問題缺點:對於輸入數據的準備方式較為敏感適用數據類型:標稱型數據樸素貝葉斯決策理論的核心思想:選擇具有最高概率的決策樸素貝葉斯的一般過

樸素算法簡介及python代碼實現分析

匯總 cti rate append avg pop one data number 概念:   貝葉斯定理:貝葉斯理論是以18世紀的一位神學家托馬斯.貝葉斯(Thomas Bayes)命名。通常,事件A在事件B(發生)的條件下的概率,與事件B在事件A(發生)的條件

小白python學習——機器學習篇——樸素演算法

一.大概思路: 1.找出資料集合,所有一個單詞的集合,不重複,各個文件。 2.把每個文件換成0,1模型,出現的是1,就可以得到矩陣長度一樣的各個文件。 3.計算出3個概率,一是侮辱性的文件概率,二是侮辱性文件中各個詞出現的概率,三是非侮辱性文件中各個詞出現的概率。 4.二、三計算方法

樸素Python實現)

這篇文章是《機器學習實戰》(Machine Learning in Action)第四章 基於概率論的分類方法:樸素貝葉斯演算法的Python實現程式碼。 1 參考連結 機器學習實戰 2 實現程式碼 from numpy import * import feedpa