機器學習|決策樹分類與python實現(xiàn)

目錄:

  • 1.決策樹簡介

  • 2.決策樹生成

  • a) 選擇標準——熵

  • b) 信息增益——ID3算法

  • c) 信息增益率——C4.5算法

  • d) Gini系數(shù)——CART算法

  • e) 評價標準——評價函數(shù)

  • 3.剪枝操作

    • a) 預剪枝
    • b) 后剪枝
  • 4.決策樹的集成——隨機森林

  • 5.Sklearn構(gòu)造決策樹

    • a) 數(shù)據(jù)包介紹
    • b) 5行代碼構(gòu)造決策樹
    • c) 參數(shù)簡介

1.決策樹簡介

決策樹概念:決策樹(Decision Trees)是一種非參監(jiān)督學習方法映跟,即沒有固定的參數(shù)爬橡,對數(shù)據(jù)進行分類或回歸學習缰盏。決策樹的目標是從已知數(shù)據(jù)中學習得到一套規(guī)則,能夠通過簡單的規(guī)則判斷,對未知數(shù)據(jù)進行預測。這里我們只討論決策樹分類的功能袁勺。

決策樹組成:根節(jié)點、非葉子節(jié)點(也叫決策點畜普、子節(jié)點期丰、內(nèi)部節(jié)點)、分支(有向邊)吃挑、葉子節(jié)點(葉節(jié)點)钝荡。其中非葉子節(jié)點是一個分支的終點,無法繼續(xù)分離舶衬。

決策流程:所有的數(shù)據(jù)埠通,從根節(jié)點開始,根據(jù)某一特征的條件進行分配逛犹,進入不同的子節(jié)點端辱,不斷遞歸,最終到達葉子節(jié)點停止虽画。例如下圖是一個判斷一家人誰愛玩游戲的決策樹舞蔽。

2.決策樹的生成

a.選擇標準——熵

決策樹很重要的一個問題是選擇什么條件和特征來進行分類。舉個相親的例子:當決定是否要與一個相親的對象見面時码撰,會有一些硬性的標準渗柿,比如年齡、長相等灸拍,也有一些次要的條件做祝,比如是否是公務員等。和這些標準一樣鸡岗,決策樹中也要選擇重要的條件和特征進行分類混槐,這種重要性用熵來表示。

熵(entropy):在高中化學中表示物體內(nèi)部的混亂程度轩性。在概率統(tǒng)計中声登,表示隨機變量不確定性的程度。熵越大,越不確定悯嗓;熵越接近于0件舵,越確定。舉個數(shù)組的例子「現(xiàn)在有AB兩個數(shù)組:

A=[1,2,3,4,2,3,5]
B=[1,1,1,1,2,1,2]

A中數(shù)字多铅祸,且混亂,而B中主要都是1合武,偶爾出現(xiàn)2临梗,那么就說A比較混亂,不確定性大稼跳,B比較整潔盟庞,比較確定。那么A的熵值高汤善,B的熵低什猖。在決策樹中,我們希望數(shù)據(jù)經(jīng)過一個分支分類后红淡,盡量被分離得清晰整潔不狮,像B一樣。熵用數(shù)學公式來表達如下:

它表示選用某個特征條件進行分類后在旱,分類結(jié)果的混亂程度荤傲。其中P代表一個條件下發(fā)生的概率。P=0時颈渊,定義熵H=0遂黍。所以無論P接近0或者1,H都接近0俊嗽,此時數(shù)據(jù)結(jié)論趨向一致雾家,混亂度低。例如將B數(shù)組進行分類绍豁,得到[1,1,1,1,1]和[2,2]兩個葉子節(jié)點芯咧,那么根節(jié)點的熵為:

有了衡量標準竹揍,那么構(gòu)造決策樹的思路也就有了:隨著樹深度的增加,讓節(jié)點熵迅速降低芬位。省略掉一些沒有實際意義的特征,最終得到一棵最矮的決策樹昧碉。那么就產(chǎn)生了ID3算法揽惹。

