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

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

    之前對決策樹的演算法原理做了總結,包括決策樹演算法原理(上)決策樹演算法原理(下)。今天就從實踐的角度來介紹決策樹演算法,主要是講解使用scikit-learn來跑決策樹演算法,結果的視覺化以及一些引數調參的關鍵點。

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

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

2. DecisionTreeClassifierDecisionTreeClassifier 重要引數調參注意點

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

引數 DecisionTreeClassifier DecisionTreeRegressor

特徵選擇標準criterion

可以使用"gini"或者"entropy",前者代表基尼係數,後者代表資訊增益。一般說使用預設的基尼係數"gini"就可以了,即CART演算法。除非你更喜歡類似ID3, C4.5的最優特徵選擇方法。 

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

特徵劃分點選擇標準splitter

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

預設的"best"適合樣本量不大的時候,而如果樣本資料量非常大,此時決策樹構建推薦"random" 

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

可以使用很多種型別的值,預設是"None",意味著劃分時考慮所有的特徵數;如果是"log2"意味著劃分時最多考慮$log_2N$個特徵;如果是"sqrt"或者"auto"意味著劃分時最多考慮$\sqrt{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稀疏化。

3. scikit-learn決策樹結果的視覺化 

    決策樹視覺化化可以方便我們直觀的觀察模型,以及發現模型中的問題。這裡介紹下scikit-learn中決策樹的視覺化方法。

    完整程式碼見我的github: https://github.com/ljpzzz/machinelearning/blob/master/classic-machine-learning/decision_tree_classifier.ipynb

3.1 決策樹視覺化環境搭建

    scikit-learn中決策樹的視覺化一般需要安裝graphviz。主要包括graphviz的安裝和python的graphviz外掛的安裝。

    第一步是安裝graphviz。下載地址在:http://www.graphviz.org/。如果你是linux,可以用apt-get或者yum的方法安裝。如果是windows,就在官網下載msi檔案安裝。無論是linux還是windows,裝完後都要設定環境變數,將graphviz的bin目錄加到PATH,比如我是windows,將C:/Program Files (x86)/Graphviz2.38/bin/加入了PATH

    第二步是安裝python外掛graphviz: pip install graphviz

    第三步是安裝python外掛pydotplus。這個沒有什麼好說的: pip install pydotplus

    這樣環境就搭好了,有時候python會很笨,仍然找不到graphviz,這時,可以在程式碼裡面加入這一行:

    os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'

    注意後面的路徑是你自己的graphviz的bin目錄。

3.2 決策樹視覺化的三種方法

    這裡我們有一個例子講解決策樹視覺化。

    首先載入類庫:

from sklearn.datasets import load_iris
from sklearn import tree
import sys
import os       
os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'

    接著載入sciki-learn的自帶資料,有決策樹擬合,得到模型:

iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)

    現在可以將模型存入dot檔案iris.dot。

with open("iris.dot", 'w') as f:
    f = tree.export_graphviz(clf, out_file=f)

    這時候我們有3種視覺化方法,第一種是用graphviz的dot命令生成決策樹的視覺化檔案,敲完這個命令後當前目錄就可以看到決策樹的視覺化檔案iris.pdf.開啟可以看到決策樹的模型圖。

#注意,這個命令在命令列執行
dot -Tpdf iris.dot -o iris.pdf

    第二種方法是用pydotplus生成iris.pdf。這樣就不用再命令列去專門生成pdf檔案了。

import pydotplus 
dot_data = tree.export_graphviz(clf, out_file=None) 
graph = pydotplus.graph_from_dot_data(dot_data) 
graph.write_pdf("iris.pdf") 

    第三種辦法是個人比較推薦的做法,因為這樣可以直接把圖產生在ipython的notebook。程式碼如下:

from IPython.display import Image  
dot_data = tree.export_graphviz(clf, out_file=None, 
                         feature_names=iris.feature_names,  
                         class_names=iris.target_names,  
                         filled=True, rounded=True,  
                         special_characters=True)  
graph = pydotplus.graph_from_dot_data(dot_data)  
Image(graph.create_png()) 

    在ipython的notebook生成的圖如下:

  

