決策樹算法
理論部分可以參考西瓜書,本文主要總結一下決策樹算法在sklearn中的一些基本用法。
sklearn.tree
使用決策樹的流程
from sklearn import tree
clf = tree.DecisionTreeClassifier() #實例化
clf.fit(x_train,y_train) #訓練模型
result = clf.score(x_test,y_test) #測試
sklearn中的決策樹算法都包含在tree這個模塊中,使用時導入即可。
from skearn import tree
sklearn中包含了五個模塊
Column 1 | Column 2 |
---|---|
tree.DecisionTreeClassifier | 分類樹 |
tree.DecisionTreeRegressor | 迴歸樹 |
tree.export_graphviz | 將生成的樹導出爲DOT格式 |
tree.ExtraTreeClassifier | 高隨機版本的分類樹 |
tree.ExtraTreeClassifier | 高隨機版本的迴歸樹 |
1.tree.DecisionTreeClassifier
tree.DecisionTreeClassifier官網介紹
DecisionTreeClassifier的參數很多,其中比較重要的有以下幾個:
- criterion
- splitter & random_state
- max_depth
- min_samples_split & min_samples_leaf
- max_features & min_impurity_decrease
- class_weight & min_weight_fraction_leaf
下邊分別介紹這幾個參數的用法
1.1 criterion
在構建決策樹的時候,我們往往希望得到一棵最佳的樹,而這個最佳的衡量指標通常指不純度。一般來說,不純度越低,決策樹對訓練數據擬合的越好。
不純度有兩種計算方法:信息熵Entropy和Gini指數
criterion參數是用來決定計算不純度的方法,可以輸入‘entropy’或‘gini’,默認爲Gini係數。
應該注意的是,當參數選擇‘entropy’時,實際上sklearn計算的是該信息熵的信息增益,即父節點與這個節點信息熵的差值。
與Gini係數相比,信息熵對不純度更加敏感,在高維度數據或者噪音較多的數據中,選擇信息熵造成過擬合的可能性更大;在數據量較少,模型欠擬合的情況下,應該優先選擇信息熵。
1.2 splitter & random_state
splitter是決策樹的節點在進行分枝時選擇特徵的方式,有‘random’和‘best’兩種方式。‘best’代表決策樹的節點在分枝的時候優先選擇更加重要的特徵;‘random’會在選擇特徵的時候更加隨機,樹因此會因爲加入了不必要的特徵而變得更深更大,可以一定程度上防止過擬合現象的發生。
random_state用來設置分枝時隨機模式的參數,默認爲None。高維度時隨機性會表現得更明顯,低維度的數據隨機性幾乎不會出現。輸入一個整數時會生成同一棵樹。
這兩個參數都可以調節模型的過擬合情況。
1.3 剪枝參數
-
max_depth
限制樹的最大高度,超過的節點將被全部剪掉,建議從3開始設定,根據擬合效果繼續設置高度。 -
min_samples_leaf
一個節點在分枝後每個子節點至少包含min_samples_leaf個樣本,否則分枝不會發生,或者,分枝會朝着每個樣本都含有min_samples_leaf個樣本去分枝。一般從5開始,如果樣本包含的數量變化較大,可以輸入浮點數表示樣本量的百分比來使用。 -
min_samples_split
一個節點必須包含min_samples_split個樣本,否則這個節點的分枝不會發生 -
max_features
限制分枝時節點的特徵個數,超過數量的特徵將會被捨棄。但是在不知道模型的特徵重要性的情況下,使用這種方法可能會導致模型的學習力不夠。如果希望將高維的數據進行降維,建議使用PCA等降維方法。 -
min_impurity_decrease
限制節點的信息增益,如果節點的信息增益小於設定,分枝不會發生。
1.4 目標權重參數
-
class_weight
使樣本標籤平衡的參數。樣本不平衡指的是:標籤的一類佔有很大的比例,比如說飛機失事的概率爲1%(即失事:不失事=1:99),如果一個模型把全部的結果預測爲飛機不失事,那麼正確率也有99%,但是這種模型顯而易見並不是一個好的模型。所以可以對某些標籤賦予更大的權重,讓模型更偏向於少數類。該模型的參數默認爲None,即自動給予模型中所有標籤相同的權重。 -
min_weight_fraction_leaf
在設置了class_weight以後,如果需要剪枝,就需要搭配min_weight_fraction_leaf這個基於權重的剪枝參數來使用。
1.5 重要接口
分類決策樹有四個重要的接口,分別爲fit,score,predict,apply,下邊分別對這些參數進行簡單的介紹。
-
fit
用來對模型進行擬合,輸入訓練數據,得到訓練好的實例化模型clf = tree.DecisionTreeClassifier() clf.fit(x_train,y_train)
-
score
對模型的擬合效果進行評分,輸入測試數據,得到模型的評分clf = tree.DecisionTreeClassifier() clf.fit(x_train,y_train) clf.score(x_test,y_test)
-
predict
使用訓練好的模型,對測試數據進行預測,輸入測試數據,得到每個測試數據對應的結果clf = tree.DecisionTreeClassifier() clf.fit(x_train,y_train) clf.predict(x_test)
-
apply
返回每個測試樣本所在的葉子節點的索引clf = tree.DecisionTreeClassifier() clf.fit(x_train,y_train) clf.apply(x_test)
2. tree.DecisionTreeRegressor
DecisionTreeRegressor官網
迴歸樹和分類樹的大部分參數、接口的用法相同,需要注意的是,迴歸樹沒有標籤分別是否均衡的問題,因此沒有class_weight這個參數。