(數據科學學習手札30)樸素貝葉斯分類器的原理詳解Python與R實現

一、簡介

  要介紹樸素貝葉斯(naive bayes)分類器,就不得不先介紹貝葉斯決策論的相關理論:

  貝葉斯決策論(bayesian decision theory)是概率框架下實施決策的基本方法。對分類任務來說,在所有相關概率都已知的理想情況下,貝葉斯決策論考慮如何基于這些概率和誤判損失來選擇最優的類別標記結果。

 

二、貝葉斯決策論的基本原理

  我們以多分類任務為例:

  假設有N種可能的類別標記,即y={c1,c2,...,cN},λij是將一個真實類別為cj的樣本誤分類為ci的損失,基于后驗概率P(ci|cj)可獲得將樣本x分類為ci所產生的期望損失(expected loss),即在樣本x上的“條件風險”(conditional risk)

  我們的目的是尋得一個判定準則h:X-->Y,以最小化總體風險:

  對每一個樣本x,若h能最小化條件風險

則總體風險R(h)也將被最小化,這就產生了貝葉斯判定準則(Bayes decision rule):為最小化總體風險,只需要在每個樣本上選擇能使條件風險R(c|x)最小的類別標記,即

h*被稱作貝葉斯最優分類器(Bayes optimal classifier),與之對應的總體風險R(h*)稱為貝葉斯風險(Bayes risk)。1-R(h*)反映了分類器所能達到的最佳性能,即通過機器學習所能達到的模型精度的理論上限。

  若目標是最小化分類錯誤率,則誤判損失λij可寫作

此時的條件風險

于是,最小化分類錯誤率的貝葉斯最優分類器為:

  即對每個樣本x,選擇使得后驗概率P(c|x)最大的類別標記,所以利用貝葉斯判定準則來最小化決策風險的首要工作是求得后驗概率P(c|x),這在現實任務中通常難以直接獲得,而機器學習所要實現的是基于有限的訓練樣本集來盡可能準確地估計后驗概率,主要有兩種策略:

  1、“判定式模型”(discriminative model)

  給定x,通過直接對P(c|x)建模來預測c;

  2、“生成式模型”(generative model)

  對聯合概率分布P(x,c)建模,然后再由此獲得P(c|x);

貝葉斯分類器便是一種生成式模型,對生成式模型,考慮條件概率公式:

基于貝葉斯定理,P(c|x)可寫為:

其中,P(c)是類先驗概率(prior);P(x|c)是樣本x對應類別c的類條件概率(class-condtional probability),或稱為“似然”(likelihood);P(x)是用于歸一化的“證據”(evidence)因子。對給定樣本x,證據因子P(x)與類別無關,因此估計P(c|x)的問題就轉化為如何基于訓練數據D來估計P(c)和似然P(x|c),類先驗概率P(c)表達了樣本空間中各類樣本所占的比例,根據大數定律,當樣本數據規模足夠大時,就可以用樣本數據的各類別出現的頻率來估計P(c)。

  上述過程雖然看起來很簡單,但是應用到現實任務中就會遇到很多局限,對類條件概率P(x|c),由于它涉及所有關于x的屬性的聯合概率,直接根據樣本出現的頻率來估計將會遇到困難,因為實際任務中的訓練樣本集是有限的,而要估計聯合分布就需要獲得各種可能狀態的樣本,這顯然無法辦到,因為自變量各個維度上的組合方式是指數式增長的,遠遠大于樣本數量,導致很多可能的樣本取值從未在訓練集中出現過,所以直接用頻率來估計P(x|c)不可行,因為這樣會直接把未出現過與概率為0畫上等號。

  為了克服貝葉斯分類器中的局限,我們基于更寬松的理論條件構建出樸素貝葉斯分類器;

?

三、樸素貝葉斯分類器

  為了避開貝葉斯公式的訓練障礙,樸素貝葉斯分類器采用了“屬性條件獨立性假設”(attribute conditional independence assumption),即對已知類別,假設所有屬性相互獨立,即每個屬性各自獨立地對分類結果產生影響,則我們前面提到的貝葉斯公式:

其中d表示屬性的個數,xi表示x在第i個屬性上的取值,又因為P(x)由樣本集唯一確定,即對所有類別P(x)都相同,于是樸素貝葉斯分類器的表達式:

  樸素貝葉斯分類器的訓練過程就是基于訓練集D來估計類先驗概率P(c),并為每個屬性估計條件概率P(xi|c),用Dc表示訓練集D中第c類樣本組成的集合,若有充足的獨立同分布樣本,則可以容易地估計出類先驗概率:

對離散屬性而言,令Dc,xi表示Dc中在第i個屬性上取值為xi的樣本組成的集合,則條件概率P(xi|c)為:

  對連續型屬性,假定:

其中μc,i,σ2c,i分別為第c類樣本在屬性i上的均值與方差(這里要假設對應的連續型變量服從正態分布),則:

  下面以一個簡單的例子來詳細說明這個過程:

  對給定的訓練集D,以類別c{c=1/0}作為分類目標,對所有在訓練集出現過的屬性xi屬于X,依此進行下列計算(估計):

  1、類先驗概率P(c)

  2、各屬性的條件概率

  以x1為例:

?

  若xi為連續型變量,則利用不同類別中該屬性的樣本均值與樣本方差來估計真實的不同類別中該屬性的正態分布對應的參數,求出對應的密度函數;計算出所有屬性對所有可能的類別的條件概率;

  3、對樣本進行分類

  針對我們所舉的例子,有如下兩種情況:

取其中結果較大者對應類別作為最終對樣本的分類結果。

修正情況:

  有些時候,若某個屬性值在訓練集中沒有與某個類同時出現過,則直接使用上述過程估計后驗概率會將整個結果拖累至0,因此這種情況下我們進行如下處理:

平滑(smoothing)

  為了避免上面描述的,樣本的其他屬性攜帶的信息被訓練集中未出現過的屬性抹去,則在估計概率值的時候要進行“平滑”處理,常用“拉普拉斯修正”(Laplacian correction),具體操作如下:

  我們用N表示訓練集D中可能的類別數,Ni表示第i個屬性可能的取值個數,則:

這種修正方法避免了因訓練集樣本不充分而導致概率估值為0的問題,并且在訓練集變大時,修正過程所引入的先驗(prior)的影響也會逐漸變得可以忽略,使得估值漸漸趨向于實際概率值。

現實中的使用方式:

  1、任務對預測速度要求較高時

  可以事先將樣本中所有先驗概率和類條件概率計算好并儲存起來,等到需要預測新樣本類別時查表計算對應的后驗概率即可;

  2、任務數據更替頻繁時

  可采用“懶惰學習”(lazy learning)的方式,先不進行任何事先訓練,僅在有預測需求時才根據當前樣本進行概率估計與預測;

  3、數據不斷增加時

  若數據不斷增加,則可在現有概率估值的基礎上,僅對新增樣本的屬性值所涉及的概率估值進行修正即可實現增量學習(在線學習);

?

四、Python實現

  我們使用sklearn.naive_bayes中的GaussianNB()來進行樸素貝葉斯分類,這種方法基于的就是我們前面提到的假設非類別型的連續數值變量服從正態分布即高斯分布,其參數非常簡單(因為整個建模過程沒有什么需要調參數的地方)如下:

priors:數組型,控制針對各類別比例的先驗分布,若本參數有輸入,則接下來的先驗分布將不再基于樣本集進行計算;

函數輸出項:

class_prior_:輸出基于樣本集計算出的各類別的先驗分布

class_count_:輸出訓練集中各個類別的樣本數量

theta_:輸出計算出的對應各連續型特征各類別的樣本均值

sigma_:輸出計算出的對應各連續型特征各類別的樣本方差

下面以我們喜聞樂見的鳶尾花數據進行演示:

from sklearn.naive_bayes import GaussianNB
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix'''載入數據'''
X,y = datasets.load_iris(return_X_y=True)'''分割訓練集與驗證集,這里采用分層抽樣的方法控制類別的先驗概率'''
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,stratify=y)'''初始化高斯樸素貝葉斯分類器'''
clf = GaussianNB()'''訓練分類器'''
clf = clf.fit(X_train,y_train)'''打印分類器在驗證集上的混淆矩陣'''
print('混淆矩陣:')
print(confusion_matrix(y_test,clf.predict(X_test)))'''打印測試集上的正確率'''
print('測試集正確率:'+str(clf.score(X_test,y_test)))'''打印分類器訓練后的各返回項'''
print('類別的先驗分布:',clf.class_prior_)print('各類別樣本數量:',clf.class_count_)print('各類別對應各連續屬性的正態分布的均值:','\n',clf.theta_)print('各類別對應各連續屬性的正態分布的方差:','\n',clf.sigma_)

運行結果:

?

?

五、R實現

  在R中有很多包支持樸素貝葉斯分類(事實上自己寫自編函數實現也不是件難事),這里選用比較有代表性的e1071包中的naiveBayes()來完成相應功能,其主要參數如下:

