一. 決策樹(shù)(decision tree):是一種基本的分類(lèi)與回歸方法,此處主要討論分類(lèi)的決策樹(shù)。
在分類(lèi)問(wèn)題中,表示基于特征對(duì)實(shí)例進(jìn)行分類(lèi)的過(guò)程,可以認(rèn)為是if-then的集合,也可以認(rèn)為是定義在特征空間與類(lèi)空間上的條件概率分布。
二. 決策樹(shù)通常有三個(gè)步驟:特征選擇、決策樹(shù)的生成、決策樹(shù)的修剪。
用決策樹(shù)分類(lèi):從根節(jié)點(diǎn)開(kāi)始,對(duì)實(shí)例的某一特征進(jìn)行測(cè)試,根據(jù)測(cè)試結(jié)果將實(shí)例分配到其子節(jié)點(diǎn),此時(shí)每個(gè)子節(jié)點(diǎn)對(duì)應(yīng)著該特征的一個(gè)取值,如此遞歸的對(duì)實(shí)例進(jìn)行測(cè)試并分配,直到到達(dá)葉節(jié)點(diǎn),最后將實(shí)例分到葉節(jié)點(diǎn)的類(lèi)中。
下圖為決策樹(shù)示意圖,圓點(diǎn)——內(nèi)部節(jié)點(diǎn),方框——葉節(jié)點(diǎn)

