機器學(xué)習(xí):01.sklearn-決策樹

1 概述

1.1 決策樹是如何工作的

決策樹(Decision Tree)是一種非參數(shù)的有監(jiān)督學(xué)習(xí)方法敢课,它能夠從一系列有特征和標(biāo)簽的數(shù)據(jù)中總結(jié)出決策規(guī)則圈暗,并用樹狀圖的結(jié)構(gòu)來呈現(xiàn)這些規(guī)則雕擂,以解決分類和回歸問題。


決策樹

根節(jié)點:沒有進(jìn)邊北滥,有出邊。包含最初的闸翅,針對特征的提問再芋。
中間節(jié)點:既有進(jìn)邊也有出邊,進(jìn)邊只有一條,出邊可以有很多條。都是針對特征的提問纹坐。
葉子節(jié)點:有進(jìn)邊偎痛,沒有出邊司训,每個葉子節(jié)點都是一個類別標(biāo)簽构捡。
*子節(jié)點和父節(jié)點:在兩個相連的節(jié)點中,更接近根節(jié)點的是父節(jié)點壳猜,另一個是子節(jié)點勾徽。

決策樹解決的兩個問題:

1)如何從數(shù)據(jù)表中找出最佳節(jié)點和最佳分枝?
2)如何讓決策樹停止生長统扳,防止過擬合喘帚?

1.2 sklearn 中的決策樹

sklearn中決策樹的類都在”tree“這個模塊之下。這個模塊總共包含五個類:


主要是前三個

sklearn建模的基本流程

  1. 實例化咒钟,建立評估模型對象
  2. 通過模型接口訓(xùn)練模型
  3. 通過模型接口提取需要的信息

流程對應(yīng)代碼

from sklearn import tree #導(dǎo)入需要的模塊
clf = tree.DecisionTreeClassifier() #實例化
clf = clf.fit(X_train,y_train) #用訓(xùn)練集數(shù)據(jù)訓(xùn)練模型
result = clf.score(X_test,y_test) #導(dǎo)入測試集吹由,從接口中調(diào)用需要的信息

2. 決策樹的重要參數(shù)

2.1 criterion

決策樹需要找出最佳節(jié)點和最佳的分枝方法,衡量這個“最佳”的指標(biāo)叫做“不純度”盯腌。
Criterion這個參數(shù)是不純度的衡量指標(biāo)。sklearn提供了兩種選擇:
1)輸入”entropy“陨瘩,使用信息熵(Entropy)
2)輸入”gini“腕够,使用基尼系數(shù)(Gini Impurity)
sklearn實際計算的是基于信息熵的信息增益(Information Gain),即父節(jié)點的信息熵和子節(jié)點的信息熵之差舌劳。

怎么選取參數(shù)

通常就使用基尼系數(shù)
數(shù)據(jù)維度很大帚湘,噪音很大時使用基尼系數(shù)
維度低,數(shù)據(jù)比較清晰的時候甚淡,信息熵和基尼系數(shù)沒區(qū)別
當(dāng)決策樹的擬合程度不夠的時候大诸,使用信息熵
兩個都試試,不好就換另外一個

決策樹的基本流程如圖

image.png

建立一棵樹
1. 導(dǎo)入算法庫和模塊

from sklearn import tree
from sklearn.datasets import load_wine #datasets是一個數(shù)據(jù)庫贯卦,波士頓房價资柔,紅酒等
from sklearn.model_selection import train_test_split

2. 探索數(shù)據(jù)

wine = load_wine()
wine.data.shape
wine.target
#如果wine是一張表,應(yīng)該長這樣:
import pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
# concat是整合的功能 axis=1是按照列進(jìn)行合并
wine.feature_names
wine.target_names

3. 分訓(xùn)練集和測試集

#分訓(xùn)練集和測試集  XXYY的順序不能錯
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3) #輸入數(shù)據(jù)和標(biāo)簽撵割,tset的尺寸
Xtrain.shape
Xtest.shape

4. 建立模型

#建模三部曲:
##第一步:實例化
clf = tree.DecisionTreeClassifier(criterion='entropy') #criterion默認(rèn)是基尼系數(shù)gini
##第二步:將數(shù)據(jù)帶入訓(xùn)練
clf = clf.fit(Xtrain, Ytrain) #fit是訓(xùn)練的接口
##第三步:測試集打分
score = clf.score(Xtest, Ytest) #使用接口將測試集導(dǎo)入 score返回的就是預(yù)測準(zhǔn)確度accuracy

score

5. 畫分類樹

#畫分類樹
feature_name = ['酒精','蘋果酸','灰','灰的堿性','鎂','總酚','類黃酮','非黃烷類酚類','花青素','顏色強度','色調(diào)','od280/od315稀釋葡萄酒','脯氨酸']

