R機器學習:樸素貝葉斯與支持向量機的原理與實現(xiàn)

今天要給大家介紹的依然是兩個分類算法,The naive Bayes and support vector machine (SVM)田绑,兩個算法的原理有些許不同勤哗,不過還是放一篇文章中吧,畢竟我的文章都是干貨滿滿掩驱。

什么是樸素貝葉斯算法

上一篇文章其實有給大家寫貝葉斯R機器學習:分類算法之判別分析LDA,QDA的原理與實現(xiàn) 芒划,這兒再讓大家加深下印象冬竟。

現(xiàn)在問大家一個問題:一個罕見病的發(fā)病率為0.2%,這個病的檢測的正確率為0.9(如果你真有病民逼,0.9可能性可以被檢測出來)泵殴,人群中這個病的檢測的陽性率為0.05,那么我問拼苍,如果你在一次檢測中得到了陽性的結果笑诅,你得此病的概率為多少?

有些同學張口就來疮鲫,0.9吆你!

錯,因為0.9并沒有考慮這個病的發(fā)病率啊棚点,也沒考慮假陽性率啊早处。

所以這個問題正確的算法應該是使用貝葉斯公式:

image

其中:

  • p(k|x)叫做后驗,此例中為檢測陽性的情況下得病的概率
  • p(x|k)叫做似然瘫析,此例中為得病的情況下檢測陽性的概率
  • p(k)叫做先驗砌梆,此例中為人群中真實的患病率
  • p(x)叫做證據(jù),此例中為檢驗的陽性率贬循,包括假陽性

知道了上面這些知識咸包,現(xiàn)在我再問你如果你某一次檢驗測得陽性,那么你真的患此罕見病的概率為杖虾,是不是為0.9*0.002/0.05=3.2%烂瘫,看到沒就算你檢驗陽性,但是考慮到這個病的罕見性和檢驗的假陽性奇适,其實你真實患此病的概率并不高坟比。

以上例子就體現(xiàn)了貝葉斯的魔力。

機器學習中的貝葉斯

在機器學習中我們也可以利用貝葉斯定理來進行分類嚷往,看一個實際例子葛账,我們想預測微博的主題,主題有4類皮仁,分別是時政籍琳,運動,電影贷祈,其他趋急,我們的預測變量就是看微博中是否出現(xiàn)opinion,score势誊,game和cinema這些詞呜达。

這是一個簡化后的學習問題,實際情況下我們要使用的預測變量肯定不止這些粟耻,但原理都是一樣的闻丑。

然后漩怎,每次遇到一條微博,這條微博屬于特定主題的概率就可以使用貝葉斯法則預測出來:

image

那么在真實的情況下我們會用很多詞(本例中只有4個)來預測主題嗦嗡,此時我們的式子會進行拓展勋锤,我們的貝葉斯的等號右邊部分就成了很多個似然先驗的積除以很多個證據(jù),如下所示:

image

舉個例子侥祭,比如現(xiàn)在手上一條微博有opinion, score, and game這3個詞叁执,那么此時我們的整個的似然就是:

image

上面這個似然的式子就告訴我們:在某個主題下含有某個特定詞的的微博的似然就和這個主題下含有該詞的微博的數(shù)量成正比。我們把所有單個詞的似然相乘就得到了多個詞組合的似然矮冬,這么一種樸素而簡單的乘法谈宛,就是樸素貝葉斯的名字的由來。

既然可以簡單的相乘胎署,這個背后的假設就是詞之間的出現(xiàn)是獨立的事件:

By estimating the likelihood for each predictor variable individually and then multiplying them, we are making the very strong assumption that the predictor variables are independent

大家要知道吆录,很多情況下這個假設并不成立,通常情況下樸素貝葉斯依然可以表現(xiàn)的很好琼牧,但是如果預測變量之間的相關性太大就不建議用樸素貝葉斯了恢筝。

寫到這兒,大家可能要問巨坊,證據(jù)呢撬槽?公式里面不是還有個分母嘛?跑哪去了趾撵。

問得好侄柔,

在貝葉斯法則的式子中,后驗以及似然和先驗都是能夠很好地從數(shù)據(jù)中獲得或者直接從數(shù)據(jù)中學習得到的占调,比如我們的例子中暂题,每個主題有哪些詞(似然)和每個主題的概率(先驗)都是很好得到的,而我們的證據(jù)在這個例子中就是一條微博可能出現(xiàn)的詞卻是無法預測的究珊。所以我們會把貝葉斯法則的分母部分去掉:

image

去掉分母之后就成了后驗與似然和先驗的積成正比薪者,也就是似然與先驗的積越大相應的后驗就越大,在此例中也就是微博所屬的主題的可能性越大苦银,知道這個同樣也可以滿足我們劃分類別的需求。