- 決策樹(shù)學(xué)習(xí)的目標(biāo):根據(jù)給定的訓(xùn)練數(shù)據(jù)集構(gòu)建一個(gè)決策樹(shù)模型,使它能夠?qū)?shí)例進(jìn)行正確的分類(lèi)。
- 決策樹(shù)學(xué)習(xí)的本質(zhì):從訓(xùn)練集中歸納出一組分類(lèi)規(guī)則,或者說(shuō)是由訓(xùn)練數(shù)據(jù)集估計(jì)條件概率模型。
- 決策樹(shù)學(xué)習(xí)的損失函數(shù):正則化的極大似然函數(shù)
- 決策樹(shù)學(xué)習(xí)的測(cè)試:最小化損失函數(shù)
- 決策樹(shù)學(xué)習(xí)的目標(biāo):在損失函數(shù)的意義下,選擇最優(yōu)決策樹(shù)的問(wèn)題。
- 決策樹(shù)原理和問(wèn)答猜測(cè)結(jié)果游戲相似,根據(jù)一系列數(shù)據(jù),然后給出游戲的答案
三. 決策樹(shù)的構(gòu)造
決策樹(shù)學(xué)習(xí)的算法通常是一個(gè)遞歸地選擇最優(yōu)特征,并根據(jù)該特征對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行分割,使得各個(gè)子數(shù)據(jù)集有一個(gè)最好的分類(lèi)的過(guò)程。這一過(guò)程對(duì)應(yīng)著對(duì)特征空間的劃分,也對(duì)應(yīng)著決策樹(shù)的構(gòu)建。
1) 開(kāi)始:構(gòu)建根節(jié)點(diǎn),將所有訓(xùn)練數(shù)據(jù)都放在根節(jié)點(diǎn),選擇一個(gè)最優(yōu)特征,按著這一特征將訓(xùn)練數(shù)據(jù)集分割成子集,使得各個(gè)子集有一個(gè)在當(dāng)前條件下最好的分類(lèi)。
2) 如果這些子集已經(jīng)能夠被基本正確分類(lèi),那么構(gòu)建葉節(jié)點(diǎn),并將這些子集分到所對(duì)應(yīng)的葉節(jié)點(diǎn)去。
3)如果還有子集不能夠被正確的分類(lèi),那么就對(duì)這些子集選擇新的最優(yōu)特征,繼續(xù)對(duì)其進(jìn)行分割,構(gòu)建相應(yīng)的節(jié)點(diǎn),如果遞歸進(jìn)行,直至所有訓(xùn)練數(shù)據(jù)子集被基本正確的分類(lèi),或者沒(méi)有合適的特征為止。
4)每個(gè)子集都被分到葉節(jié)點(diǎn)上,即都有了明確的類(lèi),這樣就生成了一顆決策樹(shù)。
四. 決策樹(shù)的特點(diǎn):
優(yōu)點(diǎn):計(jì)算復(fù)雜度不高,輸出結(jié)果易于理解,對(duì)中間值的缺失不敏感,可以處理不相關(guān)特征數(shù)據(jù)。
缺點(diǎn):可能會(huì)產(chǎn)生過(guò)度匹配的問(wèn)題
適用數(shù)據(jù)類(lèi)型:數(shù)值型和標(biāo)稱(chēng)型
首先:確定當(dāng)前數(shù)據(jù)集上的決定性特征,為了得到該決定性特征,必須評(píng)估每個(gè)特征,完成測(cè)試之后,原始數(shù)據(jù)集就被劃分為幾個(gè)數(shù)據(jù)子集,這些數(shù)據(jù)子集會(huì)分布在第一個(gè)決策點(diǎn)的所有分支上,如果某個(gè)分支下的數(shù)據(jù)屬于同一類(lèi)型,則當(dāng)前無(wú)序閱讀的垃圾郵件已經(jīng)正確的劃分?jǐn)?shù)據(jù)分類(lèi),無(wú)需進(jìn)一步對(duì)數(shù)據(jù)集進(jìn)行分割,如果不屬于同一類(lèi),則要重復(fù)劃分?jǐn)?shù)據(jù)子集,直到所有相同類(lèi)型的數(shù)據(jù)均在一個(gè)數(shù)據(jù)子集內(nèi)。
五. 信息增益
在劃分?jǐn)?shù)據(jù)集之前之后信息發(fā)生的變化成為信息增益,知道如何計(jì)算信息增益,我們就可以計(jì)算每個(gè)特征值劃分?jǐn)?shù)據(jù)集獲得的信息增益,獲得信息增益最高的特征就是最好的選擇。
-
熵
-
信息增益
表示得知特征X的信息而使得類(lèi)Y的信息不確定性減少的程度。
六. 決策樹(shù)的剪枝策略
決策樹(shù)生成算法遞歸的產(chǎn)生決策樹(shù),直到不能繼續(xù)下去為止,這樣產(chǎn)生的樹(shù)往往對(duì)訓(xùn)練數(shù)據(jù)的分類(lèi)很準(zhǔn)確,但對(duì)未知測(cè)試數(shù)據(jù)的分類(lèi)缺沒(méi)有那么精確,即會(huì)出現(xiàn)過(guò)擬合現(xiàn)象。過(guò)擬合產(chǎn)生的原因在于在學(xué)習(xí)時(shí)過(guò)多的考慮如何提高對(duì)訓(xùn)練數(shù)據(jù)的正確分類(lèi),從而構(gòu)建出過(guò)于復(fù)雜的決策樹(shù),解決方法是考慮決策樹(shù)的復(fù)雜度,對(duì)已經(jīng)生成的樹(shù)進(jìn)行簡(jiǎn)化。
剪枝(pruning):從已經(jīng)生成的樹(shù)上裁掉一些子樹(shù)或葉節(jié)點(diǎn),并將其根節(jié)點(diǎn)或父節(jié)點(diǎn)作為新的葉子節(jié)點(diǎn),從而簡(jiǎn)化分類(lèi)樹(shù)模型。

