日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python实现决策树算法sklearn_python sklearn-05:决策树及随机森林

發(fā)布時(shí)間:2023/12/15 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python实现决策树算法sklearn_python sklearn-05:决策树及随机森林 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.決策樹(shù)

2.隨機(jī)森林

1.決策樹(shù)(decision tree)

決策樹(shù)一種簡(jiǎn)單的非線性模型,用來(lái)解決回歸與分類(lèi)問(wèn)題。

通常是重復(fù)的將訓(xùn)練集解釋變量分割成子集的過(guò)程。決策樹(shù)的節(jié)點(diǎn)用方塊表示,用來(lái)測(cè)試解釋變量。

每個(gè)節(jié)點(diǎn)向下的邊表示不同決策產(chǎn)生結(jié)果。訓(xùn)練集的樣本由決策結(jié)果分成不同的子集。例如,一個(gè)節(jié)點(diǎn)測(cè)試解釋變量的值是否超過(guò)的限定值。如果沒(méi)有超過(guò),則進(jìn)入該節(jié)點(diǎn)的右側(cè)子節(jié)點(diǎn);如果超過(guò),則進(jìn)入左側(cè)子節(jié)點(diǎn)。子節(jié)點(diǎn)的運(yùn)行原理和前面的一樣,直到終止條件(stopping criterion)滿(mǎn)足才停止。在分類(lèi)任務(wù)中,包含在葉子節(jié)點(diǎn)中的樣本響應(yīng)變量的值的平均值作為響應(yīng)變量的估計(jì)值。

決策樹(shù)建立之后,做決策的過(guò)程就是把測(cè)試樣本放進(jìn)決策樹(shù)沿著邊不斷前進(jìn),直到一個(gè)葉子被觸及才停止前進(jìn)。

訓(xùn)練決策樹(shù):

常用的方法:

ID3(Iterative Dichotomiser 3,迭代二叉樹(shù)3代),決策樹(shù)需要對(duì)每條邊的解釋變量進(jìn)行檢查。每條邊的下一個(gè)節(jié)點(diǎn)由測(cè)試結(jié)果決定。決策樹(shù)也是通過(guò)對(duì)解釋變量序列的逐條測(cè)試獲取響應(yīng)變量結(jié)果的。那么,哪個(gè)解釋變量應(yīng)該先測(cè)試?如果子集成員種類(lèi)不同,我們還是不能確定種類(lèi)。我們還需要避免創(chuàng)建那種測(cè)試,這些測(cè)試極少可以分出一個(gè)樣本的種類(lèi),也不能降低分類(lèi)不確定性。能夠降低分類(lèi)不確定性的測(cè)試通常都是最好的測(cè)試。

我們通常用熵(entropy)來(lái)度量信息的不確定性。以比特(bits)為計(jì)量單位,熵量化了一個(gè)變量的不確定性。熵計(jì)算公式如下所示:

其中,n 是樣本的數(shù)量,P(xi) 是第 個(gè)樣本的概率。b 一般取 2,e 或10 。因?yàn)閷?duì)數(shù)函數(shù)中真數(shù)小于1

則對(duì)數(shù)值為0,因此,公式前面加符號(hào)使熵為正數(shù)。

例如,一個(gè)硬幣投擲一次事件發(fā)生后一般有兩種可能:正面或反面。正面朝上的概率是0.5,反面朝

上的概率也是0.5。那么一個(gè)硬幣投擲一次的結(jié)果這個(gè)變量的熵:

H(X) = ?(0.5 0.5 + 0.5 0.5) = 1.0

也就是說(shuō),兩個(gè)等概率的可能值,正面和反面,只需要一個(gè)比特。如果是兩個(gè)硬幣投擲一次事件發(fā)生

后一般有四種可能:正面正面,正面反面,反面反面,反面正面,每種可能的概率是0.25。其熵為:

如果硬幣的兩面相同,那么表示其可能值的變量熵為0比特,也就是說(shuō),結(jié)果是確定的,變量再也不