就劃給后驗最大的主題嘛赶站。

我們對同一條微博每一個主題都計算后驗:

image

然后我們選取后驗最大的哪一個主題就是我們這條微博對應的主題幔虏。

以上就是樸素貝葉斯算法的基本思想,希望能啟發(fā)大家贝椿。

訓練一個樸素貝葉斯模型

我們現(xiàn)在有如下的數(shù)據(jù)想括,數(shù)據(jù)是關于議員投票的,v1到v16是一個議員的16次投票情況烙博,我們要做的就是用這16次投票情況來預測我們的議員到底是共和黨的還是民主當?shù)摹?/p>

image

模型的訓練依然是3步瑟蜈,第一步設定任務烟逊,第二步設定學習器,第3步訓練铺根,代碼如下:

votesTask <- makeClassifTask(data = votesTib, target = "Class")
bayes <- makeLearner("classif.naiveBayes")
bayesModel <- train(bayes, votesTask)

運行上面的代碼我們的樸素貝葉斯分類模型就訓練好了宪躯。

接下來看模型驗證。

模型驗證

我們使用10折驗證位迂,代碼如下:

kFold <- makeResampleDesc(method = "RepCV", folds = 10, reps = 50,
                          stratify = TRUE)
bayesCV <- resample(learner = bayes, task = votesTask,
                    resampling = kFold,
                    measures = list(mmce, acc, fpr, fnr))

因為我們的問題是一個2分類問題访雪,所以我們評價指標額外輸出假陽性和假陰性率。

image

可以看到90%的個案都被我們的模型預測正確了掂林,還行哈臣缀。

我們接下來用我們這個模型來預測新數(shù)據(jù)。

使用模型做預測

假設現(xiàn)在新來一個議員泻帮,他的16次投票情況如下:

politician <- tibble(V1 = "n", V2 = "n", V3 = "y", V4 = "n", V5 = "n",
V6 = "y", V7 = "y", V8 = "y", V9 = "y", V10 = "y",
V11 = "n", V12 = "y", V13 = "n", V14 = "n",
V15 = "y", V16 = "n")

我們現(xiàn)在用我們訓練的樸素貝葉斯模型來預測這個議員到底是共和黨的還是民主黨的精置,代碼如下:

politicianPred <- predict(bayesModel, newdata = politician)
getPredictionResponse(politicianPred)
image

可以看到我們的模型預測這個新議員為民主黨的。

支持向量機

我們接著看支持向量機锣杂,支持向量機是通過給我們的原始數(shù)據(jù)增加維度從而到達到劃分類別的目的的一種方法脂倦。

想象一個例子,你想預測你老板的心情蹲堂,然后你偷偷收集了數(shù)據(jù)狼讨,包括你上班玩了多久游戲,公司每天掙了多少錢柒竞,然后你也記錄了第二天老板的心情政供,然后你就這么記錄了一周,然后你打算用這些數(shù)據(jù)來預測老板的心情朽基。

假如下面這個圖就是你記錄的數(shù)據(jù)布隔,橫軸是你上班玩游戲的時間,縱軸是公司賺的錢稼虎,共兩個預測變量衅檀,那么SVM要做的就是在數(shù)據(jù)中找到相應的超平面,對于我們這個二維數(shù)據(jù)霎俩,超平面就是一條線哀军,要使得這個超平面可以很好第劃分兩類數(shù)據(jù)译柏。

image

如何做到的呢倦卖?

其實對我們上面的這個例子,你可以找很多的超平面鸟辅,這些超平面都可以完美無誤地劃分老板的心情柳击,但是我們要追求的是最佳超平面猿推,這個最佳的超平面可以最大化兩類邊緣距離margin:

The margin is a distance around the hyperplane that touches the fewest training cases

就是說這個最佳超平面到每類的最近的點的距離是最大的。而這些最近的點就叫做支持向量捌肴。

為啥叫支持向量呢蹬叭,搞這么奇怪的名字藕咏。

The cases in the data that touch the margin are called support vectors because they support the position of the hyperplane (hence, the name of the algorithm)

解釋是,這些點支持了超平面的位置秽五,所以就叫支持向量孽查。

從這個意義上看,作為支持向量的這些點是非常重要的筝蚕,它直接影響超平面的位置卦碾,也就是直接影響整個算法∑鹂恚看下圖:

image

從上面的圖中可以看出洲胖,如果我們把數(shù)據(jù)中一個支持向量移個位置,那么我們的超平面也就相應的移位坯沪,但是如果我們將其他的個案移位绿映,其實是對超平面沒有影響的,所以數(shù)據(jù)中的支持向量是重中之重腐晾。