b.信息增益——ID3算法

舉個分類的例子

在outlook中,一共有14種情況四康,9個yes和5個no搪搏,那么根節(jié)點的信息熵為:

經(jīng)過分類后,形成了三個葉子節(jié)點闪金,此時相當于已知兩個隨機變量X疯溺,Y,求聯(lián)合概率分布下的熵:

根據(jù)此公式哎垦,先計算各葉子節(jié)點中的熵:

Outlook=sunny時喝检,H1=0.971
Outlook=overcast時,H2=0
Outlook=rainy時撼泛,H3=0.971

再計算分類后的熵:5/140.971+4/140+5/14*0.971=0.693
這樣熵下降了:0.940-0.693=0.247
分類前與分類后,熵的差值澡谭,叫做信息增益:

**
**
它表示特征A對訓練集D的信息增益愿题。因此,我們計算各個分類方法的信息增益蛙奖,選出最gain(D,A)最大的作為分類條件潘酗,即可讓總體的熵下降最快。這也是ID3算法的核心思想雁仲。

c.信息增益率——C4.5算法

但是信息增益也有行不通的時候仔夺。舉一個極端的反例。假設每個樣本都帶有一個不重復的ID攒砖,用這些ID作為分類條件缸兔,可以一步就完成分類,這種分類方法的熵為0吹艇,信息增益很大惰蜜。但是用這種條件進行分類顯然是不靠譜的。因此受神,可能存在某個條件抛猖,分出的種類非常多,每個種類的樣本非常少鼻听。為了解決這個問題财著,提出了信息增益率(也叫信息增益比),它等于信息增益除以自身熵:

**
**
如果分類很快撑碴,分布很廣的情況發(fā)生撑教,雖然方法的信息增益較大,但是自身的熵也會很大驮履,信息增益與自身熵的比就會很小玫镐。因此,使用信息增益率來作決策杜跷,能夠有效地排除上述這種特殊情況葛闷。

d.Gini系數(shù)——CART算法

同樣淑趾,Gini系數(shù)也是越小扣泊,總體越穩(wěn)定延蟹∫抖眩基于Gini系數(shù)最小的原則沥匈,產(chǎn)生了CART算法咐熙。

e.評價標準——評價函數(shù)

在決策樹構(gòu)建完成后棋恼,需要評價構(gòu)建的效果爪飘。這個評價效果是由決策樹每個葉子節(jié)點決定的师崎。

H(t):每個葉子節(jié)點的熵值犁罩。
Nt:葉子節(jié)點上總共的樣本數(shù)床估。

3.剪枝操作

當決策樹訓練完成后丐巫,并不是分完就完成了递胧。如果分的太細缎脾,可能會出現(xiàn)過擬合的情況遗菠。當對未知數(shù)據(jù)進行分類時舷蒲,效果可能不好。這時就需要剪枝操作域滥。剪枝操作分兩種启绰,分別是預剪枝(前置剪枝)和后剪枝(后置剪枝)委可。

a.預剪枝

在構(gòu)建時,加入一些條件拾酝,在訓練過程中控制決策樹的大小蒿囤。此方法用的較多材诽。預剪枝方法如下:

  1. 指定最大深度脸侥。當達到設定深度后,停止剪枝涝缝。
  2. 指定節(jié)點最小樣本數(shù)量,當小于某個值時臀规,停止剪枝塔嬉。

b.后剪枝

在決策樹構(gòu)建完成后恩袱,對樹進行剪枝操作畔塔。此方法使用較少澈吨。某個節(jié)點如果不進行分割時谅辣,損失值為:

Cα(T)=C(T)1+α

進行分割后桑阶,損失值為:

Cα(T)=C(T)2+α|Tleaf|

哪個損失值低,就采用哪個方法包归。參數(shù)α比較大時公壤,限制比較嚴,α比較小時沾鳄,限制較弱。

4.決策樹的集成——隨機森林

