小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

scikit

 昵稱(chēng)35187271 2018-03-02

    之前對(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. DecisionTreeClassifierDecisionTreeClassifier 重要參數(shù)調(diào)參注意點(diǎn)

    為了便于比較,這里我們用表格的形式對(duì)DecisionTreeClassifier和DecisionTreeRegressor重要參數(shù)要點(diǎn)做一個(gè)比較。

參數(shù)DecisionTreeClassifierDecisionTreeRegressor

特征選擇標(biāo)準(zhǔn)criterion

可以使用'gini'或者'entropy',前者代表基尼系數(shù),后者代表信息增益。一般說(shuō)使用默認(rèn)的基尼系數(shù)'gini'就可以了,即CART算法。除非你更喜歡類(lèi)似ID3, C4.5的最優(yōu)特征選擇方法。 

 可以使用'mse'或者'mae',前者是均方差,后者是和均值之差的絕對(duì)值之和。推薦使用默認(rèn)的'mse'。一般來(lái)說(shuō)'mse'比'mae'更加精確。除非你想比較二個(gè)參數(shù)的效果的不同之處。

特征劃分點(diǎn)選擇標(biāo)準(zhǔn)splitter

可以使用'best'或者'random'。前者在特征的所有劃分點(diǎn)中找出最優(yōu)的劃分點(diǎn)。后者是隨機(jī)的在部分劃分點(diǎn)中找局部最優(yōu)的劃分點(diǎn)。

默認(rèn)的'best'適合樣本量不大的時(shí)候,而如果樣本數(shù)據(jù)量非常大,此時(shí)決策樹(shù)構(gòu)建推薦'random' 

劃分時(shí)考慮的最大特征數(shù)max_features

可以使用很多種類(lèi)型的值,默認(rèn)是'None',意味著劃分時(shí)考慮所有的特征數(shù);如果是'log2'意味著劃分時(shí)最多考慮$log_2N$個(gè)特征;如果是'sqrt'或者'auto'意味著劃分時(shí)最多考慮$\sqrt{N}$個(gè)特征。如果是整數(shù),代表考慮的特征絕對(duì)數(shù)。如果是浮點(diǎn)數(shù),代表考慮特征百分比,即考慮(百分比xN)取整后的特征數(shù)。其中N為樣本總特征數(shù)。

一般來(lái)說(shuō),如果樣本特征數(shù)不多,比如小于50,我們用默認(rèn)的'None'就可以了,如果特征數(shù)非常多,我們可以靈活使用剛才描述的其他取值來(lái)控制劃分時(shí)考慮的最大特征數(shù),以控制決策樹(shù)的生成時(shí)間。

決策樹(shù)最大深max_depth

 決策樹(shù)的最大深度,默認(rèn)可以不輸入,如果不輸入的話,決策樹(shù)在建立子樹(shù)的時(shí)候不會(huì)限制子樹(shù)的深度。一般來(lái)說(shuō),數(shù)據(jù)少或者特征少的時(shí)候可以不管這個(gè)值。如果模型樣本量多,特征也多的情況下,推薦限制這個(gè)最大深度,具體的取值取決于數(shù)據(jù)的分布。常用的可以取值10-100之間。

內(nèi)部節(jié)點(diǎn)再劃分所需最小樣本數(shù)min_samples_split

這個(gè)值限制了子樹(shù)繼續(xù)劃分的條件,如果某節(jié)點(diǎn)的樣本數(shù)少于min_samples_split,則不會(huì)繼續(xù)再?lài)L試選擇最優(yōu)特征來(lái)進(jìn)行劃分。 默認(rèn)是2.如果樣本量不大,不需要管這個(gè)值。如果樣本量數(shù)量級(jí)非常大,則推薦增大這個(gè)值。我之前的一個(gè)項(xiàng)目例子,有大概10萬(wàn)樣本,建立決策樹(shù)時(shí),我選擇了min_samples_split=10??梢宰鳛閰⒖?。

葉子節(jié)點(diǎn)最少樣本數(shù)min_samples_leaf

 這個(gè)值限制了葉子節(jié)點(diǎn)最少的樣本數(shù),如果某葉子節(jié)點(diǎn)數(shù)目小于樣本數(shù),則會(huì)和兄弟節(jié)點(diǎn)一起被剪枝。 默認(rèn)是1,可以輸入最少的樣本數(shù)的整數(shù),或者最少樣本數(shù)占樣本總數(shù)的百分比。如果樣本量不大,不需要管這個(gè)值。如果樣本量數(shù)量級(jí)非常大,則推薦增大這個(gè)值。之前的10萬(wàn)樣本項(xiàng)目使用min_samples_leaf的值為5,僅供參考。

葉子節(jié)點(diǎn)最小的樣本權(quán)重和min_weight_fraction_leaf

這個(gè)值限制了葉子節(jié)點(diǎn)所有樣本權(quán)重和的最小值,如果小于這個(gè)值,則會(huì)和兄弟節(jié)點(diǎn)一起被剪枝。 默認(rèn)是0,就是不考慮權(quán)重問(wèn)題。一般來(lái)說(shuō),如果我們有較多樣本有缺失值,或者分類(lèi)樹(shù)樣本的分布類(lèi)別偏差很大,就會(huì)引入樣本權(quán)重,這時(shí)我們就要注意這個(gè)值了。