formula:這時R中常見的一種格式,類別標簽~自變量 的輸入形式

data:指定訓練數據所在的數據框

laplace:控制前面提到的平滑處理中的拉普拉斯修正,默認值為0,即不進行平滑,若需要進行拉普拉斯修正,這里建議值為1

下面是一個簡單的演示:

> rm(list=ls())
> library(e1071)
> data(iris)
> 
> #留出法分割訓練集與驗證集
> sam <- sample(1:dim(iris)[1],dim(iris)[1]*0.8)
> X_train <- iris[sam,1:4]
> y_train <- iris[sam,5]
> X_test <- iris[-sam,1:4]
> y_test <- iris[-sam,5]
> train <- cbind(y_train,X_train)
> 
> #利用訓練集訓練樸素貝葉斯分類器
> clf <- naiveBayes(y_train~.,data=train)
> 
> #混淆矩陣
> table(y_test,predict(clf,X_test))y_test       setosa versicolor virginicasetosa          9          0         0versicolor      0          7         1virginica       0          0        13
> 
> #測試正確率
> sum(diag(prop.table(table(y_test,predict(clf,X_test)))))
[1] 0.9666667

?

  以上就是關于樸素貝葉斯的基本內容,其實樸素貝葉斯方法運用最多的是文本分類問題,接下來的幾篇博客我將圍繞樸素貝葉斯的文本分類方法進行詳細介紹(包含網絡文本數據采集的過程)

?

轉載于:https://www.cnblogs.com/feffery/p/8954959.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250362.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250362.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250362.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【技術累積】【點】【java】【29】MapUtils

內容 是Apache組織下的commons-collections包中的工具類<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.1</version></dependency> Map操作相關的&#xff0c…

css --- [讀書筆記] 盒模型(邊框、內外邊距)

說明 源代碼學習 盒子模型(css重點) css學習三大重點: css盒子模型、 浮動、 定位 目標: 能說出盒子模型由哪四部分組成: 內容、邊框、內外邊距能說出內邊距的作用,設置不同數值分別代表的意思: 控制內部塊級元素和寬框的距離能說出塊級盒子居中對齊需要的2個條件能說出外邊…

Java 泛型,你了解類型擦除嗎?

泛型&#xff0c;一個孤獨的守門者。大家可能會有疑問&#xff0c;我為什么叫做泛型是一個守門者。這其實是我個人的看法而已&#xff0c;我的意思是說泛型沒有其看起來那么深不可測&#xff0c;它并不神秘與神奇。泛型是 Java 中一個很小巧的概念&#xff0c;但同時也是一個很…

css --- [讀書筆記] 浮動(float) 與 清除浮動

說明 源代碼學習 1. 浮動 1.1 CSS布局的三種機制 網頁布局的核心 — 利用 CSS 來擺放盒子 CSS提供了3種機制來設置盒子的擺放位置: 標準流、浮動和定位. 標準流: 塊級元素(div、hr、p、h1~h6、ul、ol、dl、form、table)會獨占一行,從上向下順序排列行內元素(span、a、i、em)…

Shiro身份認證---轉

目錄1.Shro的概念2.Shiro的簡單身份認證實現3.Shiro與spring對身份認證的實現前言&#xff1a; Shiro 可以非常容易的開發出足夠好的應用&#xff0c;其不僅可以用在 JavaSE 環境&#xff0c;也可以用在 JavaEE 環境。Shiro 可以幫助我們完成&#xff1a;認證、授權、加密、會話…

模板 Trie樹

模板 Trie樹 code&#xff1a; #include <iostream> #include <cstdio>using namespace std;const int wx20017;inline int read(){int sum0,f1; char chgetchar();while(ch<0||ch>9){if(ch-)f-1; chgetchar();}while(ch>0&&ch<9){sum(sum<…

css --- [練手小項目]樣式小結(字體、顏色的語義 清除浮動的使用)

說明 源代碼 1.1 CSS屬性書寫順序(重點) 建議遵循以下順序: 1.布局定位屬性: display / position / float / clear / visibility / overflow (建議display第一個寫, 畢竟關系到模式) 2.自身屬性: width / height / margin / padding / border / background 3.文本屬性: co…

《Hive編程指南》14.3 投影變換的實踐出錯原因分析

自己在學習14.3節投影變換執行SQL語句hive (default)> SELECT TRANSFORM(col1, col2) USING /bin/cut -f1 AS newA, newB FROM a;時出現了這個錯誤 Ended Job job_local1231989520_0004 with errors Error during job, obtaining debugging information... FAILED: Executi…