import graphviz
##導(dǎo)入dot_data庫贿堰,和使用tree模塊中的export_graphviz;
dot_data = tree.export_graphviz(clf,
                                feature_names = feature_name,
                                class_names = ['琴酒','雪莉','貝爾摩德'],
                                filled = True, #filled是顏色填充
                                rounded = True) #rounded是框是否用方的

graph = graphviz.Source(dot_data) #將畫的數(shù)導(dǎo)出
graph
分類樹

6. 探索決策樹

clf.feature_importances_  #可以看到上述參與決策的屬性的貢獻(xiàn)度
[*zip(feature_name,clf.feature_importances_)]  #用zip將屬性名字和貢獻(xiàn)度形成元組

[('酒精', 0.0214182877897696),
('蘋果酸', 0.014284430762437107),
('灰', 0.0),
('灰的堿性', 0.0),
('鎂', 0.0),
('總酚', 0.0),
('類黃酮', 0.4412147442046806),
('非黃烷類酚類', 0.0),
('花青素', 0.0),
('顏色強度', 0.1536656722998869),
('色調(diào)', 0.0),
('od280/od315稀釋葡萄酒', 0.0),
('脯氨酸', 0.3694168649432258)]

**7. 控制決策樹

#random_state用來控制決策樹啡彬,不在進(jìn)行隨機選取一部分特征羹与,從中選取不純度相關(guān)指標(biāo)最優(yōu)的作為分枝用的節(jié)點的操作
clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=30)  #30沒有含義,只是固定決策樹
clf = clf.fit(Xtrain, Ytrain) 
score = clf.score(Xtest, Ytest) #返回預(yù)測的準(zhǔn)確度
score

2.2 random_state & splitter

random_state用來設(shè)置分枝中的隨機模式的參數(shù)庶灿,默認(rèn)是None; 輸入任意整數(shù)纵搁,會一直長出同一棵樹,讓模型穩(wěn)定下來往踢。

splitter也是用來控制決策樹中的隨機選項的腾誉,有兩種輸入值:
輸入”best",決策樹在分枝時雖然隨機,但是還是會優(yōu)先選擇更重要的特征進(jìn)行分枝(重要性可以通過屬性feature_importances_查看);
輸入“random"妄辩,決策樹在分枝時會更加隨機,防止過擬合的一種方式;

clf = tree.DecisionTreeClassifier(criterion="entropy"
,random_state=30
,splitter="random" #增加決策樹的隨機性楞黄,防止過擬合。
)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
score
import graphviz
dot_data = tree.export_graphviz(clf
,feature_names= feature_name
,class_names=["琴酒","雪莉","貝爾摩德"]
,filled=True
,rounded=True
)
graph = graphviz.Source(dot_data)
graph
得到的樹更深更大

2.3 剪枝參數(shù)

在不加限制的情況下雷蹂,一棵決策樹會生長到衡量不純度的指標(biāo)最優(yōu),這樣的決策樹往往會過擬合,這就是說,它會在訓(xùn)練集上表現(xiàn)很好,在測試集上卻表現(xiàn)糟糕,必然包含了訓(xùn)練樣本中的噪聲,并使它對未知數(shù)據(jù)的擬合程度不足撒强。
剪枝策略對決策樹的影響巨大芽隆,正確的剪枝策略是優(yōu)化決策樹算法的核心.

max_depth

限制樹的最大深度腕扶,超過設(shè)定深度的樹枝全部剪掉吨掌。實際使用時半抱,建議從n=3開始嘗試,看看擬合的效果再決定是否增加設(shè)定深度膜宋。

min_samples_leaf & min_samples_split

min_samples_leaf限定窿侈,一個節(jié)點在分枝后的每個子節(jié)點都必須包含至少min_samples_leaf個訓(xùn)練樣本; 從n=5開始使用。
min_samples_split限定激蹲,一個節(jié)點必須要包含至少min_samples_split個訓(xùn)練樣本棉磨,這個節(jié)點才允許被分枝江掩。

#參數(shù)調(diào)優(yōu) min_samples_leaf和min_samples_split
clf = tree.DecisionTreeClassifier(criterion="entropy"
,random_state=30
,splitter="random"
,max_depth=3 #代表的是分類樹只能有三層
# ,min_samples_leaf=10 #代表的是子節(jié)點必須有至少10個樣本
# ,min_samples_split=10 #代表的是節(jié)點必須有10個樣本学辱,才能向下進(jìn)行分層
)
clf = clf.fit(Xtrain, Ytrain)
dot_data = tree.export_graphviz(clf
,feature_names= feature_name
,class_names=["琴酒","雪莉","貝爾摩德"]
,filled=True
,rounded=True
)
graph = graphviz.Source(dot_data)
graph

clf.score(Xtrain,Ytrain)
clf.score(Xtest,Ytest)

