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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

决策树(Decision Tree)和随机森林

發(fā)布時(shí)間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 决策树(Decision Tree)和随机森林 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 決策樹

1.1 概念

? ? ? ? 決策樹是一種樹形結(jié)構(gòu),為人們提供決策依據(jù),決策樹可以用來回答yes和no問題,它通過樹形結(jié)構(gòu)將各種情況組合都表示出來,每個(gè)分支表示一次選擇(選擇yes還是no),直到所有選擇都進(jìn)行完畢,最終給出正確答案。決策樹是一種貪心算法,它要在給定時(shí)間內(nèi)做出最佳選擇,但 并不關(guān)心能否達(dá)到全局最優(yōu) 。

? ? ? ? ? ?

?

? ? ? ?決策樹(decision tree)是一個(gè)樹結(jié)構(gòu)(可以是二叉樹或非二叉樹)。在實(shí)際構(gòu)造決策樹時(shí),通常要進(jìn)行剪枝,這是為了處理由于數(shù)據(jù)中的噪聲和離群點(diǎn)導(dǎo)致的過分?jǐn)M合問題。剪枝有兩種:

先剪枝——在構(gòu)造過程中,當(dāng)某個(gè)節(jié)點(diǎn)滿足剪枝條件,則直接停止此分支的構(gòu)造。

后剪枝——先構(gòu)造完成完整的決策樹,再通過某些條件遍歷樹進(jìn)行剪枝。

1.2 劃分準(zhǔn)則

? ? ? ?決策樹學(xué)習(xí)的關(guān)鍵:如何選擇最優(yōu)劃分屬性

? ? ? ?劃分?jǐn)?shù)據(jù)集的大原則是:將無序的數(shù)據(jù)變得更加有序

? ? ? ?劃分?jǐn)?shù)據(jù)集,構(gòu)建決策樹時(shí)將對(duì)每個(gè)特征劃分?jǐn)?shù)據(jù)集的結(jié)果計(jì)算一次信息增益/基尼指數(shù)/增益率,然后判斷按照哪個(gè)特征劃分?jǐn)?shù)據(jù)集是最好的劃分方式。

(1)信息增益

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? 信息增益越大,則意味著使用屬性 α 來進(jìn)行劃分所獲得的"純度提升"越大。信息增益準(zhǔn)則對(duì)可取值數(shù)目較多的屬性有所偏好。

(2)增益率

? ? ? ? ??

? ? ? 屬性 α 的可能取值數(shù)目越多(即 V 越大),則 IV(α) 的值通常會(huì)越大,增益率越小。增益率準(zhǔn)則對(duì)可取值數(shù)目較少的屬性有所偏好。

(3)基尼指數(shù)

? ? ?基尼值:

? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ?

? ? ? 基尼指數(shù):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ?Gini(D) 反映了從數(shù)據(jù)集 D 中隨機(jī)抽取兩個(gè)樣本,其類別標(biāo)記不一致的概率。 因此, Gini(D) 越小,兩個(gè)樣本的類別越一致,則數(shù)據(jù)集 D 的純度越高。?

1.3?決策樹算法

(1)ID3

? ? ? ?以信息增益為準(zhǔn)則來選擇劃分屬性,用于劃分離散型數(shù)據(jù)集。

做法:

? ? ? ?每次選取當(dāng)前最佳的特征來分割數(shù)據(jù),并按照該特征的所有可能取值來切分。一旦按某特征切分后,該特征在之后的算法執(zhí)行過程中將不會(huì)再起作用,所以有觀點(diǎn)認(rèn)為這種切分方式過于迅速。 ? ? ? ?

缺點(diǎn): ?

  • 切分方式過于迅速; ?
  • ?不能直接處理連續(xù)型特征。只有事先將連續(xù)型特征轉(zhuǎn)換成離散型,才能使用。這種轉(zhuǎn)換過程會(huì)破壞連續(xù)型變量的內(nèi)在性質(zhì)。 ? ? ? ?

? ? ? ? ID3算法無法直接處理數(shù)值型數(shù)據(jù),盡管我們可以通過量化的方法將數(shù)值型數(shù)據(jù)轉(zhuǎn)化為離散型數(shù)值,但是如果存在太多的特征劃分, ID3算法仍然會(huì)面臨其他問題。

(2)C4.5

? ? ? 以增益率為準(zhǔn)則來選擇劃分屬性,核心算法ID3的改進(jìn)算法。

C4.5比ID3改進(jìn)的地方: ? ? ? ?

(3)CART

? ? ? CART決策樹(分類回歸決策樹):使用"基尼指數(shù)" 來選擇劃分屬性。

? ? ? CART是十分著名且廣泛記載的樹構(gòu)建算法,它使用二元切分來處理連續(xù)型變量:

? ? ? 二元切分法:每次把數(shù)據(jù)集切成兩份

? ? ? 做法:如果特征值大于給定值就走左子樹, 否則就走右子樹。 ? ? ? ?

? ? ? 優(yōu)點(diǎn):易于對(duì)樹構(gòu)建過程進(jìn)行調(diào)整以處理連續(xù)型特征; ? 二元切分法也節(jié)省了樹的構(gòu)建時(shí)間。