只構(gòu)造一棵樹的時候休弃,可能因為部分錯誤數(shù)據(jù)吞歼,或某些不重要的特征,造成樹過擬合或出現(xiàn)誤差塔猾。因此可以通過構(gòu)造很多樹篙骡,共同來進行決策,降低錯誤發(fā)生的概率丈甸。這種集成的算法叫做隨機森林糯俗。

  1. 隨機有兩層含義。第一睦擂,有放回的隨機采樣得湘。假設有100個數(shù)據(jù),隨機有放回采樣60個進行訓練顿仇。這樣能減少離譜數(shù)據(jù)和錯誤數(shù)據(jù)對樹造成影響。第二今膊,在特征上也進行隨機選擇恕刘,假設共有10個特征含蓉,每棵樹隨機選5個特征進行分類着降,降低不重要的特征對樹造成影響。

  2. 森林:訓練許多棵樹,例如訓練20棵。把新的數(shù)據(jù)分別用這20棵樹進行預測齿梁,結(jié)果遵循少數(shù)服從多數(shù)的原則稿辙,采用20棵樹中結(jié)果概率最大的分類吨娜。

5.sklearn建立決策樹:

在sklearn庫中勾扭,提供了決策樹分類方法。大致的步驟是:導入數(shù)據(jù)→訓練模型→預測數(shù)據(jù)笋鄙。

a.自帶數(shù)據(jù)包介紹

Sklearn中自帶了一些基礎(chǔ)的數(shù)據(jù)集,可供大家練手。例如iris鳶尾花數(shù)據(jù)集庶艾、digits手寫數(shù)字數(shù)據(jù)集蟹地、boston波士頓房價數(shù)據(jù)集遍愿。它們存放在sklearn.datasets中,只要導入坞笙,就可以使用了。

from sklearn import datasets
iris = datasets.load_iris()
boston = datasets.load_boston()

這些數(shù)據(jù)集有點類似于字典,存儲了所有的,包括樣本民傻、標簽喧半、元數(shù)據(jù)等信息构蹬。樣本數(shù)據(jù)存儲在.data中隐绵,它是一個二維數(shù)組,兩個維度分別是各樣本和各樣本的特征拙毫,大小為[n_samples, n_features]依许。對應標簽存儲在.target中,大小為[n_samples]缀蹄。因此峭跳,可以使用.data和.target可以查看樣本和標簽。

print (iris.data)
print (iris.target)

b.五行代碼構(gòu)造決策樹

以iris數(shù)據(jù)集為例缺前,鳶尾花數(shù)據(jù)集中包括了3個品種的150朵鳶尾花的數(shù)據(jù)蛀醉,數(shù)據(jù)有4個特征,分別是花瓣和花萼的長度和寬度衅码。以這組數(shù)據(jù)為例拯刁,使用sklearn對150個數(shù)據(jù)進行分類。我們要設置一個決策樹的學習器逝段,并根據(jù)需要設置參數(shù)垛玻。學習器也可以是其他類型,例如支持向量機奶躯、線性回歸等帚桩。

from sklearn import tree
clf = tree.DecisionTreeClassifier()

學習器設置完畢后,依次對模型進行擬合與預測嘹黔。讓學習器對數(shù)據(jù)進行擬合使用.fit函數(shù)账嚎,預測使用.predict函數(shù)。

clf = clf.fit (iris.data[:-2],iris.target[:-2])
clf.predict (iris.data[-2:])

以上代碼將數(shù)據(jù)集分成了兩部分儡蔓,從頭開始到倒數(shù)第二個值作為訓練樣本郭蕉,訓練完畢后,將最后兩個值作為未知樣本喂江,進行預測召锈。其中[:-2]表示從頭到倒數(shù)第二個值,[-2:]最后兩個值开呐。完整代碼如下:

from sklearn import datasets,tree
iris = datasets.load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data[:-2],iris.target[:-2])
print (clf.predict(iris.data[-2:]))

同樣的烟勋,對于隨機森林,一段簡單的操作代碼如下:

from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
iris =datasets.load_iris()
clf=RandomForestClassifier(n_estimators=5)
clf =clf.fit(iris.data[:-2],iris.target[:-2])
print (clf.predict(iris.data[-2:]))

