機(jī)器學(xué)習(xí)算法之決策樹

前言

決策樹是一種簡單高效并且具有強(qiáng)解釋性的模型蹈丸,廣泛應(yīng)用于數(shù)據(jù)分析領(lǐng)域套媚。其本質(zhì)是一顆由多個(gè)判斷節(jié)點(diǎn)組成的樹,如:

決策樹

在使用模型進(jìn)行預(yù)測時(shí)扮碧,根據(jù)輸入?yún)?shù)依次在各個(gè)判斷節(jié)點(diǎn)進(jìn)行判斷游走趟章,最后到葉子節(jié)點(diǎn)即為預(yù)測結(jié)果。

如何構(gòu)造決策樹

決策樹算法的核心是通過對數(shù)據(jù)的學(xué)習(xí)慎王,選定判斷節(jié)點(diǎn)蚓土,構(gòu)造一顆合適的決策樹。

假設(shè)我們從用戶行為日志中整理出如下數(shù)據(jù):

原始數(shù)據(jù)

我們的目的是要利用這些數(shù)據(jù)赖淤,訓(xùn)練決策樹模型蜀漆,模型訓(xùn)練好后,我們就可以通過任意給定的用戶來源網(wǎng)站咱旱、位置确丢、是否閱讀過 FAQ绷耍、瀏覽網(wǎng)頁數(shù)信息,預(yù)測該用戶是否會進(jìn)行付費(fèi)以及付費(fèi)類型鲜侥,供運(yùn)營使用褂始。

選擇合適的拆分條件

我們知道決策樹是由一個(gè)個(gè)判斷節(jié)點(diǎn)組成,每經(jīng)過一個(gè)判斷節(jié)點(diǎn)數(shù)據(jù)就會被拆分一次描函。上面數(shù)據(jù)中有4種屬性崎苗,每種屬性下面有多種值,我們可以按位置是否來自「浙江」進(jìn)行拆分舀寓,拆分結(jié)果為:

按是否來自「浙江」拆分結(jié)果

我們「拍腦袋」進(jìn)行了一次拆分胆数,到底這么拆分合不合適,是不是最佳互墓,我們需要量化指標(biāo)來進(jìn)行評價(jià)必尼,在決策樹算法中,我們通過基尼不純度或者來對一個(gè)集合進(jìn)行的有序程度進(jìn)行量化篡撵,然后引入信息增益概念對一次拆分進(jìn)行量化評價(jià)判莉。下面依次介紹。

基尼不純度

基尼不純度是指將來自集合中的某種結(jié)果隨機(jī)應(yīng)用于集合中某一數(shù)據(jù)項(xiàng)的預(yù)期誤差率酸休。如何集合中的每一個(gè)數(shù)據(jù)項(xiàng)都屬于同一分類骂租,那么推測的結(jié)果總會是正確的,因此誤差率是 0斑司;如果有 4 種可能的結(jié)果均勻分布在集合內(nèi)渗饮,出錯(cuò)可能性是75%,基尼不純度為 0.75宿刮。該值越高互站,說明拆分的越不理想,如果該值為 0僵缺,說明完美拆分胡桃。java 實(shí)現(xiàn)代碼如下:

public static float getCiniimpurity(String[] rows){
        float total = rows.length;
        //將[a,a,b,c]轉(zhuǎn)化成[2,1,1]
        Integer[] uniqueRows = getUniqueRows(rows);
        float score = 0.0f;
        for(int k1=0;k1<uniqueRows.length;k1++){
            float p1 = uniqueRows[k1]/total;
            for(int k2=0;k2<uniqueRows.length;k2++){
                if(k2 == k1) continue;
                float p2 = uniqueRows[k2]/total;
                score += p1 * p2;
            }
        }
        return score;
    }

熵是信息論中的概念,用來表示集合的無序程度磕潮,熵越大表示集合越混亂翠胰,反之則表示集合越有序。熵的計(jì)算公式為:

E = -P * log2P

java 代碼實(shí)現(xiàn)如下:

public static double getEntropy(String[] rows){
        float total = rows.length;
        //將[a,a,b,c]轉(zhuǎn)化成[2,1,1]
        Integer[] uniqueRows = getUniqueRows(rows);
        double ent = 0.0;
        for(int i=0;i<uniqueRows.length;i++){
            float p = uniqueRows[i]/total;
            ent = ent - p * (Math.log(p)/Math.log(2));
        }
        return ent;
    }
基尼不純度與熵對比

兩者主要區(qū)別在于自脯,熵到達(dá)峰值的過程相對慢一些之景。因此熵對混亂集合的「判罰」往往更重一些。通常情況下膏潮,熵的使用更加頻繁锻狗。

信息增益

假設(shè)集合 U,一次拆分后變?yōu)榱藘蓚€(gè)集合 u1 和 u2 ,則有:

