用決策樹演算法分析女朋友為什麼會生氣

用決策樹演算法分析女朋友為什麼會生氣

來自專欄機器學習識女人

假設你有一個女朋友,相處還不錯,但是有時候會發現女朋友不知道什麼原因突然就不高興起來,而且怎麼問也不告訴你原因。

身為IT直男的你,雖然搞不懂女人的心思,但可以通過一種叫決策樹的機器學習演算法來找到原因,並且可以預測出在某種未見的條件下女朋友是否會生氣。

怎麼做呢?一共分五步。


第一步,收集數據

記錄下來每天女朋友的一些行為特徵(為後續計算簡便,這裡只列舉了2個特徵:當天的天氣,晚上誰洗碗),並填寫到如下表格中,表格的最後一列表示當天是否生氣:

圖表1

第二步,計算熵

先不要被「熵」這個古怪的名字嚇到,其實就是一個數字,用來度量一件事情的不確定程度,仍以「是否生氣」為例:

1、女朋友問你:我好看嗎?

你回答:好看!

然後女朋友對你嫣然一笑,那麼「是否生氣」這件事情的熵很小,因為這時候你可以很確認女朋友沒有生氣;

2、女朋友仍然問你:我好看嗎?

你此時回答:不好看!

於是女朋友拿起掃把猛敲你腦袋,這時候你如夢方醒,後悔說了實話,但這時候「是否生氣」這件事情的熵還是很小,因為你很確認女朋友已經生氣了;

3、但如果女朋友問你:我和我閨蜜誰更好看?

你回答:你好看!

女朋友又說:說實話!

你回答:那你閨蜜好看…

此時你女朋友嘴角抽動一下,又「呵呵」了一聲,此時你一定很忐忑,不知道女朋友的是否會生氣,此時的熵就很非常大!

這個例子只是解釋了熵的直觀含義,既然熵是一個數字,那麼如果表達這個數字呢?

為了盡量不引入數學公式,仍然通過上個例子說明怎麼計算熵:

由此可以看出,某件事件的熵的計算方式就是該事件的概率和概率的對數乘積的和的負數。(為什麼突然引入了對數這種操作?這涉及到資訊理論的知識,為了不喧賓奪主,暫不展開,目前只需要知道,一件事情發生概率的對數,描述了該事情的信息量)

進一步,可以計算在圖表1中,女朋友生氣的概率是2/5=0.4,女朋友不生氣的概率是3/5=0.6,那麼「是否生氣」的熵為-(0.4* log_{2} 0.4+0.6* log_{2} 0.6)=0.97

第三步,找到最可能引起女朋友生氣的原因

根據上一節介紹的熵的定義,你之所以不知道女朋友是否生氣,是因為這個熵很大;那麼如果存在一個特徵,能夠使這個熵減小,就說明這個特徵能夠在一定程度上解釋女朋友「是否生氣」的原因。

直觀上,如果存在某一特徵,可以決定女朋友是否生氣(比如我晚上洗碗,女朋友就不生氣,我晚上不洗碗,女朋友就生氣,此時的熵最小),那自然是極好的;

然而,在現實中「是否生氣」的原因是多樣的,往往不存在這麼完美的特徵一下子就可以確認這麼複雜的課題;那麼我們退而求其次,尋找一個能夠盡量確認「是否生氣」的特徵,通過該特徵能夠使得「是否生氣」的熵盡量小。為了描述這兩者的關係,引入一個新的概念:條件熵。

條件熵是啥?

就是帶有條件的熵。

好像是廢話。。。

還是舉例來說吧,之前介紹的熵,只與表格中最後的一列(是否生氣)有關,和其他2列的數據無關,但條件熵就涉及到了兩列,也就是在某一列已知(條件)的情況下,「是否生氣」的熵。

那麼如果計算呢?以「天氣」為例,根據天氣是「陰」還是「晴」,將數據分為兩組。

1、第一組:

此時熵=-(0.67* log_{2} 0.67+0.33* log_{2} 0.33)=0.91

第一組的概率=組內的記錄數/總記錄數=3/5=0.6

第二組:

熵=-(0* log_{2} 0+1* log_{2} 1)=0

第二組的概率=組內的記錄數/總記錄數=2/5=0.4

將兩組數據的熵進行加權求和,即得到在「天氣」的條件下,「是否生氣」的條件熵為:

0.91*0.6+0*0.4=0.55

2、以「誰洗碗」為例,將數據分為兩組:

第一組:

熵=-(2/4* log_{2} (2/4)+2/4* log_{2} (2/4)=1

第一組的概率=組內的記錄數/總記錄數=4/5=0.8

第二組

熵=-(0*log0+1*log1)=0

第二組的概率=組內的記錄數/總記錄數=1/5=0.2

將兩組數據的熵進行加權求和,即得到在「誰洗碗」的條件下,「是否生氣」的條件熵為:

0.8*1+0*0.2=0.8

既然我們假設女朋友是否生氣是由這兩種原因引起的,那麼如果有一種原因如果能使得熵減少的越多,就可以認為這種原因的可能性就越大,將第二步計算的熵減去剛才計算的2個條件熵,分別為0.97-0.55=0.42和0.97-0.8=0.17,得出最大的值為0.42,對應的列為「天氣」,由此可以斷定,「天氣」對「是否生氣」的影響最大。

第四步,生成決策樹

1、將上一步計算出來的影響最大的列作為根節點,將樹分為兩部分,如圖:

2、將新生成的各個子樹尋找影響最大的列,再將樹分為兩部分;如圖:

3、重複上步,直到無法繼續下去,因為本例比較簡單,所以上一步驟已經是最後生成的決策樹。(什麼叫無法繼續下去?這裡說得比較模糊是因為有較多細節,為了不影響主要思路而不深入介紹,建議完全理解本文後再查閱相關資料)

第五步,預測女朋友是否生氣。

如果某一天的女朋友狀態為:天氣陰,女朋友洗碗。

根據以上生成的決策樹,首先判斷「天氣」,因為是「陰」,所以先走左分支;左分支只有一個葉子節點「生氣」,此時就要提醒你今天要萬分小心了。


這個模型看起來似乎太簡單,一眼就可以看出結論,沒必要用熵之類的公式來推導,那是因為為了理解方便,我們只分析了兩個特徵,如果繼續深入挖掘更多的特徵,特徵之間關係就沒有這麼直觀了,此時必須依靠決策樹之類的模型才能得出結論;

決策樹模型已經提出了很多年,而且現在已經有很多開源框架對其進行了良好的封裝,只要調用相應介面即可運行,但深入理解其內部運行機制仍然非常重要,否則在真正實戰的後期階段進行特徵抽取,模型調參等步驟時就會遇到困難。

推薦閱讀:

叩開前額葉皮層(PFC)研究的大門
得了乳腺癌就等於被判「死刑」了嗎?
身為AI界網紅,神經網路有何過人之處?
咖啡對你做了什麼?

TAG:自然科學 | 決策樹 | 科普 |