會(huì)產(chǎn)生新信息量了。熵還可以用小數(shù)值表示。比如,一個(gè)不正常的硬幣,其正反面的材質(zhì)不同,一邊

重一邊輕。導(dǎo)致其投擲后正面朝上的概率0.8,反面朝上概率0.2。那么其熵為:

一個(gè)不正常的硬幣投擲后其結(jié)果的熵是一個(gè)小數(shù)。雖然兩種結(jié)果都有可能,但是因?yàn)槠渲幸环N可能性

更大,所有不確定性減小了。

而我們的問(wèn)題并沒(méi)有消除許多可能性。因此,要用一種方法來(lái)合理度量熵的降幅,這個(gè)方法稱(chēng)為信息增益(information gain)。信息增益是父節(jié)點(diǎn)熵,用 表示與其子節(jié)點(diǎn)熵的加權(quán)均值的差,計(jì)算公式如下:

其中,

?表示解釋變量 的樣本 。

表示解釋變量 的值等于 樣本數(shù)量。

是解釋變量 的值等于 樣本熵。

還有很多算法也可以實(shí)現(xiàn)決策樹(shù),C4.5算法是ID3的改進(jìn)版,可以用來(lái)處理連續(xù)的解釋變量并考慮特征值丟失。C4.5算法可以修剪(prune)決策樹(shù),修剪是通過(guò)更少的葉節(jié)點(diǎn)來(lái)替換分支,以縮小決策樹(shù)的規(guī)模。scikit-learn的決策樹(shù)實(shí)現(xiàn)算法是CART(Classification and Regression Trees,分類(lèi)與回歸樹(shù))算法,CART也是一種支持修剪的學(xué)習(xí)算法。

基尼不純度

除了最大信息增益建立決策樹(shù),還可以用基尼不純度(Gini impurity),度量一個(gè)集合中每種類(lèi)型的比例。基尼不純度格式如下:

其中,j 是類(lèi)型的數(shù)量,t 是節(jié)點(diǎn)樣本的子集,P(i|t) 是從節(jié)點(diǎn)子集中選擇一個(gè)類(lèi)型 的概率。

可以看出,如果集合中只有一類(lèi),那么基尼不純度值為0。和熵一樣,當(dāng)每個(gè)類(lèi)型概率相同時(shí),基尼

不純度最大。此時(shí),基尼不純度的最大值有類(lèi)型的數(shù)量決定:

我們的例子有兩種類(lèi)型,所有基尼不純度的最大值是0.5。scikit-learn研究決策樹(shù)的算法,既支持信

息增益,也支持基尼不純度。到底用哪種方法并沒(méi)有規(guī)定,實(shí)際上,它們產(chǎn)生的結(jié)果類(lèi)似。一般的決

策樹(shù)都是兩個(gè)都用,比較一下結(jié)果,哪個(gè)好用哪個(gè)。

#scikit-learn決策樹(shù)

用scikit-learn的決策樹(shù)來(lái)做一個(gè)廣告屏蔽程序,這個(gè)程序可以預(yù)測(cè)出網(wǎng)頁(yè)上的圖片是廣告

還是正常內(nèi)容。被確認(rèn)是廣告的圖片通過(guò)調(diào)整CSS隱藏。