在上面的例子中我們的數(shù)據(jù)類別是可以很好地區(qū)分為2類的叉弦,但是實際中每類數(shù)據(jù)經常會混雜在一起,僅憑一條線其實是分不開兩類數(shù)據(jù)的藻糖,這個時候我們如何找超平面呢淹冰?

這個時候又得給大家介紹另外的兩個概念,一個叫hard margin巨柒,另一個叫soft-margin樱拴,所謂的hard margin就是在類邊緣之間是不允許有數(shù)據(jù)存在的,就像我們剛剛的例子的情況一樣洋满,這個時候兩類是完全可分的晶乔,所謂的soft-margin就是超平面分完后,兩類邊緣之間依然有數(shù)據(jù)牺勾,這些數(shù)據(jù)就是無法被準確劃分的正罢,通常soft-margin用的比較多。

那么驻民,我們可以到底允許幾個數(shù)據(jù)存在在邊緣之間呢翻具?這個是由我們通過超參數(shù)來控制的,就是我們可以控制這個邊緣的軟硬程度回还,越硬我們依賴的支持向量就越少裆泳,越容易過擬合,越軟就越多懦趋,越容易欠擬合:

The harder the margin is, the fewer cases will be inside it; the hyperplane will depend on a smaller number of support vectors. The softer the margin is, the more cases will be inside it; the hyperplane will depend on a larger number of support vectors.

SVM用于線性不可分的數(shù)據(jù)

SVM令人驚嘆的一點就是晾虑,它可以給數(shù)據(jù)額外增加維度疹味,讓原本線性不可分的數(shù)據(jù)變成線性可分仅叫。非常巧妙帜篇,具體是怎么做的呢,我們看下圖:左上角是我們的數(shù)據(jù)诫咱,我們有兩個預測變量variable1和variable2笙隙,從圖中可以看到僅憑這兩個預測變量我們是無法將兩類數(shù)據(jù)線性分開的,但是坎缭,我們可以通過SVM算法給我們的數(shù)據(jù)增加一個維度(如右上圖)竟痰,此時形成一個二維的超平面就可以成功地將數(shù)據(jù)分為兩類。

這個SVM扯出來的新的平面掏呼,叫做核kernel坏快。

image

那么SVM是如何形成這個新的平面,也就是新的核的呢?

是通過一個叫核函數(shù)的東西憎夷,常見的核函數(shù)見下圖:

image

在訓練的時候到底用哪個核函數(shù)是你決定的莽鸿,所以核函數(shù)也是SVM的超參數(shù),我們可以進行超參調試(之前的文章有介紹)拾给,一般不同的核函數(shù)適用不同的數(shù)據(jù)情形祥得,見下圖:

image

SVM不止核函數(shù)這一個超參數(shù),還有很多蒋得,我們接著介紹:

SVM的超參數(shù)

首先第一個超參數(shù)就是核函數(shù)级及,你得自己設定核函數(shù),規(guī)定你到底想怎么樣把數(shù)據(jù)扯成多一維额衙,第二個超參數(shù)叫做The degree hyperparameter(我也不知道這個中文怎么翻譯合適饮焦,反正中文資料好少哦,所以我寫的文章大家且看且珍惜)入偷;這個參數(shù)是規(guī)定你劃分支持向量邊界的時候的曲度的追驴。

The degree hyperparameter, which controls how “bendy” the decision boundary will be for the polynomial kernel

第三個超參數(shù)是C參數(shù),這個參數(shù)是規(guī)定邊界軟硬程度的(邊界內容許幾個個案)疏之。

The cost or C hyperparameter, which controls how “hard” or “soft” the margin is

第4個超參是伽馬參數(shù)殿雪,這個參數(shù)規(guī)定個體支持向量的影響權重。

The gamma hyperparameter, which controls how much influence individual cases have on the position of the decision boundary

這兒給大家解釋下C和伽馬锋爪,C越大邊界內容許的個案越多(如下圖的上半部分)丙曙,伽馬越大單個個案的影響越大,模型可以越精細其骄,越容易過擬合(如下圖下半部分):

image

反正就是SVM的超參挺多亏镰,為了模型好,訓練的時候都得調試拯爽。

SVM實例操練

我現(xiàn)在有一個垃圾郵件數(shù)據(jù)庫索抓,數(shù)據(jù)包含郵件類型type,還有57個郵件的特征,我們要做的就是訓練一個SVM模型來預測新的郵件是不是垃圾郵件逼肯。

數(shù)據(jù)大概長這樣:

image

訓練模型依然是3步走:第一定義任務耸黑,第二定義學習器,第三訓練篮幢,因為我們SVM會有超參調試大刊,所以調試好了再進行第三步,前兩步的代碼如下:

spamTask <- makeClassifTask(data = spamTib, target = "type")
svm <- makeLearner("classif.svm")