決策樹(shù)算法很容易過(guò)擬合(overfitting),剪枝算法就是用來(lái)防止決策樹(shù)過(guò)擬合,提高泛華性能的方法。
剪枝分為預(yù)剪枝與后剪枝。
預(yù)剪枝是指在決策樹(shù)的生成過(guò)程中,對(duì)每個(gè)節(jié)點(diǎn)在劃分前先進(jìn)行評(píng)估,若當(dāng)前的劃分不能帶來(lái)泛化性能的提升,則停止劃分,并將當(dāng)前節(jié)點(diǎn)標(biāo)記為葉節(jié)點(diǎn)。
后剪枝是指先從訓(xùn)練集生成一顆完整的決策樹(shù),然后自底向上對(duì)非葉節(jié)點(diǎn)進(jìn)行考察,若將該節(jié)點(diǎn)對(duì)應(yīng)的子樹(shù)替換為葉節(jié)點(diǎn),能帶來(lái)泛化性能的提升,則將該子樹(shù)替換為葉節(jié)點(diǎn)。
那么怎么來(lái)判斷是否帶來(lái)泛化性能的提升那?最簡(jiǎn)單的就是留出法,即預(yù)留一部分?jǐn)?shù)據(jù)作為驗(yàn)證集來(lái)進(jìn)行性能評(píng)估。

剪枝就是當(dāng)α 確定時(shí),選擇損失函數(shù)最小的模型,即損失函數(shù)最小的子樹(shù)。
當(dāng)α 值確定時(shí),子樹(shù)越大,往往與訓(xùn)練數(shù)據(jù)的擬合越好,但是模型的復(fù)雜度越高;子樹(shù)越小,模型的復(fù)雜度就越低,但是往往與訓(xùn)練數(shù)據(jù)的擬合不好損失函數(shù)正好表示了對(duì)兩者的平衡。
七. ID3、C4.5、CART的區(qū)別
ID3 使用信息增益作為選擇特征的準(zhǔn)則;C4.5 使用信息增益比作為選擇特征的準(zhǔn)則;CART 使用 Gini 指數(shù)作為選擇特征的準(zhǔn)則。
- ID3
熵表示的是數(shù)據(jù)中包含的信息量大小。熵越小,數(shù)據(jù)的純度越高,也就是說(shuō)數(shù)據(jù)越趨于一致,這是我們希望的劃分之后每個(gè)子節(jié)點(diǎn)的樣子。
信息增益 = 劃分前熵 - 劃分后熵。信息增益越大,則意味著使用屬性 a 來(lái)進(jìn)行劃分所獲得的 “純度提升” 越大 **。也就是說(shuō),用屬性 a 來(lái)劃分訓(xùn)練集,得到的結(jié)果中純度比較高。
ID3 僅僅適用于二分類(lèi)問(wèn)題。ID3 僅僅能夠處理離散屬性。
- C4.5
C4.5 克服了 ID3 僅僅能夠處理離散屬性的問(wèn)題,以及信息增益偏向選擇取值較多特征的問(wèn)題,使用信息增益比來(lái)選擇特征。信息增益比 = 信息增益 / 劃分前熵 選擇信息增益比最大的作為最優(yōu)特征。
C4.5 處理連續(xù)特征是先將特征取值排序,以連續(xù)兩個(gè)值中間值作為劃分標(biāo)準(zhǔn)。嘗試每一種劃分,并計(jì)算修正后的信息增益,選擇信息增益最大的分裂點(diǎn)作為該屬性的分裂點(diǎn)。
- CART
CART 與 ID3,C4.5 不同之處在于 CART 生成的樹(shù)必須是二叉樹(shù)。也就是說(shuō),無(wú)論是回歸還是分類(lèi)問(wèn)題,無(wú)論特征是離散的還是連續(xù)的,無(wú)論屬性取值有多個(gè)還是兩個(gè),內(nèi)部節(jié)點(diǎn)只能根據(jù)屬性值進(jìn)行二分。
CART 的全稱(chēng)是分類(lèi)與回歸樹(shù)。從這個(gè)名字中就應(yīng)該知道,CART 既可以用于分類(lèi)問(wèn)題,也可以用于回歸問(wèn)題。
回歸樹(shù)中,使用平方誤差最小化準(zhǔn)則來(lái)選擇特征并進(jìn)行劃分。每一個(gè)葉子節(jié)點(diǎn)給出的預(yù)測(cè)值,是劃分到該葉子節(jié)點(diǎn)的所有樣本目標(biāo)值的均值,這樣只是在給定劃分的情況下最小化了平方誤差。
要確定最優(yōu)化分,還需要遍歷所有屬性,以及其所有的取值來(lái)分別嘗試劃分并計(jì)算在此種劃分情況下的最小平方誤差,選取最小的作為此次劃分的依據(jù)。由于回歸樹(shù)生成使用平方誤差最小化準(zhǔn)則,所以又叫做最小二乘回歸樹(shù)。
分類(lèi)樹(shù)種,使用 Gini 指數(shù)最小化準(zhǔn)則來(lái)選擇特征并進(jìn)行劃分;
Gini 指數(shù)表示集合的不確定性,或者是不純度。基尼指數(shù)越大,集合不確定性越高,不純度也越大。這一點(diǎn)和熵類(lèi)似。另一種理解基尼指數(shù)的思路是,基尼指數(shù)是為了最小化誤分類(lèi)的概率。
信息增益 vs 信息增益比
之所以引入了信息增益比,是由于信息增益的一個(gè)缺點(diǎn)。那就是:信息增益總是偏向于選擇取值較多的屬性。信息增益比在此基礎(chǔ)上增加了一個(gè)罰項(xiàng),解決了這個(gè)問(wèn)題。
Gini 指數(shù) vs 熵
既然這兩個(gè)都可以表示數(shù)據(jù)的不確定性,不純度。那么這兩個(gè)有什么區(qū)別那?
Gini 指數(shù)的計(jì)算不需要對(duì)數(shù)運(yùn)算,更加高效;
Gini 指數(shù)更偏向于連續(xù)屬性,熵更偏向于離散屬性。
八. 可視化
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets.california_housing import fetch_california_housing
housing = fetch_california_housing()
print(housing.DESCR)