信息增益 = E(U) - (Pu1 x E(u1) + Pu2 x E(u2))

E 可以是基尼不純度或熵轻纪。
使用 Pu1 和 Pu2 是為了得到拆分后兩個(gè)集合基尼不純度或熵的加權(quán)平均油额,其中 :

  • Pu1 = Size(u1) / Size(U)
  • Pu2 = Size(u2) / Size(U)

信息增益越大,說明整個(gè)集合從無序到有序的速度越快刻帚,本次拆分越有效潦嘶。

構(gòu)造決策樹

我們已經(jīng)可以通過信息增益量化一次拆分的結(jié)果好壞,下一步就是構(gòu)造決策樹我擂,主要步驟如下:

  1. 遍歷每個(gè)決策條件(如:位置衬以、來源網(wǎng)站)缓艳,對結(jié)果集進(jìn)行拆分
  2. 計(jì)算該決策條件下校摩,所有可能的拆分情況的信息增益,信息增益最大的拆分為本次最優(yōu)拆分
  3. 遞歸執(zhí)行1阶淘、2兩步衙吩,直至信息增益<=0

執(zhí)行完上述步驟后,就構(gòu)造出了一顆決策樹溪窒,如圖:

決策樹

決策樹剪枝

為什么要剪枝

訓(xùn)練出得決策樹存在過度擬合現(xiàn)象——決策樹過于針對訓(xùn)練的數(shù)據(jù)坤塞,專門針對訓(xùn)練集創(chuàng)建出來的分支,其熵值可能會比真實(shí)情況有所降低澈蚌。

如何剪枝

人工設(shè)置一個(gè)信息增益的閥值摹芙,自下而上遍歷決策樹,將信息增益低于該閥值的拆分進(jìn)行合并

處理缺失數(shù)據(jù)

決策樹模型還有一個(gè)很大的優(yōu)勢宛瞄,就是可以容忍缺失數(shù)據(jù)浮禾。如果決策樹中某個(gè)條件缺失,可以按一定的權(quán)重分配繼續(xù)往以后的分支走份汗,最終的結(jié)果可能有多個(gè)盈电,每個(gè)結(jié)果又一定的概率,即:
最終結(jié)果=某個(gè)分支的結(jié)果 x 該分支的權(quán)重(該分支下的結(jié)果數(shù)/總結(jié)果數(shù))

處理數(shù)值型數(shù)據(jù)

決策樹主要解決分類問題(結(jié)果是離散數(shù)據(jù))杯活,如果結(jié)果是數(shù)字匆帚,不會考慮這樣的事實(shí):有些數(shù)字相差很近,有些數(shù)字相差很遠(yuǎn)旁钧。為了解決這個(gè)問題吸重,可以用方差來代替熵或基尼不純度。

結(jié)語

本文簡單介紹了決策樹算法歪今,該算法雖然簡單嚎幸,但是在很多場景能取得非常好的效果,值得讀者一試彤委。另外鞭铆,從決策樹發(fā)展出了更為高級復(fù)雜的隨機(jī)森林,如果有興趣讀者可以去深入了解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末车遂,一起剝皮案震驚了整個(gè)濱河市封断,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舶担,老刑警劉巖坡疼,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衣陶,居然都是意外死亡柄瑰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門剪况,熙熙樓的掌柜王于貴愁眉苦臉地迎上來教沾,“玉大人,你說我怎么就攤上這事译断∈诜” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵孙咪,是天一觀的道長堪唐。 經(jīng)常有香客問我,道長翎蹈,這世上最難降的妖魔是什么淮菠? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮荤堪,結(jié)果婚禮上合陵,老公的妹妹穿的比我還像新娘。我一直安慰自己逞力,他們只是感情好曙寡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寇荧,像睡著了一般举庶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上揩抡,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天户侥,我揣著相機(jī)與錄音,去河邊找鬼峦嗤。 笑死蕊唐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烁设。 我是一名探鬼主播替梨,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼钓试,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了副瀑?” 一聲冷哼從身側(cè)響起弓熏,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糠睡,沒想到半個(gè)月后挽鞠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狈孔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年信认,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片均抽。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嫁赏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出到忽,到底是詐尸還是另有隱情橄教,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布喘漏,位于F島的核電站,受9級特大地震影響华烟,放射性物質(zhì)發(fā)生泄漏翩迈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一盔夜、第九天 我趴在偏房一處隱蔽的房頂上張望负饲。 院中可真熱鬧,春花似錦喂链、人聲如沸返十。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洞坑。三九已至,卻和暖如春蝇率,著一層夾襖步出監(jiān)牢的瞬間迟杂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工本慕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留排拷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓锅尘,卻偏偏與公主長得像监氢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容