4. DecisionTreeClassifier例項

    這裡給一個限制決策樹層數為4的DecisionTreeClassifier例子。

    完整程式碼見我的github: https://github.com/ljpzzz/machinelearning/blob/master/classic-machine-learning/decision_tree_classifier_1.ipynb

from itertools import product

import numpy as np
import matplotlib.pyplot as plt

from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier


# 仍然使用自帶的iris資料
iris = datasets.load_iris()
X = iris.data[:, [0, 2]]
y = iris.target

# 訓練模型,限制樹的最大深度4
clf = DecisionTreeClassifier(max_depth=4)
#擬合模型
clf.fit(X, y)


# 畫圖
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                     np.arange(y_min, y_max, 0.1))

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.8)
plt.show()

    得到的圖如下:


    接著我們視覺化我們的決策樹,使用了推薦的第三種方法。程式碼如下:

from IPython.display import Image  
from sklearn import tree
import pydotplus 
dot_data = tree.export_graphviz(clf, out_file=None, 
                         feature_names=iris.feature_names,  
                         class_names=iris.target_names,  
                         filled=True, rounded=True,  
                         special_characters=True)  
graph = pydotplus.graph_from_dot_data(dot_data)  
Image(graph.create_png()) 

    生成的決策樹圖如下:

 

    以上就是scikit-learn決策樹演算法使用的一個總結,希望可以幫到大家。

(歡迎轉載,轉載請註明出處。歡迎溝通交流: [email protected]) 

相關推薦

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

    之前對決策樹的演算法原理做了總結,包括決策樹演算法原理(上)和決策樹演算法原理(下)。今天就從實踐的角度來介紹決策樹演算法,主要是講解使用scikit-learn來跑決策樹演算法,結果的視覺化以及一些引數調參的關鍵點。 1. scikit-learn決策樹演算法類庫介紹     scikit-lear

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

1. scikit-learn決策樹演算法庫類庫介紹 scikit-learn決策樹演算法類庫內部實現是使用了調優過的CART樹演算法,既可以做分類,又可以做迴歸。分類決策樹的類對應的是DecisionTreeClassifier,而回歸決策樹的類對應的是De

skiti-learn決策演算法

skiti-learn內部實現的是調優過的CART決策樹。既可以做分類,也可以做迴歸。分類決策樹採用的類是DecisionTreeClassifier,迴歸則是DecisionTreeRegressor。 DecisionTreeClassifier and DecisionTr

scikit-learn學習之決策演算法

======================================================================本系列部落格主要參考 Scikit-Learn 官方網站上的每

Scikit-learn的kmeans聚

otl pre sha matplot kmeans div 聚類 .net class 1. 生成隨機的二維數據: import numpy as np x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 9])

決策演算法(ID3,C4.5,CART)

ID3,C4.5,CART是是決策樹的核心演算法。它們都由特徵選擇,樹的生成,剪枝組成。但ID3和C4.5用於分類,CART可用於分類與迴歸。 1.ID3演算法 ID3演算法遞迴地構建決策樹,從根節點開始,對所有特徵計算資訊增益,選擇資訊增益最大的特徵作為節點的特徵,由該特徵的不同取值建

決策演算法--ID3

原創: 袁恆  Refinitiv創新實驗室ARGO  9月17日 稽核: 施天璐 單華 傅佳  編輯:張翔 一 什麼是決策樹 決策樹是機器學習方法中的一種監督學習演算法,表示根據特徵對樣本進行分類的樹形結構,可以用於分類和迴歸。 它的思路大概是這樣

