之前對(duì)決策樹(shù)的算法原理做了總結(jié),包括決策樹(shù)算法原理(上)和決策樹(shù)算法原理(下)。今天就從實(shí)踐的角度來(lái)介紹決策樹(shù)算法,主要是講解使用scikit-learn來(lái)跑決策樹(shù)算法,結(jié)果的可視化以及一些參數(shù)調(diào)參的關(guān)鍵點(diǎn)。 1. scikit-learn決策樹(shù)算法類(lèi)庫(kù)介紹scikit-learn決策樹(shù)算法類(lèi)庫(kù)內(nèi)部實(shí)現(xiàn)是使用了調(diào)優(yōu)過(guò)的CART樹(shù)算法,既可以做分類(lèi),又可以做回歸。分類(lèi)決策樹(shù)的類(lèi)對(duì)應(yīng)的是DecisionTreeClassifier,而回歸決策樹(shù)的類(lèi)對(duì)應(yīng)的是DecisionTreeRegressor。兩者的參數(shù)定義幾乎完全相同,但是意義不全相同。下面就對(duì)DecisionTreeClassifier和DecisionTreeRegressor的重要參數(shù)做一個(gè)總結(jié),重點(diǎn)比較兩者參數(shù)使用的不同點(diǎn)和調(diào)參的注意點(diǎn)。 2. DecisionTreeClassifier和DecisionTreeClassifier 重要參數(shù)調(diào)參注意點(diǎn)為了便于比較,這里我們用表格的形式對(duì)DecisionTreeClassifier和DecisionTreeRegressor重要參數(shù)要點(diǎn)做一個(gè)比較。
除了這些參數(shù)要注意以外,其他在調(diào)參時(shí)的注意點(diǎn)有: 1)當(dāng)樣本少數(shù)量但是樣本特征非常多的時(shí)候,決策樹(shù)很容易過(guò)擬合,一般來(lái)說(shuō),樣本數(shù)比特征數(shù)多一些會(huì)比較容易建立健壯的模型 2)如果樣本數(shù)量少但是樣本特征非常多,在擬合決策樹(shù)模型前,推薦先做維度規(guī)約,比如主成分分析(PCA),特征選擇(Losso)或者獨(dú)立成分分析(ICA)。這樣特征的維度會(huì)大大減小。再來(lái)擬合決策樹(shù)模型效果會(huì)好。 3)推薦多用決策樹(shù)的可視化(下節(jié)會(huì)講),同時(shí)先限制決策樹(shù)的深度(比如最多3層),這樣可以先觀察下生成的決策樹(shù)里數(shù)據(jù)的初步擬合情況,然后再?zèng)Q定是否要增加深度。 4)在訓(xùn)練模型先,注意觀察樣本的類(lèi)別情況(主要指分類(lèi)樹(shù)),如果類(lèi)別分布非常不均勻,就要考慮用class_weight來(lái)限制模型過(guò)于偏向樣本多的類(lèi)別。 5)決策樹(shù)的數(shù)組使用的是numpy的float32類(lèi)型,如果訓(xùn)練數(shù)據(jù)不是這樣的格式,算法會(huì)先做copy再運(yùn)行。 6)如果輸入的樣本矩陣是稀疏的,推薦在擬合前調(diào)用 3. scikit-learn決策樹(shù)結(jié)果的可視化決策樹(shù)可視化化可以方便我們直觀的觀察模型,以及發(fā)現(xiàn)模型中的問(wèn)題。這里介紹下scikit-learn中決策樹(shù)的可視化方法。 3.1 決策樹(shù)可視化環(huán)境搭建scikit-learn中決策樹(shù)的可視化一般需要安裝graphviz。主要包括graphviz的安裝和python的graphviz插件的安裝。 第一步是安裝graphviz。下載地址在:http://www./。如果你是linux,可以用apt-get或者yum的方法安裝。如果是windows,就在官網(wǎng)下載msi文件安裝。無(wú)論是linux還是windows,裝完后都要設(shè)置環(huán)境變量,將graphviz的bin目錄加到PATH,比如我是windows,將C:/Program Files (x86)/Graphviz2.38/bin/加入了PATH 第二步是安裝python插件graphviz: pip install graphviz 第三步是安裝python插件pydotplus。這個(gè)沒(méi)有什么好說(shuō)的: pip install pydotplus 這樣環(huán)境就搭好了,有時(shí)候python會(huì)很笨,仍然找不到graphviz,這時(shí),可以在代碼里面加入這一行: os.environ['PATH'] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/' 注意后面的路徑是你自己的graphviz的bin目錄。 3.2 決策樹(shù)可視化的三種方法這里我們有一個(gè)例子講解決策樹(shù)可視化。 首先載入類(lèi)庫(kù): from sklearn.datasets import load_irisfrom sklearn import treeimport sysimport os os.environ['PATH'] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/' 接著載入sciki-learn的自帶數(shù)據(jù),有決策樹(shù)擬合,得到模型: 現(xiàn)在可以將模型存入dot文件iris.dot。 這時(shí)候我們有3種可視化方法,第一種是用graphviz的dot命令生成決策樹(shù)的可視化文件,敲完這個(gè)命令后當(dāng)前目錄就可以看到?jīng)Q策樹(shù)的可視化文件iris.pdf.打開(kāi)可以看到?jīng)Q策樹(shù)的模型圖。 第二種方法是用 import pydotplus dot_data = tree.export_graphviz(clf, out_file=None) graph = pydotplus.graph_from_dot_data(dot_data) graph.write_pdf('iris.pdf') 第三種辦法是個(gè)人比較推薦的做法,因?yàn)檫@樣可以直接把圖產(chǎn)生在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實(shí)例這里給一個(gè)限制決策樹(shù)層數(shù)為4的DecisionTreeClassifier例子。 from itertools import productimport numpy as npimport matplotlib.pyplot as pltfrom sklearn import datasetsfrom sklearn.tree import DecisionTreeClassifier# 仍然使用自帶的iris數(shù)據(jù)iris = datasets.load_iris()X = iris.data[:, [0, 2]]y = iris.target# 訓(xùn)練模型,限制樹(shù)的最大深度4clf = DecisionTreeClassifier(max_depth=4)#擬合模型clf.fit(X, y)# 畫(huà)圖x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, 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 treeimport 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()) 生成的決策樹(shù)圖如下:
以上就是scikit-learn決策樹(shù)算法使用的一個(gè)總結(jié),希望可以幫到大家。
(歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處。歡迎溝通交流: pinard.liu@ericsson.com) |
|
來(lái)自: 昵稱(chēng)35187271 > 《待分類(lèi)》