c.參數(shù)簡介

以上是使用sklearn構(gòu)造的簡單的模型筐付。而sklearn.tree.DecisionTreeClassifier()這個類的構(gòu)造代碼如下:

class sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best',max_depth=None, min_samples_split=2, min_samples_leaf=1,min_weight_fraction_leaf=0.0, max_features=None, random_state=None,max_leaf_nodes=None, min_impurity_split=1e-07, class_weight=None, presort=False)

以下是一些參數(shù)簡介卵惦。

  1. criterion:建立劃分標準:例如gini系數(shù)、熵值劃分等
  2. splitter:best或random瓦戚,best是找到最好的切分點沮尿,random進行隨機的選擇。
  3. max_features:最多選多少個特征较解。特征少的時候不用設置畜疾。
  4. max_depth:指定樹最大深度是多少。避免數(shù)據(jù)太多時太龐大印衔。
  5. min_samples_split:樹進行節(jié)點切分時啡捶,某個節(jié)點樣本個數(shù)少于此數(shù)值,就不再向下切分了奸焙。因為切的越多瞎暑,越準確,但是過擬合的可能越大与帆。
  6. min_samples_leaf:限制葉子節(jié)點最少的樣本數(shù)了赌。如果葉子節(jié)點數(shù)目小于樣本數(shù),則會和兄弟節(jié)點一起被剪枝玄糟。
  7. min_weitht_fraction_leaf:權(quán)重項勿她。每個葉子節(jié)點加一個權(quán)重。當權(quán)重乘以葉子節(jié)點樣本個數(shù)太小阵翎,則被剪枝逢并。
  8. max_leaf_nodes:最大的葉子節(jié)點數(shù)。
  9. class_weight:樣本的權(quán)重項郭卫。處理不均衡的數(shù)據(jù)時筒狠,可以對這些數(shù)據(jù)進行權(quán)重預處理。
  10. min_impurity_split:限制決策樹的生成箱沦。切分后辩恼,如果gini系數(shù)等參考標準變化小于此值,停止切分谓形。

還有一些優(yōu)化問題和準確度計算等方面的內(nèi)容灶伊,以后再和大家討論。

本文參考:http://scikit-learn.org/stable/modules/tree.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寒跳,一起剝皮案震驚了整個濱河市聘萨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌童太,老刑警劉巖米辐,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胸完,死亡現(xiàn)場離奇詭異,居然都是意外死亡翘贮,警方通過查閱死者的電腦和手機赊窥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狸页,“玉大人锨能,你說我怎么就攤上這事∩衷牛” “怎么了址遇?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斋竞。 經(jīng)常有香客問我倔约,道長,這世上最難降的妖魔是什么坝初? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任跺株,我火速辦了婚禮,結(jié)果婚禮上脖卖,老公的妹妹穿的比我還像新娘乒省。我一直安慰自己,他們只是感情好畦木,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布袖扛。 她就那樣靜靜地躺著,像睡著了一般十籍。 火紅的嫁衣襯著肌膚如雪蛆封。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天勾栗,我揣著相機與錄音惨篱,去河邊找鬼。 笑死围俘,一個胖子當著我的面吹牛砸讳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播界牡,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼簿寂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宿亡?” 一聲冷哼從身側(cè)響起常遂,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挽荠,沒想到半個月后克胳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體平绩,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年漠另,在試婚紗的時候發(fā)現(xiàn)自己被綠了捏雌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡酗钞,死狀恐怖腹忽,靈堂內(nèi)的尸體忽然破棺而出来累,到底是詐尸還是另有隱情砚作,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布嘹锁,位于F島的核電站葫录,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏领猾。R本人自食惡果不足惜米同,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摔竿。 院中可真熱鬧面粮,春花似錦、人聲如沸继低。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袁翁。三九已至柴底,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粱胜,已是汗流浹背柄驻。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留焙压,地道東北人鸿脓。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像涯曲,于是被迫代替她去往敵國和親答憔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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