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建模的基本流程
- 實例化咒钟,建立評估模型對象
- 通過模型接口訓(xùn)練模型
- 通過模型接口提取需要的信息
流程對應(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)決策樹的擬合程度不夠的時候大诸,使用信息熵
兩個都試試,不好就換另外一個
決策樹的基本流程如圖
建立一棵樹
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()
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)形數(shù)據(jù)返顺。
最擅長月亮型數(shù)據(jù)的是最近鄰算法禀苦,RBF支持向量機和高斯過程;
最擅長環(huán)形數(shù)據(jù)的是最近鄰算法和高斯過程遂鹊;
最擅長對半分的數(shù)據(jù)的是樸素貝葉斯振乏,神經(jīng)網(wǎng)絡(luò)和隨機森林。