我理解的樸素貝葉斯模型

 

我理解的樸素貝葉斯模型

我想說:「任何事件都是條件機率。」爲何呢?由於我認爲,任何事件的發生都不是徹底偶然的,它都會以其餘事件的發生爲基礎。換句話說,條件機率就是在其餘事件發生的基礎上,某事件發生的機率。php

條件機率是樸素貝葉斯模型的基礎算法

假設,你的xx公司正在面臨着用戶流失的壓力。雖然,你能計算用戶總體流失的機率(流失用戶數/用戶總數)。但這個數字並無多大意義,由於資源是有限的,利用這個數字你只能撒胡椒麪似的把錢撒在全部用戶上,顯然不經濟。你很是想根據用戶的某種行爲,精確地估計一個用戶流失的機率,若這個機率超過某個閥值,再觸發用戶挽留機制。這樣能把錢花到最須要花的地方。sql

你搜遍腦子裏的數據分析方法,終於,一個250年前的人名在腦中閃現。就是貝葉斯Bayes。你取得了近一個月的流失用戶數、流失用戶中未讀消息大於5條的人數、近一個月的活躍用戶數及活躍用戶中未讀消息大於5條的人數。在此基礎上,你得到了一個「一旦用戶未讀消息大於5條,他流失的機率高達%」的精確結論。怎麼實現這個計算呢?先彆着急,爲了解釋清楚貝葉斯模型,咱們先定義一些名詞。bash

  • 機率(Probability)——0和1之間的一個數字,表示一個特定結果發生的可能性。好比投資硬幣,「正面朝上」這個特定結果發生的可能性爲0.5,這個0.5就是機率。換一種說法,計算樣本數據中出現該結果次數的百分比。即你投一百次硬幣,正面朝上的次數基本上是50次。機器學習

  • 概率(Odds)——某一特定結果發生與不發生的機率比。若是你明天電梯上趕上你暗戀的女孩的機率是0.1,那麼遇不上她的機率就是0.9,那麼趕上暗戀女孩的概率就是1/9,概率的取值範圍是0到無窮大。函數

  • 似然(Likelihood)——兩個相關的條件機率之比,即給定B發生的狀況下,某一特定結果A發生的機率和給定B不發生的狀況下A發生的機率之比。另外一種表達方式是,給定B的狀況下A發生的概率和A的總體概率之比。兩個計算方式是等價的。工具

Clipboard Image.png

由於上面在似然當中提到了條件機率,那麼咱們有必要將什麼是條件機率作更詳盡的闡述。學習

如上面的韋恩圖,咱們用矩形表示一個樣本空間,表明隨機事件發生的一切可能結果。的在統計學中,咱們用符號P表示機率,A事件發生的機率表示爲P(A)。兩個事件間的機率表達實際上至關繁瑣,咱們只介紹本書中用得着的關係:測試

  1. A事件與B事件同時發生的機率表示爲P(A∩B),或簡寫爲P(AB)即兩個圓圈重疊的部分。網站

  2. A不發生的機率爲1-P(A),寫爲P(~A),即矩形中除了圓圈A之外的其餘部分。

  3. A或者B至少有一個發生的機率表示爲P(A∪B),即圓圈A與圓圈B共同覆蓋的區域。

  4. 在B事件發生的基礎上發生A的機率表示爲P(A|B),這即是咱們前文所提到的條件機率,圖形上它有AB重合的面積比上B的面積。

回到咱們的例子。以P(A)表明用戶流失的機率,P(B)表明用戶有5條以上未讀信息的機率,P(B|A)表明用戶流失的前提下未讀信息大於5條的機率。咱們要求未讀信息大於5條的用戶流失的機率,即P(A|B),貝葉斯公式告訴咱們: 

P(A|B)=P(AB)/P(B)

              =P(B|A)*P(A)/P(B)

從公式中可知,若是要計算B條件下A發生的機率,只須要計算出後面等式的三個部分,B事件的機率(P(B)),是B的先驗機率、A屬於某類的機率(P(A)),是A的先驗機率、以及已知A的某個分類下,事件B的機率(P(B|A)),是後驗機率

若是要肯定某個樣本歸屬於哪一類,則須要計算出歸屬不一樣類的機率,再從中挑選出最大的機率

咱們把上面的貝葉斯公式寫出這樣,也許你能更好的理解:

MAX(P(Ai|B))=MAX(P(B|Ai)*P(Ai)/P(B))

而這個公式告訴咱們,須要計算最大的後驗機率,只須要計算出分子的最大值便可,而不一樣水平的機率P(C)很是容易得到,故難點就在於P(X|C)的機率計算。而問題的解決,正是聰明之處,即貝葉斯假設變量X間是條件獨立的,故而P(X|C)的機率就能夠計算爲:

P(B|Ai) =P(B1/Ai)*P(B2/Ai)*P(B3/Ai)*.....*P(Bn/Ai) 

以下圖,由這個公式咱們就能輕鬆計算出,在觀察到某用戶的未讀信息大於5條時,他流失的機率爲80%。80%的數值比原來的30%真是靠譜太多了。

