1. 程式人生 > >sklearn——決策樹

sklearn——決策樹

初步 繼續 節點數 剪枝 write 如果 ring 導致 auto

1、相關庫:

sklearn中分類樹與回歸樹用到的類不同,對於分類樹:sklearn.tree.DecisionTreeClassifier;對於回歸樹:sklearn.tree.DecisionTreeRegressor。

兩者的參數區別如下表(搬運於https://www.cnblogs.com/pinard/p/6056319.html):

參數 DecisionTreeClassifier DecisionTreeRegressor

特征選擇標準criterion

可以使用"gini"或者"entropy",前者代表基尼系數,後者代表信息增益。一般說使用默認的基尼系數"gini"就可以了,即CART算法。除非你更喜歡類似ID3, C4.5的最優特征選擇方法。

可以使用"mse"或者"mae",前者是均方差,後者是和均值之差的絕對值之和。推薦使用默認的"mse"。一般來說"mse"比"mae"更加精確。除非你想比較二個參數的效果的不同之處。

特征劃分點選擇標準splitter

可以使用"best"或者"random"。前者在特征的所有劃分點中找出最優的劃分點。後者是隨機的在部分劃分點中找局部最優的劃分點。

默認的"best"適合樣本量不大的時候,而如果樣本數據量非常大,此時決策樹構建推薦"random"

劃分時考慮的最大特征數max_features

可以使用很多種類型的值,默認是"None",意味著劃分時考慮所有的特征數;如果是"log2"意味著劃分時最多考慮

log2Nlog2N個特征;如果是"sqrt"或者"auto"意味著劃分時最多考慮N−−√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_impurity_split

這個值限制了決策樹的增長,如果某節點的不純度(基尼系數,信息增益,均方差,絕對差)小於這個閾值,則該節點不再生成子節點。即為葉子節點 。

數據是否預排序presort

這個值是布爾值,默認是False不排序。一般來說,如果樣本量少或者限制了一個深度很小的決策樹,設置為true可以讓劃分點選擇更加快,決策樹建立的更加快。如果樣本量太大的話,反而沒有什麽好處。問題是樣本量少的時候,我速度本來就不慢。所以這個值一般懶得理它就可以了。

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

    1)當樣本少數量但是樣本特征非常多的時候,決策樹很容易過擬合,一般來說,樣本數比特征數多一些會比較容易建立健壯的模型

    2)如果樣本數量少但是樣本特征非常多,在擬合決策樹模型前,推薦先做維度規約,比如主成分分析(PCA),特征選擇(Losso)或者獨立成分分析(ICA)。這樣特征的維度會大大減小。再來擬合決策樹模型效果會好。

    3)推薦多用決策樹的可視化(下節會講),同時先限制決策樹的深度(比如最多3層),這樣可以先觀察下生成的決策樹裏數據的初步擬合情況,然後再決定是否要增加深度。

    4)在訓練模型先,註意觀察樣本的類別情況(主要指分類樹),如果類別分布非常不均勻,就要考慮用class_weight來限制模型過於偏向樣本多的類別。

    5)決策樹的數組使用的是numpy的float32類型,如果訓練數據不是這樣的格式,算法會先做copy再運行。

    6)如果輸入的樣本矩陣是稀疏的,推薦在擬合前調用csc_matrix稀疏化,在預測前調用csr_matrix稀疏化。

2、關於可視化

sklearn需要用到graphviz這個軟件來進行可視化,比較麻煩,需要搭建相關的環境,搭建方式如下:

1、安裝graphviz。下載地址在:http://www.graphviz.org/,下載2.38的msi,安裝完成之後要設置PATH,我的是D:/Graphviz2.38/bin/,將其加入到PATH。

2、安裝庫pip install graphviz,pip install pydotplus。

3、實例代碼:

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix,accuracy_score
from sklearn import tree
import pydotplus
import os

os.environ["PATH"] += os.pathsep + F:\\Graphviz2.38\\bin  #設定環境在可視化軟件的bin下
iris_load=load_iris()
x_train,x_test,y_train,y_test=train_test_split(iris_load[data],iris_load[target],test_size=0.3,random_state=1)   #劃分數據集為測試集與訓練集
dtree=DecisionTreeClassifier(criterion=gini)   #創建分類決策樹類
dtree.fit(x_train,y_train)   #擬合模型
dtree.predict(x_test)    #測試集預測
confusion_matrix(y_test,dtree.predict(x_test))   #查看混淆矩陣
accuracy_score(y_test,dtree.predict(x_test))     #計算精確度

dot_data = tree.export_graphviz(dtree, out_file=None)   #生成dot數據
graph = pydotplus.graph_from_dot_data(dot_data)     #將dot數據轉化為圖形
graph.write_pdf("C:\\Users\\daiyun\\Desktop\\iris.pdf")     #需要用到Graphviz軟件,所以之前要先os.environ

代碼說明:

1、os庫用來限定安裝的Graphviz2.38的環境PATH,雖然之前有設置環境,但是python可能仍然查找不到Graphviz2.38。

2、函數tree.export_graphviz(dtree)用來輸出一個dot_data類型的string數據。其參數可以設置顯示的分類名稱、顏色等,這裏未設置,詳情請查看說明文檔:https://scikit-learn.org/stable/modules/generated/sklearn.tree.export_graphviz.html#sklearn.tree.export_graphviz

3、函數pydotplus.graph_from_dot_data(dot_data)將dot_data的string數據轉換成圖形。

4、函數graph.write_pdf("C:\\Users\\daiyun\\Desktop\\iris.pdf") ,用於輸出pdf文件。

sklearn——決策樹