數(shù)據(jù)源:互聯(lián)網(wǎng)廣告數(shù)據(jù)集(Internet

Advertisements Data Set) (http://archive.ics.uci.edu/ml/datasets/Internet+Advertisements)

來(lái)實(shí)現(xiàn)分類(lèi)器,里面包含了3279張圖片。不過(guò)類(lèi)型的比例并不協(xié)調(diào),459幅廣告圖片,2820幅正常內(nèi)容。決

策樹(shù)學(xué)習(xí)算法可以從比例并不協(xié)調(diào)的數(shù)據(jù)集中生成一個(gè)不平衡的決策樹(shù)(biased tree)。

首先對(duì)模型進(jìn)行評(píng)估,本例的解釋變量就是圖片的尺寸,網(wǎng)址鏈接里的單詞,以及圖片標(biāo)簽周?chē)膯卧~。響應(yīng)變量就是圖片的類(lèi)型。解釋變量已經(jīng)被轉(zhuǎn)換成特征向量了。前三個(gè)特征值表示寬度,高度,圖像縱橫比(aspect ratio)。剩下的特征是文本變量的二元頻率值。下面,用網(wǎng)格搜索來(lái)確定決策樹(shù)模型最大最優(yōu)評(píng)價(jià)效果(F1 score)的超參數(shù),然后把決策樹(shù)用在測(cè)試集進(jìn)行效果評(píng)估。

import pandas as pd

from sklearn.tree import DecisionTreeClassifier

from sklearn.cross_validation import train_test_split

from sklearn.metrics import classification_report

from sklearn.pipeline import Pipeline

from sklearn.grid_search import GridSearchCV

#讀取數(shù)據(jù),源數(shù)據(jù)是zip,可以解壓后再讀取,也可以import zipfile,讀取壓縮數(shù)據(jù)

df = pd.read_csv(r'D:\每日工作\學(xué)習(xí)筆記\test\mlslpic\ad-dataset\ad.data', header=None)

explanatory_variable_columns = set(df.columns.values)

response_variable_column = df[len(df.columns.values)-1]

# The last column describes the targets

explanatory_variable_columns.remove(len(df.columns.values)-1)

y = [1 if e == 'ad.' else 0 for e in response_variable_column]

X = df.loc[:, list(explanatory_variable_columns)]

X.replace(to_replace=' *\?',value=-1, regex=True, inplace=True)

X_train,X_test, y_train, y_test = train_test_split(X,y)

pipeline = Pipeline([

('clf',DecisionTreeClassifier(criterion='entropy'))

])

parameters = {

'clf__max_depth': (150, 155, 160),

'clf__min_samples_split': (1, 2, 3),

'clf__min_samples_leaf': (1, 2, 3)

}

grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1,verbose=1, scoring='f1')

grid_search.fit(X_train, y_train)

print ('最佳效果:%0.3f' %grid_search.best_score_)

print('最優(yōu)參數(shù)')

best_parameters = grid_search.best_best_parameters = grid_search.best_estimator_.get_params()

for param_name in sorted(parameters.keys()):

print('\t%s: %r' % (param_name, best_parameters[param_name]))

predictions = grid_search.predict(X_test)

print (classification_report(y_test, predictions))

precision recall f1-score support

out:

Fitting 3 folds for each of 27 candidates, totalling 81 fits

[Parallel(n_jobs=-1)]: Done 42 tasks | elapsed: 8.8s

[Parallel(n_jobs=-1)]: Done 81 out of 81 | elapsed: 13.9s finished

最佳效果:0.888

clf__max_depth: 150

clf__min_samples_leaf: 3

clf__min_samples_split: 3

0 0.98 0.98 0.98 710

1 0.87 0.85 0.86 110

avg / total 0.96 0.96 0.96 820

#這個(gè)分類(lèi)器發(fā)現(xiàn)了測(cè)試集中90%的廣告,真廣告中87%被模型發(fā)現(xiàn)了。

2.決策樹(shù)集成,隨機(jī)森林

集成學(xué)習(xí)方法將一堆模型組合起來(lái)使用,比單個(gè)模型可以獲取更好的效果。

隨機(jī)森林(randomforest) 是一種隨機(jī)選取訓(xùn)練集解釋變量的子集進(jìn)行訓(xùn)練,獲得一系列決策樹(shù)的集合的方法。

隨機(jī)森林通常用其決策樹(shù)集合里每個(gè)決策樹(shù)的預(yù)測(cè)結(jié)果的均值或眾數(shù)作為最終的預(yù)測(cè)值。

