1. 程式人生 > >我理解的樸素貝葉斯模型【轉】

我理解的樸素貝葉斯模型【轉】

package 規則 dia div href 重要 源代碼 容易 計算

轉自:http://www.cnblogs.com/nxld/p/6607943.html

我想說:“任何事件都是條件概率。”為什麽呢?因為我認為,任何事件的發生都不是完全偶然的,它都會以其他事件的發生為基礎。換句話說,條件概率就是在其他事件發生的基礎上,某事件發生的概率。

條件概率是樸素貝葉斯模型的基礎

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

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

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

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

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

因為上面在似然當中提到了條件概率,那麽我們有必要將什麽是條件概率做更詳盡的闡述。

如上面的韋恩圖,我們用矩形表示一個樣本空間,代表隨機事件發生的一切可能結果。的在統計學中,我們用符號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%真是靠譜太多了。

當然,現實情況並不會像這個例子這麽理想化。大家會問,憑什麽你就會想到用“未讀消息大於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模型的使用能夠使我們的成本得到大幅節約。

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

附:

技術分享 技術分享技術分享技術分享技術分享技術分享技術分享 樸素貝葉斯分類的工作流程

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

在考慮一個結果的概率時候,要考慮眾多的屬性,貝葉斯算法利用所有可能的數據來進行修正預測,如果大量的特征產生的影響較小,放在一起,組合的影響較大,適合於樸素貝葉斯分類。

應用範圍:

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

在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)

該數據集中包含了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))

原始數據中毒蘑菇與非毒蘑菇之間的比較比較接近,通過抽選訓練集和測試集,發現比重與總體比例大致一樣,故可認為抽樣的結果能夠反映總體狀況,可進一步進行建模和測試。

由於影響蘑菇是否有毒的變量有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

結果顯示,21個變量中,只需要選擇6個變量即可,下圖也可以說明這一點:

所需要選擇的變量是:

接下來,我們就針對這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

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

# 模型的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‘)

通過樸素貝葉斯模型,在測試集中,模型的準確率約為97%,而且AUC的值也非常高,一般超過0.8就說明模型比較理想了。

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

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

我理解的樸素貝葉斯模型【轉】