最大葉子節(jié)點(diǎn)數(shù)max_leaf_nodes

 通過(guò)限制最大葉子節(jié)點(diǎn)數(shù),可以防止過(guò)擬合,默認(rèn)是'None”,即不限制最大的葉子節(jié)點(diǎn)數(shù)。如果加了限制,算法會(huì)建立在最大葉子節(jié)點(diǎn)數(shù)內(nèi)最優(yōu)的決策樹(shù)。如果特征不多,可以不考慮這個(gè)值,但是如果特征分成多的話,可以加以限制,具體的值可以通過(guò)交叉驗(yàn)證得到。

類(lèi)別權(quán)重class_weight

指定樣本各類(lèi)別的的權(quán)重,主要是為了防止訓(xùn)練集某些類(lèi)別的樣本過(guò)多,導(dǎo)致訓(xùn)練的決策樹(shù)過(guò)于偏向這些類(lèi)別。這里可以自己指定各個(gè)樣本的權(quán)重,或者用“balanced”,如果使用“balanced”,則算法會(huì)自己計(jì)算權(quán)重,樣本量少的類(lèi)別所對(duì)應(yīng)的樣本權(quán)重會(huì)高。當(dāng)然,如果你的樣本類(lèi)別分布沒(méi)有明顯的偏倚,則可以不管這個(gè)參數(shù),選擇默認(rèn)的'None' 不適用于回歸樹(shù)

節(jié)點(diǎn)劃分最小不純度min_impurity_split

 這個(gè)值限制了決策樹(shù)的增長(zhǎng),如果某節(jié)點(diǎn)的不純度(基尼系數(shù),信息增益,均方差,絕對(duì)差)小于這個(gè)閾值,則該節(jié)點(diǎn)不再生成子節(jié)點(diǎn)。即為葉子節(jié)點(diǎn) 。

數(shù)據(jù)是否預(yù)排序presort

這個(gè)值是布爾值,默認(rèn)是False不排序。一般來(lái)說(shuō),如果樣本量少或者限制了一個(gè)深度很小的決策樹(shù),設(shè)置為true可以讓劃分點(diǎn)選擇更加快,決策樹(shù)建立的更加快。如果樣本量太大的話,反而沒(méi)有什么好處。問(wèn)題是樣本量少的時(shí)候,我速度本來(lái)就不慢。所以這個(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)用csc_matrix稀疏化,在預(yù)測(cè)前調(diào)用csr_matrix稀疏化。

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ù):

復(fù)制代碼
from sklearn.datasets import load_irisfrom sklearn import treeimport sysimport os os.environ['PATH'] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'
復(fù)制代碼

    接著載入sciki-learn的自帶數(shù)據(jù),有決策樹(shù)擬合,得到模型:

復(fù)制代碼
iris = load_iris()clf = tree.DecisionTreeClassifier()clf = clf.fit(iris.data, iris.target)
復(fù)制代碼

    現(xiàn)在可以將模型存入dot文件iris.dot。

復(fù)制代碼
with open('iris.dot', 'w') as f: f = tree.export_graphviz(clf, out_file=f)
復(fù)制代碼

    這時(shí)候我們有3種可視化方法,第一種是用graphviz的dot命令生成決策樹(shù)的可視化文件,敲完這個(gè)命令后當(dāng)前目錄就可以看到?jīng)Q策樹(shù)的可視化文件iris.pdf.打開(kāi)可以看到?jīng)Q策樹(shù)的模型圖。

復(fù)制代碼
#注意,這個(gè)命令在命令行執(zhí)行dot -Tpdf iris.dot -o iris.pdf
復(fù)制代碼

    第二種方法是用pydotplus生成iris.pdf。這樣就不用再命令行去專(zhuān)門(mén)生成pdf文件了。

復(fù)制代碼
import pydotplus dot_data = tree.export_graphviz(clf, out_file=None) graph = pydotplus.graph_from_dot_data(dot_data) graph.write_pdf('iris.pdf')
復(fù)制代碼

    第三種辦法是個(gè)人比較推薦的做法,因?yàn)檫@樣可以直接把圖產(chǎn)生在ipython的notebook。代碼如下:

復(fù)制代碼
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())
復(fù)制代碼

    在ipython的notebook生成的圖如下:

  

4. DecisionTreeClassifier實(shí)例

    這里給一個(gè)限制決策樹(shù)層數(shù)為4的DecisionTreeClassifier例子。

復(fù)制代碼
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()
復(fù)制代碼

    得到的圖如下:


    接著我們可視化我們的決策樹(shù),使用了推薦的第三種方法。代碼如下:

復(fù)制代碼
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())
復(fù)制代碼

    生成的決策樹(shù)圖如下:

 

    以上就是scikit-learn決策樹(shù)算法使用的一個(gè)總結(jié),希望可以幫到大家。

 

(歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處。歡迎溝通交流: pinard.liu@ericsson.com) 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多