scikit-learn里的隨機(jī)森林使用均值作為預(yù)測(cè)值。隨機(jī)森林相比單一決策樹(shù),不太會(huì)受到擬合過(guò)度的影響,因?yàn)殡S機(jī)森林的

每個(gè)決策樹(shù)都看不到訓(xùn)練集的全貌,只是訓(xùn)練一部分解釋變量數(shù)據(jù),不會(huì)記憶訓(xùn)練集的全部噪聲。

用隨機(jī)森林升級(jí)廣告屏蔽程序,把前面DecisionTreeClassifier替換成RandomForestClassifier就可以了。仍然用網(wǎng)格搜索來(lái)探索最優(yōu)超參數(shù)。

import pandas as pd

from sklearn.ensemble import RandomForestClassifier

from sklearn.cross_validation import train_test_split

from sklearn.metrics import classification_report

from sklearn.pipeline import Pipeline

from sklearn.grid_search import GridSearchCV

#讀取數(shù)據(jù),源數(shù)據(jù)是zip,可以解壓后再讀取,也可以import zipfile,讀取壓縮數(shù)據(jù)

df = pd.read_csv(r'D:\每日工作\學(xué)習(xí)筆記\test\mlslpic\ad-dataset\ad.data', header=None)

explanatory_variable_columns = set(df.columns.values)

response_variable_column = df[len(df.columns.values)-1]

# The last column describes the targets

explanatory_variable_columns.remove(len(df.columns.values)-1)

y = [1 if e == 'ad.' else 0 for e in response_variable_column]

X = df.loc[:, list(explanatory_variable_columns)]

X.replace(to_replace=' *\?',value=-1, regex=True, inplace=True)

X_train,X_test, y_train, y_test = train_test_split(X,y)

pipeline = Pipeline([

('clf',RandomForestClassifier(criterion='entropy'))

])

parameters = {

'clf__max_depth': (150, 155, 160),

'clf__min_samples_split': (1, 2, 3),

'clf__min_samples_leaf': (1, 2, 3)

}

grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1,verbose=1, scoring='f1')

grid_search.fit(X_train, y_train)

print ('最佳效果:%0.3f' %grid_search.best_score_)

print('最優(yōu)參數(shù)')

best_parameters = grid_search.best_best_parameters = grid_search.best_estimator_.get_params()

for param_name in sorted(parameters.keys()):

print('\t%s: %r' % (param_name, best_parameters[param_name]))

predictions = grid_search.predict(X_test)

print (classification_report(y_test, predictions))

out:

Fitting 3 folds for each of 27 candidates, totalling 81 fits

[Parallel(n_jobs=-1)]: Done 42 tasks | elapsed: 8.3s

[Parallel(n_jobs=-1)]: Done 81 out of 81 | elapsed: 12.3s finished

最佳效果:0.923

clf__max_depth: 150

clf__min_samples_leaf: 1

clf__min_samples_split: 3

precision recall f1-score support

0 0.98 0.99 0.98 710

1 0.91 0.87 0.89 110

avg / total 0.97 0.97 0.97 820

#這個(gè)分類(lèi)器發(fā)現(xiàn)了測(cè)試集中91%的廣告,各類(lèi)指標(biāo)相比單一決策樹(shù)都有明顯改善。精確率和召回率都提升到97%。

3.總結(jié):

決策樹(shù)的優(yōu)劣勢(shì)

決策樹(shù)的用法更簡(jiǎn)單。首先,決策樹(shù)對(duì)數(shù)據(jù)沒(méi)有零均值,均方差的要求。而且可以容忍解釋變量值的缺失,雖然現(xiàn)在的scikit-learn還沒(méi)實(shí)現(xiàn)這一特點(diǎn)。決策樹(shù)在訓(xùn)練的時(shí)

候可以忽略與任務(wù)無(wú)關(guān)的解釋變量。