接下來設置超參范圍并進行調試:

kernels <- c("polynomial", "radial", "sigmoid")
svmParamSpace <- makeParamSet(
  makeDiscreteParam("kernel", values = kernels),
  makeIntegerParam("degree", lower = 1, upper = 3),
  makeNumericParam("cost", lower = 0.1, upper = 10),
  makeNumericParam("gamma", lower = 0.1, 10))
randSearch <- makeTuneControlRandom(maxit = 20)
cvForTuning <- makeResampleDesc("Holdout", split = 2/3)

tunedSvmPars <- tuneParams("classif.svm", task = spamTask,
                           resampling = cvForTuning,
                           par.set = svmParamSpace,
                           control = randSearch)
parallelStop()
tunedSvmPars#看調試結果

因為我們需要調試的超參比較多三椿,為了節(jié)省算力缺菌,所以最優(yōu)超參的尋找方法我們用的random search法,然后對每個超參組合我們用簡單交叉驗證進行評估搜锰,最終找到最好的超參組合伴郁。

最終我們得到的超參組合為

image

好了,我們現(xiàn)在就根據(jù)調試出來的最優(yōu)的超參來進行第3步蛋叼,也就是訓練我們的模型:

tunedSvm <- setHyperPars(makeLearner("classif.svm"),
                         par.vals = tunedSvmPars$x)
tunedSvmModel <- train(tunedSvm, spamTask)

運行上面的代碼模型就訓練好了蛾绎,接下來進行交叉驗證:

outer <- makeResampleDesc("CV", iters = 3)
svmWrapper <- makeTuneWrapper("classif.svm", resampling = cvForTuning,
                              par.set = svmParamSpace,
                              control = randSearch)
cvWithTuning <- resample(svmWrapper, spamTask, resampling = outer)
cvWithTuning

交叉驗證的時候依然要考慮超參,因為我們的訓練的數(shù)據(jù)不同最優(yōu)超參也應該是不同的鸦列,所以在模型的驗證時也應該考慮超參調試租冠,所以上面的代碼將超參調試進行了封裝后一同放到了交叉驗證的流程中。

最終我們得到了最終的模型:

image

可以看到我們的模型分類對了1-0.07=99.3%的個案薯嗤,可以說是一個非常好的SVM的模型了顽爹。

小結

今天給大家寫了樸素貝葉斯和支持向量機的原理和實現(xiàn)方法,感謝大家耐心看完骆姐,自己的文章都寫的很細镜粤,代碼都在原文中,希望大家都可以自己做一做玻褪,請關注后私信回復“數(shù)據(jù)鏈接”獲取所有數(shù)據(jù)和本人收集的學習資料肉渴。如果對您有用請先收藏,再點贊轉發(fā)带射。

也歡迎大家的意見和建議同规,大家想了解什么統(tǒng)計方法都可以在文章下留言,說不定我看見了就會給你寫教程哦窟社。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末券勺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子灿里,更是在濱河造成了極大的恐慌关炼,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匣吊,死亡現(xiàn)場離奇詭異儒拂,居然都是意外死亡寸潦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門社痛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甸祭,“玉大人,你說我怎么就攤上這事褥影。” “怎么了咏雌?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵凡怎,是天一觀的道長。 經常有香客問我赊抖,道長统倒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任氛雪,我火速辦了婚禮房匆,結果婚禮上,老公的妹妹穿的比我還像新娘报亩。我一直安慰自己浴鸿,他們只是感情好,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布弦追。 她就那樣靜靜地躺著岳链,像睡著了一般。 火紅的嫁衣襯著肌膚如雪劲件。 梳的紋絲不亂的頭發(fā)上掸哑,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音零远,去河邊找鬼苗分。 笑死,一個胖子當著我的面吹牛牵辣,可吹牛的內容都是我干的摔癣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼纬向,長吁一口氣:“原來是場噩夢啊……” “哼供填!你這毒婦竟也來了?” 一聲冷哼從身側響起罢猪,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤近她,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后膳帕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粘捎,經...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡薇缅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了攒磨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泳桦。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖娩缰,靈堂內的尸體忽然破棺而出灸撰,到底是詐尸還是另有隱情,我是刑警寧澤拼坎,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布浮毯,位于F島的核電站,受9級特大地震影響泰鸡,放射性物質發(fā)生泄漏债蓝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一盛龄、第九天 我趴在偏房一處隱蔽的房頂上張望饰迹。 院中可真熱鬧,春花似錦余舶、人聲如沸啊鸭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莉掂。三九已至,卻和暖如春千扔,著一層夾襖步出監(jiān)牢的瞬間憎妙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工曲楚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厘唾,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓龙誊,卻偏偏與公主長得像抚垃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子趟大,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內容