鏈式前向星(轉)

轉自大佬博客https://blog.csdn.net/ACdreamers/article/details/16902023 我們首先來看一下什么是前向星. 前向星是一種特殊的邊集數組,我們把邊集數組中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序, 并記錄下以某個點為起點的所有邊在數組中的起始位…

javascript --- [FormData的使用] 表單元素轉換成表單 對象二進制文件上傳

1. FormData的作用 1.1 將Form表單元素,轉換成表單對象 在使用Ajax進行表單提交的時候,采用原生的js獲取dom,然后添加屬性.當表單項很多的時候,代碼會很多.不利于后期閱讀、維護. 這時,可以使用FormData對象,將HTML中的表單元素轉換成表單對象,如下: <!-- 表單對象 -->…

android studio gradle 國內代理

使用阿里云的國內鏡像倉庫地址&#xff0c;就可以快速的下載需要的文件 修改項目根目錄下的文件 build.gradle &#xff1a; buildscript { repositories { maven{ url http://maven.aliyun.com/nexus/content/groups/public/} } } allprojects { …

爬蟲—01-爬蟲原理與數據抓取

爬蟲的更多用途 12306搶票 網站上的頭票 短信轟炸關于Python網絡爬蟲&#xff0c;我們需要學習的有&#xff1a; Python基礎語法學習&#xff08;基礎知識&#xff09;對HTML頁面的內容抓取&#xff08;數據抓取&#xff09;對HTML頁面的數據提取&#xff08;數據提取&#xff…

javascript --- [FormData的使用] 文件上傳進度條展示 文件上傳圖片即使預覽

1. 準備工作 因為要發送Ajax請求,而Ajax技術的運行需要網站環境,因此其中一個解決方案是,將頁面作為網站的靜態資源暴露出來,然后通過瀏覽器進行訪問. 1.1 靜態資源 使用express將public下面的資源暴露出來在根目錄下面新建一個public文件夾和一個app.js文件 // app.js con…

2018年春閱讀計劃---閱讀筆記4

uml圖的幾大特點&#xff1a;容易掌握 2.面向對象 3.可視化&#xff0c;表達能力強大 4.容易掌握使用 5.與編程語言的關系。用c&#xff0c;java等編程語言可以實現一個系統&#xff0c;支持uml 的一些工具&#xff0c;可以根據uml所建立的系統模型自動產生代碼框架。 uml的5類…

TP5之安全機制

防止sql注入 1、查詢條件盡量使用數組方式&#xff0c;具體如下&#xff1a; 1 $wheres array(); 2 3 $wheres[account] $account; 4 5 $wheres[password] $password; 6 7 $User->where($wheres)->find(); 2、如果必須使用字符串&#xff0c;建議使用預處理機制&am…

javascript --- [jsonp] script標簽的妙用(繞過同源限制)

1. 同源 1.1 什么是同源 協議、域名、端口號相同 1.2 為什么有同源政策 同源政策是為了保護用戶信息的安全,放置惡意的網站竊取數據。最初的同源政策是指A網站再客戶端設置的Cookie,B網站是不能訪問的. 隨著互聯網的發展,同源政策也越來越嚴格,在不同源的情況下,其中有一項…

SQL登錄報錯

在安裝完SQL后&#xff0c;發現報出了error40和53的錯誤&#xff0c;作為小白的我也是一臉懵逼&#xff0c;明明一切都是按照默認加下一步安裝的&#xff0c;為什么到了連接數據庫的時候就出現了問題呢&#xff1f; 后來經過調查&#xff0c;發現需要將sql配置管理的ip中的一項…

復活

此刻--復活轉載于:https://www.cnblogs.com/lyqlyq/p/9881646.html

javascript --- 瀑布流的實現

說明 源代碼 1. 瀑布流 出現問題: 設計給的圖片不是同一個尺寸大小,因此不能規則的放入到給定的DOM結構中.此時,需要使用瀑布流技術來解決這個問題 解決的思路: 讓圖片等寬、不等高 核心: 用到了定位 img {position: absolute;left: 最小的索引 * 圖片的寬度;top: 最小的圖…

不同權限訪問詳細細節

1 package com.package1;2 3 /**4 * 程序執行入口和調用方法在不同類但在同一個包中&#xff0c;除了private方法&#xff0c;其他任何權限的方法都可以都可相互調用5 * author Administrator6 *7 */8 public class Source {9 public static void main(String[] args) …