小型決策樹(shù)很容易理解,而且可以通過(guò)scikit-learn的tree模塊里的export_graphviz函數(shù)生成圖形,可視化效果好。決策樹(shù)的分支都有著邏輯上的聯(lián)接關(guān)系,很容易通過(guò)流程圖畫(huà)出來(lái)。另外,決策

樹(shù)支持多輸出任務(wù),單一決策樹(shù)可以用于多類(lèi)分類(lèi),不需要使用one-versus-all策略。

決策樹(shù)是一種積極學(xué)習(xí)方法(eager learner),必須在它們可以用于預(yù)測(cè)測(cè)試集任務(wù)時(shí),先從訓(xùn)練集建立一個(gè)與后面的需求無(wú)關(guān)的模型,但是模型一旦建好它們可以很快的預(yù)

測(cè)出結(jié)果。相反,有些算法是消極學(xué)習(xí)方法(lazy learners),像K最近鄰(K-Nearest Neighbor,KNN)分類(lèi)算法,它們必須等到有了訓(xùn)練集數(shù)據(jù)的預(yù)測(cè)需求,才會(huì)開(kāi)始學(xué)習(xí)整個(gè)數(shù)據(jù)的特征。

消極學(xué)習(xí)方法不需要花時(shí)間訓(xùn)練預(yù)測(cè)能力,但是比積極學(xué)習(xí)方法預(yù)測(cè)速度慢。

決策樹(shù)比之前介紹的算法更容易擬合過(guò)度,因?yàn)樗鼈兛梢酝ㄟ^(guò)精確的描述每個(gè)訓(xùn)練樣本的特征,構(gòu)建出復(fù)雜的決策樹(shù),從而忽略了一般性的真實(shí)關(guān)聯(lián)關(guān)系。有一些技術(shù)可以修正決策樹(shù)的擬合過(guò)度。

修剪就是一個(gè)常用的策略,將決策樹(shù)里一些最高的子節(jié)點(diǎn)和葉子節(jié)點(diǎn)剪掉,但是目前scikit-learn還沒(méi)有相應(yīng)的實(shí)現(xiàn)。但是,類(lèi)似的效果可以通過(guò)設(shè)置決策樹(shù)最大深度,或者限定只有當(dāng)決策樹(shù)包含的訓(xùn)練

樣本數(shù)量超過(guò)限定值時(shí)才創(chuàng)建子節(jié)點(diǎn)。DecisionTreeClassifier和DecisionTreeRegressor類(lèi)都有這樣的參數(shù)可以設(shè)置。另外,隨機(jī)森林決策樹(shù)也可以消除擬合過(guò)度。

像ID3這樣的決策樹(shù)學(xué)習(xí)算法是貪婪的(greedy)。它們充分的學(xué)習(xí)有時(shí)會(huì)深陷于局部最優(yōu)的美夢(mèng),但是不能保證生成最優(yōu)決策樹(shù)。ID3通過(guò)選擇解釋變量序列進(jìn)行測(cè)試。一個(gè)解釋變量被選中是因?yàn)樗绕渌忉屪兞扛蠓鹊慕档土瞬淮_定性。但是,有可能全局最優(yōu)的決策并非局部最優(yōu)。

在例子中,決策樹(shù)的規(guī)模并不重要,因?yàn)槲覀兛梢垣@取所有節(jié)點(diǎn)。但是,在現(xiàn)實(shí)應(yīng)用中,決策樹(shù)的規(guī)模被修剪以及其他技術(shù)限制。而決策樹(shù)經(jīng)過(guò)修剪后的不同形狀會(huì)產(chǎn)生不同的效果。實(shí)際上,由信息增益和基尼不純度啟發(fā)式方法計(jì)算出的局部最優(yōu)決策通常都會(huì)生成一個(gè)可行的決策樹(shù)。

總結(jié)

以上是生活随笔為你收集整理的python实现决策树算法sklearn_python sklearn-05:决策树及随机森林的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。