1. 程式人生 > >scikit-learn決策樹演算法庫使用小結

scikit-learn決策樹演算法庫使用小結

1. scikit-learn決策樹演算法庫類庫介紹

scikit-learn決策樹演算法類庫內部實現是使用了調優過的CART樹演算法,既可以做分類,又可以做迴歸。分類決策樹的類對應的是DecisionTreeClassifier,而回歸決策樹的類對應的是DecisionTreeRegressor。兩者的引數定義幾乎完全相同,但是意義不全相同。下面就對DecisionTreeClassifier和DecisionTreeRegressor的重要引數做一個總結,重點比較兩者引數使用的不同點和調參的注意點。

2. DecisionTreeClassifier和DecisionTreeRegressor重要引數調參注意點

為了便於比較,這裡我們用表格的形式對DecisionTreeClassifier和DecisionTreeRegressor重要引數要點做一個比較。

引數 DecisionTreeClassifier DecisionTreeRegressor
特徵選擇標準(criterion) 可以使用”gini”或者”entropy”,前者代表基尼係數,後者代表資訊增益。一般說使用預設的基尼係數”gini”就可以了,即CART演算法,除非你更喜歡類似ID3,C4.5的最優特徵選擇演算法 可以使用”mse”或者”mae”,前者是均方差,後者是和均值之差的絕對值之和。推薦使用預設的”mse”比”mae”更加精確。除非你想比較兩個引數效果的不同之處。
特徵劃分點選擇標準(splitter) 可以使用”best”或”random”。前者在特徵的所有劃分點中找出最優的劃分點,後者是隨機在部分區域性的劃分點中找到區域性最優的劃分點。預設的”best”適合樣本量不大的時候,而如果樣本量資料非常大,此時決策樹構建推薦”random”
劃分時考慮的最大特徵數max_features 可以使用很多種型別的值,預設是”None”,意味著劃分時考慮所有的特徵數;如果是”log2”意味著劃分時最多考慮l
og2N
個特徵;如果是”sqrt”或者”auto”意味著劃分時最多考慮N個特徵。如果是整數,代表考慮的特徵絕對數。如果是浮點數,代表考慮特徵百分比,即考慮(百分比xN)取整後的特徵數。其中N為樣本總特徵數。一般來說,如果樣本特徵數不多,比如小於50,我們用預設的”None”就可以了,如果特徵數非常多,我們可以靈活使用剛才描述的其他取值來控制劃分時考慮的最大特徵數,以控制決策樹的生成時間。
決策樹最大深max_depth 決策樹的最大深度,預設可以不輸入,如果不輸入的話,決策樹在建立子樹的時候不會限制子樹的深度。一般來說,資料少或者特徵少的時候可以不管這個值。如果模型樣本量多,特徵也多的情況下,推薦限制這個最大深度,具體的取值取決於資料的分佈。常用的可以取值10-100之間。
內部節點再劃分所需最小樣本數min_samples_split 這個值限制了子樹繼續劃分的條件,如果某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特徵來進行劃分。 預設是2.如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。我之前的一個專案例子,有大概10萬樣本,建立決策樹時,我選擇了min_samples_split=10。可以作為參考。
葉子節點最少樣本數min_samples_leaf 這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小於樣本數,則會和兄弟節點一起被剪枝。 預設是1,可以輸入最少的樣本數的整數,或者最少樣本數佔樣本總數的百分比。如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。之前的10萬樣本專案使用min_samples_leaf的值為5,僅供參考。
葉子節點最小的樣本權重和min_weight_fraction_leaf 這個值限制了葉子節點所有樣本權重和的最小值,如果小於這個值,則會和兄弟節點一起被剪枝。 預設是0,就是不考慮權重問題。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分佈類別偏差很大,就會引入樣本權重,這時我們就要注意這個值了。
最大葉子節點數max_leaf_nodes 通過限制最大葉子節點數,可以防止過擬合,預設是”None”,即不限制最大的葉子節點數。如果加了限制,演算法會建立在最大葉子節點數內最優的決策樹。如果特徵不多,可以不考慮這個值,但是如果特徵分成多的話,可以加以限制,具體的值可以通過交叉驗證得到。
類別權重class_weight 指定樣本各類別的的權重,主要是為了防止訓練集某些類別的樣本過多,導致訓練的決策樹過於偏向這些類別。這裡可以自己指定各個樣本的權重,或者用“balanced”,如果使用“balanced”,則演算法會自己計算權重,樣本量少的類別所對應的樣本權重會高。當然,如果你的樣本類別分佈沒有明顯的偏倚,則可以不管這個引數,選擇預設的”None”
葉子節點最小的樣本權重和min_weight_fraction_leaf 這個值限制了葉子節點所有樣本權重和的最小值,如果小於這個值,則會和兄弟節點一起被剪枝。 預設是0,就是不考慮權重問題。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分佈類別偏差很大,就會引入樣本權重,這時我們就要注意這個值了。 不適合於迴歸樹
節點劃分最小不純度min_impurity_split 這個值限制了決策樹的增長,如果某節點的不純度(基尼係數,資訊增益,均方差,絕對差)小於這個閾值,則該節點不再生成子節點。即為葉子節點 。
資料是否預排序presort 這個值是布林值,預設是False不排序。一般來說,如果樣本量少或者限制了一個深度很小的決策樹,設定為true可以讓劃分點選擇更加快,決策樹建立的更加快。如果樣本量太大的話,反而沒有什麼好處。問題是樣本量少的時候,我速度本來就不慢。所以這個值一般懶得理它就可以了。

除了這些引數要注意以外,其他在調參時的注意點有:

  1. 當樣本少數量但是樣本特徵非常多的時候,決策樹很容易過擬合,一般來說,樣本數比特徵數多一些會比較容易建立健壯的模型。
  2. 如果樣本數量少但是樣本特徵非常多,在擬合決策樹模型前,推薦先做維度規約,比如主成分分析(PCA),特徵選擇(Losso)或者獨立成分分析(ICA)。這樣特徵的維度會大大減小。再來擬合決策樹模型效果會好。
  3. 推薦多用決策樹的視覺化(下節會講),同時先限制決策樹的深度(比如最多3層),這樣可以先觀察下生成的決策樹裡資料的初步擬合情況,然後再決定是否要增加深度。
  4. 在訓練模型先,注意觀察樣本的類別情況(主要指分類樹),如果類別分佈非常不均勻,就要考慮用class_weight來限制模型過於偏向樣本多的類別。
  5. 決策樹的陣列使用的是numpy的float32型別,如果訓練資料不是這樣的格式,演算法會先做copy再執行。
  6. 如果輸入的樣本矩陣是稀疏的,推薦在擬合前呼叫csc_matrix稀疏化,在預測前呼叫csr_matrix稀疏化。