Clipboard Image.png

固然,現實狀況並不會像這個例子這麼理想化。你們會問,憑什麼你就會想到用「未讀消息大於5條」來做爲條件機率?我只能說,現實狀況中,你可能要找上一堆以爲可以凸顯用戶流失的行爲,而後一一作貝葉斯規則,來測算他們是否能顯著識別用戶流失。尋找這個字段的效率,取決於你對業務的理解程度和直覺的敏銳性。另外,你還須要定義「流失」和「活躍」,還須要定義貝葉斯規則計算的基礎樣本,這決定告終果的精度。

  • 利用全機率公式的一個例子

樸素貝葉斯的應用不止於此,咱們再例舉一個更復雜,但現實場景也更實際的案例。假設你爲了肅清電商平臺上的惡性商戶(刷單、非法交易、惡性競爭等),委託算法團隊開發了一個識別商家是不是惡性商戶的模型M1。爲何要開發模型呢?由於以前識別惡性商家,你只能經過用戶舉報和人肉識別異常數據的方式,人力成本高且速率很慢。你期望有智能的算法來提升效率。

以前監察團隊的成果告訴咱們,目前平臺上的惡性商戶比率爲0.2%,記爲P(E),那麼P(~E)就是99.8%。利用模型M1進行檢測,你發如今監察團隊已斷定的惡性商戶中,由模型M1所斷定爲陽性(惡性商戶)的人數佔比爲90%,這是一個條件機率,表示爲P(P|E)=90%;在監察團隊斷定爲健康商戶羣體中,由模型M1斷定爲陽性的人數佔比爲8%,表示爲P(P|~E)=8%。乍看之下,你是否是以爲這個模型的準確度不夠呢?感受對商戶有8%的誤殺,還有10%的漏判。其實否則,這個模型的結果不是你想固然的這麼使用的 

這裏,咱們須要使用一個稱爲「全機率公式」的計算模型,來計算出在M1判別某個商戶爲惡性商戶時,這個結果的可信度有多高。這正是貝葉斯模型的核心。當M1判別某個商戶爲惡性商戶時,這個商戶的確是惡性商戶的機率由P(E|P)表示:

P(E|P)

=P(P|E)*P(E) (P(E)*P(P|E)+P(~E)*P(P|~E)) 

上面就是全機率公式。要知道判別爲惡性商戶的前提下,該商戶實際爲惡性商戶的機率,須要由先前的惡性商戶比率P(E),以判別的惡性商戶中的結果爲陽性的商戶比率P(P|E),以判別爲健康商戶中的結果爲陽性的比率P(P|~E),以判別商戶中健康商戶的比率P(~E)來共同決定。

P(E)     0.2%
P(P|E)  90%
P(~E)   99.8%
P(P|~E)  8%
P(E|P)= P(P|E)*P(E) / (P(E)*P(P|E)+P(~E)*P(P|~E))  2.2%

由上面的數字,帶入全機率公式後,咱們得到的結果爲2.2%。也就是說,根據M1的判別爲陽性的結果,某個商戶實際爲惡性商戶的機率爲2.2%,是不進行判別的0.2%的11倍。

你可能認爲2.2%的機率並不算高。但實際狀況下你應該這麼思考:被M1模型判別爲惡性商戶,說明這家商戶作出惡性行爲的機率是通常商戶的11倍,那麼,就很是有必要用進一步的手段進行檢查了。

惡性商戶判別模型真正的使用邏輯應該是以下圖所示。咱們先用M1進行一輪判別,結果是陽性的商戶,說明出現惡性行爲的機率是通常商戶的11倍,那麼有必要用精度更高的方式進行判別,或者人工介入進行檢查。精度更高的檢查和人工介入,成本都是很是高的。所以M1模型的使用可以使咱們的成本獲得大幅節約。 

Clipboard Image.png 

貝葉斯模型在不少方面都有應用,咱們熟知的領域就有垃圾郵件識別、文本的模糊匹配、欺詐判別、商品推薦等等。經過貝葉斯模型的闡述,你們應該有這樣的一種體會:分析模型並不取決於多麼複雜的數學公式,多麼高級的軟件工具,多麼高深的算法組合;它們的原理每每是通俗易懂的,實現起來也沒有多高的門檻。好比貝葉斯模型,用Excel的單元格和加減乘除的符號就能實現。因此,不要以爲數據分析建模有多遙遠,其實就在你手邊。

附:

樸素貝葉斯分類的工做流程

                                        3.png

 

 

 

 

 

 

 

 

 

 

 

樸素貝葉斯分類適用解決的問題

        在考慮一個結果的機率時候,要考慮衆多的屬性,貝葉斯算法利用全部可能的數據來進行修正預測,若是大量的特徵產生的影響較小,放在一塊兒,組合的影響較大,適合於樸素貝葉斯分類。

應用範圍:

貝葉斯定理普遍應用於決策分析。先驗機率常常是由決策者主觀估計的。在選擇最佳決策時,會在取得樣本信息後計算後驗機率以供決策者使用。

 

 

在R語言中,是如何實現樸素貝葉斯算法的落地的?

 

R語言中的klaR就提供了樸素貝葉斯算法實現的函數NaiveBayes,咱們來看一下該函數的用法及參數含義:

NaiveBayes(formula, data, ..., subset, na.action= na.pass)

NaiveBayes(x, grouping, prior, usekernel= FALSE, fL = 0, ...)

formula指定參與模型計算的變量,以公式形式給出,相似於y=x1+x2+x3;

data用於指定須要分析的數據對象;

na.action指定缺失值的處理方法,默認狀況下不將缺失值歸入模型計算,也不會發生報錯信息,當設爲「na.omit」時則會刪除含有缺失值的樣本;

x指定須要處理的數據,能夠是數據框形式,也能夠是矩陣形式;

grouping爲每一個觀測樣本指定所屬類別;

prior可爲各個類別指定先驗機率,默認狀況下用各個類別的樣本比例做爲先驗機率;

usekernel指定密度估計的方法(在沒法判斷數據的分佈時,採用密度密度估計方法),默認狀況下使用正態分佈密度估計,設爲TRUE時,則使用核密度估計方法;

fL指定是否進行拉普拉斯修正,默認狀況下不對數據進行修正,當數據量較小時,能夠設置該參數爲1,即進行拉普拉斯修正

R語言實戰

本次實戰內容的數據來自於UCI機器學習網站,後文會給出數據集合源代碼的連接。

# 下載並加載所需的應用包

if(!suppressWarnings(require('caret'))){
  install.packages('caret')
  require('caret')
}
if(!suppressWarnings(require('klaR'))){
  install.packages('klaR')
  require('klaR')
}
if(!suppressWarnings(require('pROC'))){
  install.packages('pROC')
  require('pROC')
}
# 讀取蘑菇數據集
mydata <- read.csv(file = file.choose())
# 簡單的瞭解一下數據
str(mydata)
summary(mydata)

image.png

該數據集中包含了8124個樣本和22個變量(如蘑菇的顏色、形狀、光滑度等)。

 

# 抽樣,並將整體分爲訓練集和測試集
set.seed(12)
index <- sample(1:nrow(mydata), size = 0.75*nrow(mydata))
train <- mydata[index,]
test <- mydata[-index,]
# 大體查看抽樣與整體之間是否吻合
prop.table(table(mydata$type))
prop.table(table(train$type))
prop.table(table(test$type))

 

image.png

原始數據中毒蘑菇與非毒蘑菇之間的比較比較接近,經過抽選訓練集和測試集,發現比重與整體比例大體同樣,故可認爲抽樣的結果可以反映整體情況,可進一步進行建模和測試。

因爲影響蘑菇是否有毒的變量有21個,能夠先試着作一下特徵選擇,這裏咱們就採用隨機森林方法(藉助caret包實現特徵選擇的工做)進行重要變量的選擇:

#構建rfe函數的控制參數(使用隨機森林函數和10重交叉驗證抽樣方法,並抽取5組樣本)
rfeControls_rf <- rfeControl(
  functions = rfFuncs,
  method = 'cv',
  repeats = 5)
#使用rfe函數進行特徵選擇
fs_nb <- rfe(x = train[,-1],
             y = train[,1],
             sizes = seq(4,21,2),
             rfeControl = rfeControls_rf)
fs_nb
plot(fs_nb, type = c('g','o'))
fs_nb$optVariables

image.png

結果顯示,21個變量中,只須要選擇6個變量便可,下圖也能夠說明這一點:

image.png

所須要選擇的變量是:

image.png

接下來,咱們就針對這6個變量,使用樸素貝葉斯算法進行建模和預測:

# 使用klaR包中的NaiveBayes函數構建樸素貝葉斯算法
vars <- c('type',fs_nb$optVariables)
fit <- NaiveBayes(type ~ ., data = train[,vars])
# 預測
pred <- predict(fit, newdata = test[,vars][,-1])
# 構建混淆矩陣
freq <- table(pred$class, test[,1])
freq

image.png

# 模型的準確率
accuracy <- sum(diag(freq))/sum(freq)
accuracy

image.png

# 模型的AUC值
modelroc <- roc(as.integer(test[,1]), 
                as.integer(factor(pred$class)))
# 繪製ROC曲線
plot(modelroc, print.auc = TRUE, auc.polygon = TRUE, 
     grid = c(0.1,0.2), grid.col = c('green','red'),
     max.auc.polygon = TRUE, auc.polygon.col = 'steelblue')

image.png

經過樸素貝葉斯模型,在測試集中,模型的準確率約爲97%,並且AUC的值也很是高,通常超過0.8就說明模型比較理想了。

 

參考來源於:https://ask.hellobi.com/blog/chuanshu108/6036

      https://ask.hellobi.com/blog/lsxxx2011/6381      

相關文章
相關標籤/搜索