帶你走進sklearn系列1
資料來源:菜菜B站視頻
文章內(nèi)容:決策樹的基本概念和實戰(zhàn)應用。不會展示公式原理,偏重于實戰(zhàn)應用吭净。
無意中翻到了菊安醬和菜菜的博客,大家可以去看一下:https://www.cnblogs.com/juanjiang/p/11003369.html
概述
決策樹是一種非參數(shù)的有監(jiān)督學習算法肴甸,非參數(shù)是說參數(shù)數(shù)量會隨著訓練樣本增長的算法寂殉。
具體可以去看:https://www.cnblogs.com/wwwjjjnnn/p/9126906.html
核心問題
- 誰是最佳分枝點
- 什么時候停止分枝
模塊sklearn.tree
共包含4種樹和3種樹的輸出形式,官方教程:https://scikit-learn.org/stable/modules/classes.html#module-sklearn.tree
- tree.DecisionTreeClassifier() 分類樹 ****今日重點**
- tree.DecisionTreeRegressor() 回歸樹
- tree.ExtraTreeClassifier() 高隨機版本的分類樹
- tree.ExtraTreeRegressor() 高隨機版本的回歸樹
- tree.export_graphviz(decision_tree) 輸出DOT格式的圖
- tree.export_text(decision_tree) 輸出決策樹規(guī)則的文本
- tree.plot_tree(decision_tree) 畫決策樹
重要參數(shù)--8個
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_decrease=0.0, min_impurity_split=None, class_weight=None, presort='deprecated', ccp_alpha=0.0)
1.criterion
用來決定不純度的計算方法:entropy原在、gini友扰。樹中的每一個節(jié)點都有不純度彤叉,葉子節(jié)點的不純度最低。
一般默認使用gini村怪,當決策樹擬合程度不夠時秽浇,再試試信息熵,信息熵對訓練集擬合的比較精細甚负,但往往也容易過擬合柬焕,兩者基本沒太大差別。選擇不純度最低的節(jié)點(就是最純的梭域,最容易直接分類的特征)進行分枝击喂,決策樹在分枝時,其實使用的是信息增益碰辅。
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
wine = load_wine()
利用紅酒數(shù)據(jù)集建一棵樹懂昂,數(shù)據(jù)集中字段包括:wine.data,wine.target,wine.target_names,wine.feature_names,該數(shù)據(jù)集是一個三分類數(shù)據(jù)没宾。
# 做成一個表凌彬,來瞅一下,最后一列就是標簽
import pandas as pd
data = pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
data.head(3)
# 劃分數(shù)據(jù)集,注意前面一定是xxyy循衰,test_size可以自己設定7:3還是8:2
x_train,x_test,y_train,y_test = train_test_split(wine.data,wine.target,test_size=0.3)
print("x_train的維度{}铲敛,wine.date的維度{}".format(x_train.shape,wine.data.shape))
x_train的維度(124, 13),wine.date的維度(178, 13)
2.random_state & splitter
sklearn通過在分枝時隨機選取部分特征進行優(yōu)化会钝,進而建立很多棵樹伐蒋,返回最好的樹。
在高維度的數(shù)據(jù)中迁酸,每次運行下面的模型先鱼,會返回不同的分數(shù)。為保持結果穩(wěn)定奸鬓,設定random_state參數(shù)焙畔。
splitter控制隨機選項,有兩個參數(shù):'best'根據(jù)重要程度選取特征;'random'在分枝時更隨機,對訓練集的擬合度會降低串远。 所以如果你本身特征就比較多宏多,為了防止過擬合可以設置這兩個參數(shù)。
# 建脑璺#看一下
clf = tree.DecisionTreeClassifier(criterion='entropy'
,random_state=30
,splitter='random'
)
clf = clf.fit(x_train,y_train)
score = clf.score(x_test,y_test)
print('模型分數(shù):%.4f' %score)
import graphviz
feature_name = ['酒精','蘋果酸','灰','灰的堿性','鎂','總酚','類黃酮','飛黃烷類酚類','花青素','顏色強度','色調','稀釋葡萄酒','脯氨酸']
dot_data = tree.export_graphviz(clf
,feature_names=feature_name
,class_names=['琴酒','雪莉','貝爾摩德']
,filled=True # 顏色填充
,rounded=True # 圓角
)
graph = graphviz.Source(dot_data)
graph
graphviz要自己另外安裝伸但,記得加入path。
查看特征排名
# 特征重要性的排名
clf.feature_importances_
# *zip()進行解壓
[*zip(feature_name,clf.feature_importances_)]
3.剪枝參數(shù)(5個)
- max_depth 限制樹的深度留搔,在高維度低樣本的訓練中非常有效更胖。建議從=3開始嘗試,看擬合效果再決定是否增加深度。
-
min_samples_leaf
節(jié)點分枝后的每個子節(jié)點包含的樣本數(shù)必須包含的樣本個數(shù)函喉,一般搭配max_depth使用避归,建議從=5開始使用。 -
min_samples_split
一個節(jié)點必須包含的樣本數(shù)管呵,小于這個樣本數(shù)梳毙,就不會允許繼續(xù)分枝。 -
max_features
限制分枝時考慮的特征個數(shù)捐下,是一個比較暴力的強行使決策樹停下的參數(shù)账锹。如果希望降維選取重要特征,建議改用PCA坷襟、ICA或其他特征選擇模塊中的降維算法奸柬,盲目限制該參數(shù),可能會使模型學習能力不足婴程。 -
min_impurity_decrease
當信息增益小于限定的數(shù)值時廓奕,不會再分枝。
一般來講max_depth+min_samples_leaf|min_samples_split就可以完成調參档叔,后面的參數(shù)設置屬于精修范圍桌粉。
# 對訓練集的擬合程度---“太完美了”
train_score=clf.score(x_train,y_train)
train_score
進行剪枝,參數(shù)是隨便修改的衙四,該結果并不是最優(yōu) 铃肯,重點看參數(shù)設置后的變化
cut_clf = tree.DecisionTreeClassifier(criterion='entropy'
,random_state=30
,splitter='random'
,max_depth=4
,min_samples_leaf=5
,min_samples_split=45
)
cut_clf = cut_clf.fit(x_train,y_train)
cut_score = cut_clf.score(x_test,y_test)
print('模型分數(shù):%.4f' %cut_score)
cut_dot_data = tree.export_graphviz(cut_clf
,feature_names=feature_name
,class_names=['琴酒','雪莉','貝爾摩德']
,filled=True # 顏色填充
,rounded=True # 圓角
)
cut_graph = graphviz.Source(cut_dot_data)
cut_graph
如何調參
學習曲線的使用
以超參數(shù)的取值為橫坐標,模型的度量值為縱坐標传蹈。
import matplotlib.pyplot as plt
%matplotlib inline
test = []
for i in range(10):
clf = tree.DecisionTreeClassifier(max_depth=i+1
,criterion='entropy'
,random_state=30
)
clf = clf.fit(x_train,y_train)
score = clf.score(x_test,y_test)
test.append(score)
plt.plot(range(1,11),test,color='red',label='max_depth')
plt.legend()
plt.show()
- 剪枝參數(shù)不一定提高模型在測試集上的表現(xiàn)押逼,這取決于數(shù)據(jù)本身。
- 遺留問題:多參數(shù)調參(后面補上)
目標權重參數(shù)
-
class_weight & min_weight_fraction_leaf
當樣本類別不平衡時設置的參數(shù)惦界,默認為None挑格,所有標簽具有相同權重。
樣本加權之后使用min_weight_fraction_leaf配合調參表锻。
重要屬性
- feature_importances_
訓練之后恕齐,調用clf.feature_importances_查看特征重要程度。
與特征名一起解壓瞬逊,得到(特征,權重)元組仪或。
重要接口
- fit()
- score()
- apply()
返回樣本點所在葉子節(jié)點的索引确镊。 - predict()
返回樣本分類/回歸的結果。
總結
決策樹一共講了8個參數(shù)范删,1個屬性蕾域,4個接口 。
8個參數(shù) | 4個接口 | 1個屬性 |
---|---|---|
criterion計算不純度 | fit() | feature_importances_ |
random_state & splitters隨機項設置 | score() | |
max_depth剪枝參數(shù) | apply() | |
min_samples_leaf & min_samples_split 剪枝參數(shù) | predict() | |
max_features & min_impurity_decrease 剪枝參數(shù) | ||
class_weight & min_weight_fraction_leaf 類別權重 |