1.4 代碼實(shí)現(xiàn)

  • ID3選擇屬性用的是子樹的信息增益,即熵的變化值;而C4.5用的是信息增益率。一般來說率就是用來取平衡用的,比如有兩個(gè)跑步的人,一個(gè)起點(diǎn)是10m/s的人、其1s后為20m/s;另一個(gè)人起速是1m/s、其1s后為2m/s。如果緊緊算差值那么兩個(gè)差距就很大了,如果使用速度增加率(加速度)來衡量,2個(gè)人就是一樣了。在這里,其克服了用信息增益選擇屬性時(shí)偏向選擇取值多的屬性的不足。 ? ? ? ?
  • 在樹構(gòu)造過程中進(jìn)行剪枝。有些節(jié)點(diǎn)只掛著幾個(gè)元素,對(duì)于這種節(jié)點(diǎn),干脆不考慮最好,不然很容易導(dǎo)致overfitting。 ? ? ?
  • 對(duì)非離散數(shù)據(jù)都能處理,也就是把連續(xù)性的數(shù)據(jù)轉(zhuǎn)化為離散的值進(jìn)行處理。這個(gè)其實(shí)就是一個(gè)個(gè)式,看對(duì)于連續(xù)型的值在哪里分裂好。 ? ? ? ?
  • 能夠?qū)Σ煌暾麛?shù)據(jù)進(jìn)行處理。這個(gè)重要也重要,其實(shí)也沒那么重要,缺失數(shù)據(jù)采用一些方法補(bǔ)上去就是了。

? ? ?決策樹主要是調(diào)用sklearn里面函數(shù),這個(gè)里面包含了DecisionTreeClassifier,不需要我們自己去實(shí)現(xiàn)。

import numpy as np import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeRegressorif __name__ == "__main__":n = 500x = np.random.rand(n) * 8 - 3x.sort()y = np.cos(x) + np.sin(x) + np.random.randn(n) * 0.4x = x.reshape(-1, 1)reg = DecisionTreeRegressor(criterion='mse')# reg1 = RandomForestRegressor(criterion='mse')dt = reg.fit(x, y)# dt1 = reg1.fit(x, y)x_test = np.linspace(-3, 5, 100).reshape(-1, 1)y_hat = dt.predict(x_test)plt.figure(facecolor="w")plt.plot(x, y, 'ro', label="actual")plt.plot(x_test, y_hat, 'k*', label="predict")plt.legend(loc="best")plt.title(u'Decision Tree', fontsize=17)plt.tight_layout()plt.grid()plt.show()

2. 隨機(jī)森林

2.1 Bagging策略

Bagging( bootstrap aggregation)的策略:從樣本集中進(jìn)行有放回地選出n個(gè)樣本;在樣本的所有特征上,對(duì)這n個(gè)樣本建立分類器;重復(fù)上述兩步m次,獲得m個(gè)樣本分類器;最后將測(cè)試數(shù)據(jù)都放在這m個(gè)樣本分類器上,最終得到m個(gè)分類結(jié)果,再從這m個(gè)分類結(jié)果中決定數(shù)據(jù)屬于哪一類(多數(shù)投票制)。

Bootstrap:一種有放回的抽樣方法。

隨機(jī)森林采用了Bagging策略,且在其基礎(chǔ)上進(jìn)行了一些修改,采用了兩個(gè)隨機(jī):

  • 從訓(xùn)練樣本集中使用Bootstrap采樣(隨機(jī)有放回)選出n個(gè)樣本。
  • 設(shè)樣本共有b個(gè)特征,從這b個(gè)特征中只隨機(jī)選擇k個(gè)特征來分割樣本,通過計(jì)算選擇最優(yōu)劃分特征作為節(jié)點(diǎn)來劃分樣本集合來建立決策樹。(與Bagging的不同之處:沒有使用全部的特征,這樣可以避免一些過擬合的特征,不再對(duì)決策樹進(jìn)行任何剪枝)
  • 重復(fù)以上兩步m次,可建立m棵決策樹
  • 這m棵決策樹形成了森林,可通過簡單多數(shù)投票法(或其他投票機(jī)制)來決定森林的輸出,決定屬于哪一類型。(針對(duì)解決回歸問題,可以采用單棵樹輸出結(jié)果總和的平均值)
  • 隨機(jī)森林在一定程序上提高了泛化能力,而且可以并行地生成單棵樹。

    2.2 代碼示例

    使用決策樹和隨機(jī)森林進(jìn)行手寫數(shù)字(sklearn中的digits數(shù)據(jù))的預(yù)測(cè)

    from sklearn import datasets from sklearn.model_selection import cross_val_score import datetime from sklearn import tree from sklearn.ensemble import RandomForestClassifierdigits = datasets.load_digits(); X = digits.data # 特征矩陣 y = digits.target # 標(biāo)簽矩陣 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3., random_state=8) # 分割訓(xùn)練集和測(cè)試集estimators = {} # criterion: 分支的標(biāo)準(zhǔn)(gini/entropy) # 1.決策樹 estimators['tree'] = tree.DecisionTreeClassifier(criterion='gini',random_state=8) # 2.隨機(jī)森林 # n_estimators: 樹的數(shù)量 # bootstrap: 是否隨機(jī)有放回 # n_jobs: 可并行運(yùn)行的數(shù)量 estimators['forest'] = RandomForestClassifier(n_estimators=20,criterion='gini',bootstrap=True,n_jobs=2,random_state=8) for k in estimators.keys():start_time = datetime.datetime.now()# print '----%s----' % kestimators[k] = estimators[k].fit(X_train, y_train)pred = estimators[k].predict(X_test)# print pred[:10]print("%s Score: %0.2f" % (k, estimators[k].score(X_test, y_test)))scores = cross_val_score(estimators[k], X_train, y_train,scoring='accuracy' ,cv=10)print("%s Cross Avg. Score: %0.2f (+/- %0.2f)" % (k, scores.mean(), scores.std() * 2))end_time = datetime.datetime.now()time_spend = end_time - start_timeprint("%s Time: %0.2f" % (k, time_spend.total_seconds()))

    未完待續(xù)。。。

    總結(jié)

    以上是生活随笔為你收集整理的决策树(Decision Tree)和随机森林的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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