housing.data.shape

housing.data[0]

from sklearn import tree
dtr = tree.DecisionTreeRegressor(max_depth = 2)
dtr.fit(housing.data[:, [6, 7]], housing.target)

#要可視化顯示 首先需要安裝 graphviz http://www.graphviz.org/Download..php
dot_data = \
tree.export_graphviz(
dtr,
out_file = None,
feature_names = housing.feature_names[6:8],
filled = True,
impurity = False,
rounded = True
)
#pip install pydotplus
import pydotplus
graph = pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor("#FFF2DD")
from IPython.display import Image
Image(graph.create_png())

graph.write_png("dtr_white_background.png")

from sklearn.model_selection import train_test_split
data_train, data_test, target_train, target_test = \
train_test_split(housing.data, housing.target, test_size = 0.1, random_state = 42)
dtr = tree.DecisionTreeRegressor(random_state = 42)
dtr.fit(data_train, target_train)
dtr.score(data_test, target_test)

from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor( random_state = 42)
rfr.fit(data_train, target_train)
rfr.score(data_test, target_test)

參數(shù)說(shuō)明如下:
criterion:特征選擇標(biāo)準(zhǔn),可選參數(shù),默認(rèn)是gini,可以設(shè)置為entropy。gini是基尼不純度,是將來(lái)自集合的某種結(jié)果隨機(jī)應(yīng)用于某一數(shù)據(jù)項(xiàng)的預(yù)期誤差率,是一種基于統(tǒng)計(jì)的思想。entropy是香農(nóng)熵,也就是上篇文章講過(guò)的內(nèi)容,是一種基于信息論的思想。Sklearn把gini設(shè)為默認(rèn)參數(shù),應(yīng)該也是做了相應(yīng)的斟酌的,精度也許更高些?ID3算法使用的是entropy,CART算法使用的則是gini。
splitter:特征劃分點(diǎn)選擇標(biāo)準(zhǔn),可選參數(shù),默認(rèn)是best,可以設(shè)置為random。每個(gè)結(jié)點(diǎn)的選擇策略。best參數(shù)是根據(jù)算法選擇最佳的切分特征,例如gini、entropy。random隨機(jī)的在部分劃分點(diǎn)中找局部最優(yōu)的劃分點(diǎn)。默認(rèn)的”best”適合樣本量不大的時(shí)候,而如果樣本數(shù)據(jù)量非常大,此時(shí)決策樹(shù)構(gòu)建推薦”random”。
max_features:劃分時(shí)考慮的最大特征數(shù),可選參數(shù),默認(rèn)是None。尋找最佳切分時(shí)考慮的最大特征數(shù)(n_features為總共的特征數(shù)),有如下6種情況:
如果max_features是整型的數(shù),則考慮max_features個(gè)特征;
如果max_features是浮點(diǎn)型的數(shù),則考慮int(max_features * n_features)個(gè)特征;
如果max_features設(shè)為auto,那么max_features = sqrt(n_features);
如果max_features設(shè)為sqrt,那么max_featrues = sqrt(n_features),跟auto一樣;
如果max_features設(shè)為log2,那么max_features = log2(n_features);
如果max_features設(shè)為None,那么max_features = n_features,也就是所有特征都用。
一般來(lái)說(shuō),如果樣本特征數(shù)不多,比如小于50,我們用默認(rèn)的”None”就可以了,如果特征數(shù)非常多,我們可以靈活使用剛才描述的其他取值來(lái)控制劃分時(shí)考慮的最大特征數(shù),以控制決策樹(shù)的生成時(shí)間。
max_depth:決策樹(shù)最大深,可選參數(shù),默認(rèn)是None。這個(gè)參數(shù)是這是樹(shù)的層數(shù)的。層數(shù)的概念就是,比如在貸款的例子中,決策樹(shù)的層數(shù)是2層。如果這個(gè)參數(shù)設(shè)置為None,那么決策樹(shù)在建立子樹(shù)的時(shí)候不會(huì)限制子樹(shù)的深度。一般來(lái)說(shuō),數(shù)據(jù)少或者特征少的時(shí)候可以不管這個(gè)值?;蛘呷绻O(shè)置了min_samples_slipt參數(shù),那么直到少于min_smaples_split個(gè)樣本為止。如果模型樣本量多,特征也多的情況下,推薦限制這個(gè)最大深度,具體的取值取決于數(shù)據(jù)的分布。常用的可以取值10-100之間。
min_samples_split:內(nèi)部節(jié)點(diǎn)再劃分所需最小樣本數(shù),可選參數(shù),默認(rèn)是2。這個(gè)值限制了子樹(shù)繼續(xù)劃分的條件。如果min_samples_split為整數(shù),那么在切分內(nèi)部結(jié)點(diǎn)的時(shí)候,min_samples_split作為最小的樣本數(shù),也就是說(shuō),如果樣本已經(jīng)少于min_samples_split個(gè)樣本,則停止繼續(xù)切分。如果min_samples_split為浮點(diǎn)數(shù),那么min_samples_split就是一個(gè)百分比,ceil(min_samples_split * n_samples),數(shù)是向上取整的。如果樣本量不大,不需要管這個(gè)值。如果樣本量數(shù)量級(jí)非常大,則推薦增大這個(gè)值。
min_weight_fraction_leaf:葉子節(jié)點(diǎn)最小的樣本權(quán)重和,可選參數(shù),默認(rèn)是0。這個(gè)值限制了葉子節(jié)點(diǎn)所有樣本權(quán)重和的最小值,如果小于這個(gè)值,則會(huì)和兄弟節(jié)點(diǎn)一起被剪枝。一般來(lái)說(shuō),如果我們有較多樣本有缺失值,或者分類(lèi)樹(shù)樣本的分布類(lèi)別偏差很大,就會(huì)引入樣本權(quán)重,這時(shí)我們就要注意這個(gè)值了。
max_leaf_nodes:最大葉子節(jié)點(diǎn)數(shù),可選參數(shù),默認(rèn)是None。通過(guò)限制最大葉子節(jié)點(diǎn)數(shù),可以防止過(guò)擬合。如果加了限制,算法會(huì)建立在最大葉子節(jié)點(diǎn)數(shù)內(nèi)最優(yōu)的決策樹(shù)。如果特征不多,可以不考慮這個(gè)值,但是如果特征分成多的話,可以加以限制,具體的值可以通過(guò)交叉驗(yàn)證得到。
class_weight:類(lèi)別權(quán)重,可選參數(shù),默認(rèn)是None,也可以字典、字典列表、balanced。指定樣本各類(lèi)別的的權(quán)重,主要是為了防止訓(xùn)練集某些類(lèi)別的樣本過(guò)多,導(dǎo)致訓(xùn)練的決策樹(shù)過(guò)于偏向這些類(lèi)別。類(lèi)別的權(quán)重可以通過(guò){class_label:weight}這樣的格式給出,這里可以自己指定各個(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。
random_state:可選參數(shù),默認(rèn)是None。隨機(jī)數(shù)種子。如果是證書(shū),那么random_state會(huì)作為隨機(jī)數(shù)生成器的隨機(jī)數(shù)種子。隨機(jī)數(shù)種子,如果沒(méi)有設(shè)置隨機(jī)數(shù),隨機(jī)出來(lái)的數(shù)與當(dāng)前系統(tǒng)時(shí)間有關(guān),每個(gè)時(shí)刻都是不同的。如果設(shè)置了隨機(jī)數(shù)種子,那么相同隨機(jī)數(shù)種子,不同時(shí)刻產(chǎn)生的隨機(jī)數(shù)也是相同的。如果是RandomState instance,那么random_state是隨機(jī)數(shù)生成器。如果為None,則隨機(jī)數(shù)生成器使用np.random。
min_impurity_split:節(jié)點(diǎn)劃分最小不純度,可選參數(shù),默認(rèn)是1e-7。這是個(gè)閾值,這個(gè)值限制了決策樹(shù)的增長(zhǎng),如果某節(jié)點(diǎn)的不純度(基尼系數(shù),信息增益,均方差,絕對(duì)差)小于這個(gè)閾值,則該節(jié)點(diǎn)不再生成子節(jié)點(diǎn)。即為葉子節(jié)點(diǎn) 。
presort:數(shù)據(jù)是否預(yù)排序,可選參數(shù),默認(rèn)為False,這個(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)有:
當(dāng)樣本數(shù)量少但是樣本特征非常多的時(shí)候,決策樹(shù)很容易過(guò)擬合,一般來(lái)說(shuō),樣本數(shù)比特征數(shù)多一些會(huì)比較容易建立健壯的模型
如果樣本數(shù)量少但是樣本特征非常多,在擬合決策樹(shù)模型前,推薦先做維度規(guī)約,比如主成分分析(PCA),特征選擇(Losso)或者獨(dú)立成分分析(ICA)。這樣特征的維度會(huì)大大減小。再來(lái)擬合決策樹(shù)模型效果會(huì)好。
推薦多用決策樹(shù)的可視化,同時(shí)先限制決策樹(shù)的深度,這樣可以先觀察下生成的決策樹(shù)里數(shù)據(jù)的初步擬合情況,然后再?zèng)Q定是否要增加深度。
from sklearn.grid_search import GridSearchCV
tree_param_grid = { 'min_samples_split': list((3,6,9)),'n_estimators':list((10,50,100))}
grid = GridSearchCV(RandomForestRegressor(),param_grid=tree_param_grid, cv=5)
grid.fit(data_train, target_train)
grid.grid_scores_, grid.best_params_, grid.best_score_