R_Studio(決策演算法)鳶尾花卉資料集Iris是一類多重變數分析的資料集

       鳶尾花卉資料集Iris是一類多重變數分析的資料集。通過花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性預測鳶尾花卉屬於(Setosa,Versicolour,Virginica)三個種類中的哪一類     針對iris資料集實踐決策樹演算法(C4.5、C5.0

學習筆記(五):使用決策演算法檢測POP3暴力破解

1.資料蒐集     載入KDD 99中的資料: def load_kdd99(filename): x=[] with open(filename) asf: for line in f: line=line.st

基於sklearn的決策演算法

1、決策樹介紹 決策樹簡單的理解為if-then的集合,其優點主要有分類速度快、可讀性等。決策樹的生成主要可分為三個步驟:特徵的選擇、決策樹的生成、決策樹的剪枝。 1.1特徵選擇 對於結點的選擇,總得需要一個計算方法來實現,這個方法的目標是優先選擇分類能力強的特徵,這樣才提高

skiti-learn 支援向量機(SVM)

SVM演算法庫分為兩類,一類是分類演算法庫,SVC,NuSVC,LinearSVC;另一類是迴歸演算法庫,SVR,NuSVR,LinearSVR。 分類演算法庫中,SVC,NuSVC差不多,區別在於損失的度量方式不同;LinearSVC是線性分類,不支援從低維到高維的核函式,僅僅支援線性核函

小白自學機器學習之一文讀懂決策演算法詳解

1.概念準備 1.1 遞迴與迭代 迭代是人,遞迴是神。 區別 定義 優缺點 遞迴(recursion) 程式呼叫自身

機器學習_8.決策演算法

1.ID3演算法 預備知識 1.資訊熵: 2.資訊增益      演算法內容 引入了資訊理論中的互資訊(資訊增益)作為選擇判別因素的度量,即:以資訊增益的下降速度作為選取分類屬性的標準,所選的測試屬性是從根節點到當前節點的路徑上從沒有

Pyhton實現決策演算法 MNIST資料集

Pyhton實現決策樹演算法 MNIST資料集 決策樹是一種比較接近人類思維方式的演算法,將樣本通過每個特徵值的資訊增益進行劃分,從而保證每個劃分之後的結果資訊熵的消減量達到最大。具體的原理請大家自己查詢相關資料。 sklearn實現程式碼如下, 準確率可以達到90%左右。 fr

輕鬆玩轉 Scikit-Learn 系列 —— KNN 演算法

scikit-learn 是最受歡迎的機器學習庫之一,它提供了各種主流的機器學習演算法的API介面供使用者呼叫,讓使用者可以方便快捷的搭建一些機器學習模型,並且通過調參可以達到很高的準確率。 這次我們主要介紹scikit-learn中k近鄰演算法(以下簡稱為KNN)的使用。 KNN是一種非引數機器學習演算

決策演算法實現要點

1.定義節點(節點的集合形成樹);即定義一個結構體Point,而 用Point tree[] 來表示樹。 點Point裡面包括name(在該點進行分類的特徵),val(該點父輩的特徵的某個值),n_child(帶點子代的數量),*son(指向子代的指標),id(帶節點是否有必要存在) 2.全

機器學習 (七) 決策演算法研究與實現

前言        從決策樹這三個字中我們既可以看出來它的主要用途幫助決策某一類問題,樹是輔助我們來決策用的,如下圖一個簡單的判斷不同階段人年齡的圖:       &

機器學習-決策演算法

機器學習中分類和預測演算法的評估: 1.準確率 2.速度 3.強壯性 4.可規模性 5.可解釋性 1.什麼是決策樹/判定樹 判定樹是一個類似於流程圖的樹結構:其中,每個內部結點表示在一個屬性上的測試,每個分支代表一個屬性輸出,而每個樹葉結點代表類或類分佈。樹

決策演算法及實現

在電腦科學中,樹是一種很重要的資料結構,比如我們最為熟悉的二叉查詢樹(Binary Search Tree),紅黑樹(Red-Black Tree)等,通過引入樹這種資料結構,我們可以很快地縮小問題規模,實現高效的查詢。 在監督學習中,面對樣本中複雜多樣的特徵,選取什麼樣的策略可以實

機器學習--決策演算法學習筆記

一、演算法表述 決策樹學習的目的是為了產生一顆泛化能力強的數。 一般來說,一顆決策樹包含一個根節點,若干個內部節點和若干個葉節點。 葉節點對應決策結果,其他每個節點對應一個屬性測試。 每個節點包含的樣本集合根據屬性測試的結果被劃分到子節點中,根節點包含樣本全集。 從