max_features & min_impurity_decrease

max_features限制分枝時考慮的特征個數(shù),超過限制個數(shù)的特征都會被舍棄;
min_impurity_decrease限制信息增益的大小环形,信息增益小于設(shè)定數(shù)值的分枝不會發(fā)生.

確定最優(yōu)修剪參數(shù)

超參數(shù)的學(xué)習(xí)曲線策泣,是一條以超參數(shù)的取值為橫坐標(biāo),模型的度量指標(biāo)為縱坐標(biāo)的曲線抬吟,它是用來衡量不同超參數(shù)取值下模型的表現(xiàn)的線萨咕。在我們建好的決策樹里,我們的模型度量指標(biāo)就是score火本。

import matplotlib.pyplot as plt
test = []
for i in range(10):
clf = tree.DecisionTreeClassifier(max_depth=i+1
,criterion="entropy"
,random_state=30
,splitter="random"
)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()
超參數(shù)曲線

2.4 重要屬性和接口

屬性是在模型訓(xùn)練之后危队,能夠調(diào)用查看的模型的各種性質(zhì)。對決策樹來說钙畔,最重要的是feature_importances_茫陆;
接口:常用的接口有fit, score, apply, predict

#兩個常用的接口; 輸入的都是測試集的TEST
#apply返回每個測試樣本所在的葉子節(jié)點的索引
clf.apply(Xtest)

array([13, 12, 30, 30, 21, 7, 28, 4, 12, 30, 30, 30, 13, 4, 4, 13, 13,
7, 7, 16, 16, 10, 30, 16, 4, 30, 4, 12, 30, 16, 16, 10, 12, 30,
30, 4, 16, 4, 30, 4, 8, 10, 16, 30, 4, 30, 16, 4, 4, 9, 30,
4, 16, 16], dtype=int64)

#predict返回每個測試樣本的分類/回歸結(jié)果
clf.predict(Xtest)

array([1, 2, 0, 0, 1, 2, 0, 2, 2, 0, 0, 0, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1,
0, 1, 2, 0, 2, 2, 0, 1, 1, 1, 2, 0, 0, 2, 1, 2, 0, 2, 1, 1, 1, 0,
2, 0, 1, 2, 2, 2, 0, 2, 1, 1])

總結(jié)

七個參數(shù):Criterion擎析,兩個隨機性相關(guān)的參數(shù)(random_state簿盅,splitter),四個剪枝參數(shù)(max_depth, ,
min_sample_leaf桨醋,max_feature棚瘟,min_impurity_decrease)
一個屬性:feature_importances_
四個接口:fit,score喜最,apply偎蘸,predict

2.5 實例:分類樹在合成數(shù)集上的表現(xiàn)

依次是月亮型,環(huán)形和對半分?jǐn)?shù)據(jù)

分類樹天生不擅長環(huán)形數(shù)據(jù)返顺。
最擅長月亮型數(shù)據(jù)的是最近鄰算法禀苦,RBF支持向量機和高斯過程;
最擅長環(huán)形數(shù)據(jù)的是最近鄰算法和高斯過程遂鹊;
最擅長對半分的數(shù)據(jù)的是樸素貝葉斯振乏,神經(jīng)網(wǎng)絡(luò)和隨機森林。

參考菜菜老師的sklearn課程秉扑!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慧邮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舟陆,更是在濱河造成了極大的恐慌误澳,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秦躯,死亡現(xiàn)場離奇詭異忆谓,居然都是意外死亡,警方通過查閱死者的電腦和手機踱承,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門倡缠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茎活,你說我怎么就攤上這事昙沦。” “怎么了载荔?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵盾饮,是天一觀的道長。 經(jīng)常有香客問我懒熙,道長丘损,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任工扎,我火速辦了婚禮徘钥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘定庵。我一直安慰自己吏饿,他們只是感情好踪危,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猪落,像睡著了一般贞远。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笨忌,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天蓝仲,我揣著相機與錄音,去河邊找鬼官疲。 笑死袱结,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的途凫。 我是一名探鬼主播垢夹,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼维费!你這毒婦竟也來了果元?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤犀盟,失蹤者是張志新(化名)和其女友劉穎而晒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阅畴,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡倡怎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贱枣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片监署。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冯事,靈堂內(nèi)的尸體忽然破棺而出焦匈,到底是詐尸還是另有隱情血公,我是刑警寧澤昵仅,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站累魔,受9級特大地震影響摔笤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垦写,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一吕世、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梯投,春花似錦命辖、人聲如沸况毅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尔许。三九已至,卻和暖如春终娃,著一層夾襖步出監(jiān)牢的瞬間味廊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工棠耕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留余佛,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓窍荧,卻偏偏與公主長得像辉巡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蕊退,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

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