rfr = RandomForestRegressor( min_samples_split=3,n_estimators = 100,random_state = 42)
rfr.fit(data_train, target_train)
rfr.score(data_test, target_test)

pd.Series(rfr.feature_importances_, index = housing.feature_names).sort_values(ascending = False)

九. 總結(jié)
優(yōu)點(diǎn):
- 易于理解和解釋?zhuān)瑳Q策樹(shù)可以可視化。
- 幾乎不需要數(shù)據(jù)預(yù)處理。其他方法經(jīng)常需要數(shù)據(jù)標(biāo)準(zhǔn)化,創(chuàng)建虛擬變量和刪除缺失值。決策樹(shù)還不支持缺失值。
- 使用樹(shù)的花費(fèi)(例如預(yù)測(cè)數(shù)據(jù))是訓(xùn)練數(shù)據(jù)點(diǎn)(data points)數(shù)量的對(duì)數(shù)。
- 可以同時(shí)處理數(shù)值變量和分類(lèi)變量。其他方法大都適用于分析一種變量的集合。
- 可以處理多值輸出變量問(wèn)題。
- 使用白盒模型。如果一個(gè)情況被觀察到,使用邏輯判斷容易表示這種規(guī)則。相反,如果是黑盒模型(例如人工神經(jīng)網(wǎng)絡(luò)),結(jié)果會(huì)非常難解釋。
- 即使對(duì)真實(shí)模型來(lái)說(shuō),假設(shè)無(wú)效的情況下,也可以較好的適用。
缺點(diǎn): - 決策樹(shù)學(xué)習(xí)可能創(chuàng)建一個(gè)過(guò)于復(fù)雜的樹(shù),并不能很好的預(yù)測(cè)數(shù)據(jù)。也就是過(guò)擬合。修剪機(jī)制(現(xiàn)在不支持),設(shè)置一個(gè)葉子節(jié)點(diǎn)需要的最小樣本數(shù)量,或者數(shù)的最大深度,可以避免過(guò)擬合。
- 決策樹(shù)可能是不穩(wěn)定的,因?yàn)榧词狗浅P〉淖儺悾赡軙?huì)產(chǎn)生一顆完全不同的樹(shù)。這個(gè)問(wèn)題通過(guò)decision trees with an ensemble來(lái)緩解。
- 學(xué)習(xí)一顆最優(yōu)的決策樹(shù)是一個(gè)NP-完全問(wèn)題under several aspects of optimality and even for simple concepts。因此,傳統(tǒng)決策樹(shù)算法基于啟發(fā)式算法,例如貪婪算法,即每個(gè)節(jié)點(diǎn)創(chuàng)建最優(yōu)決策。這些算法不能產(chǎn)生一個(gè)全家最優(yōu)的決策樹(shù)。對(duì)樣本和特征隨機(jī)抽樣可以降低整體效果偏差。
- 概念難以學(xué)習(xí),因?yàn)闆Q策樹(shù)沒(méi)有很好的解釋他們,例如,XOR, parity or multiplexer problems.
- 如果某些分類(lèi)占優(yōu)勢(shì),決策樹(shù)將會(huì)創(chuàng)建一棵有偏差的樹(shù)。因此,建議在訓(xùn)練之前,先抽樣使樣本均衡。
決策樹(shù)算法主要包括三個(gè)部分:特征選擇、樹(shù)的生成、樹(shù)的剪枝。常用算法有 ID3、C4.5、CART。
- 特征選擇。特征選擇的目的是選取能夠?qū)τ?xùn)練集分類(lèi)的特征。特征選擇的關(guān)鍵是準(zhǔn)則:信息增益、信息增益比、Gini 指數(shù);
- 決策樹(shù)的生成。通常是利用信息增益最大、信息增益比最大、Gini 指數(shù)最小作為特征選擇的準(zhǔn)則。從根節(jié)點(diǎn)開(kāi)始,遞歸的生成決策樹(shù)。相當(dāng)于是不斷選取局部最優(yōu)特征,或?qū)⒂?xùn)練集分割為基本能夠正確分類(lèi)的子集;
- 決策樹(shù)的剪枝。決策樹(shù)的剪枝是為了防止樹(shù)的過(guò)擬合,增強(qiáng)其泛化能力。包括預(yù)剪枝和后剪枝。

