https://blog.csdn.net/cjianwyr/article/details/54907089
決策樹——非線性回歸與分類
前面幾章,我們介紹的模型都是廣義線性模型,基本方法都是通過聯接方程構建解釋變量與若干響應變量的關聯關系。我們用多元線性回歸解決回歸問題,邏輯回歸解決分類問題。本章我們要討論一種簡單的非線性模型,用來解決回歸與分類問題,稱為決策樹(decision tree)。首先,我們將用決策樹做一個廣告屏蔽器,可以將網頁中的廣告內容屏蔽掉。之后,我們介紹集成學習(lensemble learning)方法,通過將一系列學習方法集成使用,以取得更好的訓練效果。
決策樹簡介
決策樹就是做出一個樹狀決策,就像猜猜看(Twenty Questions)的游戲。一個玩家(先知)選擇一種常見物品,但是事先不能透露給其他玩家(提問者)。提問者最多問20個問題,而先知只能回答:是,否,可能三種答案。提問者的提問會根據先知的回答越來越具體,多個問題問完后,提問者的決策就形成了一顆決策樹。決策樹的分支由可以猜出響應變量值的最短的解釋變量序列構成。因此,在猜猜看游戲中,提問者和先知對訓練集的解釋變量和響應變量都很了解,但是只有先知知道測試集的響應變量值。
決策樹通常是重復的將訓練集解釋變量分割成子集的過程,如下圖所示。決策樹的節點用方塊表示,用來測試解釋變量。每個節點向下的邊表示不同決策產生結果。訓練集的樣本由決策結果分成不同的子集。例如,一個節點測試解釋變量的值是否超過的限定值。如果沒有超過,則進入該節點的右側子節點;如果超過,則進入左側子節點。子節點的運行原理和前面的一樣,直到終止條件(stopping criterion)滿足才停止。在分類任務中,包含在葉子節點中的樣本響應變量的值的平均值作為響應變量的估計值。決策樹建立之后,做決策的過程就是把測試樣本放進決策樹沿着邊不斷前進,直到一個葉子被觸及才停止前進。
訓練決策樹
我們用Ross Quinlan發明的ID3(Iterative Dichotomiser 3,迭代二叉樹3代)算法創建決策樹,ID3是最早用於決策樹的算法之一。假設你有一些貓和狗的分類數據。但是不允許直接觀察,你只能通過動物特征的描述去做決策。對每個動物,你都會獲得關於“是否喜歡玩球(play fetch)”和“是否經常發脾氣”,以及它最喜歡的食物三個問題的答案。
要正確分出新動物的種類,決策樹需要對每條邊的解釋變量進行檢查。每條邊的下一個節點由測試結果決定。例如,第一關節點可能問“是否喜歡玩球”,如果回答“YES”,則進入左節點,否則,如果回答“NO”,則進入右節點。以此類推,最后一條邊會指向一個葉子節點,那就是答案。下表是14個節點的訓練數據:
訓練數據 | 是否喜歡玩球 | 是否經常發脾氣 | 最喜歡的食物 | 種類 |
---|---|---|---|---|
1 | Yes | No | Bacon | Dog |
2 | No | Yes | Dog Food | Dog |
3 | No | Yes | Cat food | Cat |
4 | No | Yes | Bacon | Cat |
5 | No | No | Cat food | Cat |
6 | No | Yes | Bacon | Cat |
7 | No | Yes | Cat Food | Cat |
8 | No | No | Dog Food | Dog |
9 | No | Yes | Cat food | Cat |
10 | Yes | No | Dog Food | Dog |
11 | Yes | No | Bacon | Dog |
12 | No | No | Cat food | Cat |
13 | Yes | Yes | Cat food | Cat |
14 | Yes | Yes | Bacon | Dog |
從數據中我們發現,貓比狗更容易發脾氣。大多數狗玩球,而貓不愛玩。狗更喜歡狗糧和培根,而貓喜歡貓糧和培根。解釋變量
是否喜歡玩球
和
是否經常發脾氣
可以轉換成二元特征值。解釋變量
最喜歡的食物
可以轉換成一個具有三個可能值的分類變量,可以用熱獨編碼
[1,0,0]
,
[0,1,0]
,
[0,0,1]
表示,具體方法在第三章已經介紹過。通過上面的分析,我們可以構建模型的規則。例如,一個動物如果經常發脾氣且喜歡吃貓糧那就是貓,如果喜歡玩球且愛吃培根就是狗。在這么小的訓練集里,想手工逐條構建規則也是非常麻煩的事情。因此,下面我們來構建決策樹。
問題選擇
和猜猜看一樣,決策樹也是通過對解釋變量序列的逐條測試獲取響應變量結果的。那么,哪個解釋變量應該先測試?直覺觀察會發現,解釋變量集合包含所有貓或者所有狗的測試,比既包含貓又包含狗的解釋變量集合的測試要好。如果子集成員種類不同,我們還是不能確定種類。我們還需要避免創建那種測試,把單獨的一只貓或一條狗分離出去,這種做法類似於猜猜看問題中前幾輪就問非常具體的問題。更一般的情形是,這些測試極少可以分出一個樣本的種類,也不能降低分類不確定性。能夠降低分類不確定性的測試通常都是最好的測試。我們通常用熵(entropy)來度量信息的不確定性。
以比特(bits)為計量單位,熵量化了一個變量的不確定性。熵計算公式如下所示:
其中,n是樣本的數量,P(xi)是第i個樣本的概率。b一般取2,e或10。因為對數函數中真數小於1則對數值為0,因此,公式前面加符號使熵為正數。
例如,一個硬幣投擲一次事件發生后一般有兩種可能:正面或反面。正面朝上的概率是0.5,反面朝上的概率也是0.5。那么一個硬幣投擲一次的結果這個變量的熵:
也就是說,兩個等概率的可能值,正面和反面,只需要一個比特。如果是兩個硬幣投擲一次事件發生后一般有四種可能:正面正面,正面反面,反面反面,反面正面,每種可能的概率是0.25。其熵為:
H(X)=−(0.25log20.25×4)=2.0
如果硬幣的兩面相同,那么表示其可能值的變量熵為0比特,也就是說,結果是確定的,變量再也不會產生新信息量了。熵還可以用小數值表示。比如,一個不正常的硬幣,其正反面的材質不同,一邊重一邊輕。導致其投擲后正面朝上的概率0.8,反面朝上概率0.2。那么其熵為:
H(X)=−(0.8log20.8+0.2log20.2)=0.721928095
一個不正常的硬幣投擲后其結果的熵是一個小數。雖然兩種結果都有可能,但是因為其中一種可能性更大,所有不確定性減小了。
下面讓我們計算動物分類的熵。如果訓練集數據中貓和狗數量是相等的,而且我們不知道動物的任何其他信息,那么決策的熵是1。這就像普通硬幣的結果一樣,非貓即狗,兩種可能概率一樣。但是,我們的訓練數據里面,6條狗8只貓。如果我們不考慮其他信息,那么決策的熵就是:
H(X)=−(614log2614+814log2814)=0.985228136
由於貓更多,所以不確定性要小一些。現在讓我們找出對分類最有用的解釋變量,也就是找出對熵降幅最大的解釋變量。我們可以測試
是否喜歡玩球
這個解釋變量,把測試分成兩支,喜歡玩和不喜歡玩,其結果如下圖所示:
決策樹通常都是用流程圖顯示決策過程的。最上面的方框是根節點,包括所有要測試的解釋變量。在根節點里我們還沒有開始測試,所以變量的熵設為0.985228136。前面我們介紹過,將解釋變量
是否喜歡玩球
轉換成二元變量,左子節點用0表示,右子節點用1表示。左子節點包括7只貓和2條狗都是不喜歡玩球的數據。計算這時解釋變量的熵:
H(X)=−(79log279+29log229)=0.764204507
右子節點包括1只貓和4條狗都是喜歡玩球的數據。計算這時解釋變量的熵:
H(X)=−(15log215+45log245)=0.721928095
同理,我們也可以測試解釋變量
是否經常發脾氣
。不經常發脾氣為左子節點,用0表示,經常發脾氣為右子節點,用1表示。
也可以對解釋變量
最喜歡的食物
。對每一種食物都可以按照前面的思路進行測試:
信息增益
對解釋變量
最喜歡的食物
的值是貓糧進行測試的結果是,右節點喜歡貓糧的動物中6只貓沒有狗,其熵為0,而做節點2只貓6條狗,其熵為0.8113比特。我們如何評估哪一個變量最大程度的降低了分類的不確定性?子集熵的均值看起來像是一個合理的度量指標。本例中,貓糧測試這個子集熵的均值最小。直觀上看,這條測試也更有效,因為我們可以用它識別出幾乎是一半樣本。但是,實際上這么做可能做導致決策局部最優值。例如,假設有一個子集的結果是兩條狗沒有貓,另一個子集的結果是4條狗8只貓。第一個子集的熵是0,而第二個子集的熵0.918。那么平均熵是0.459,但是第二個子集包含了絕大多數樣本,而其熵接近1比特。
這就好像在猜猜看游戲中過早的問了太具體的問題,而我們的問題並沒有消除許多可能性。因此,我們要用一種方法來合理度量熵的降幅,這個方法稱為信息增益(information gain)。信息增益是父節點熵,用H(T)表示與其子節點熵的加權均值的差,計算公式如下:
其中,
表示解釋變量a的樣本x。
表示解釋變量a的值等於v樣本數量。H({x∈T|xa=v})是解釋變量a的值等於v樣本熵。
下表就是本例信息增益的計算結果。可以看出,貓糧測試是最佳選擇,因為其信息增益最大。
測試 | 父節點熵 | 左子節點熵 | 右子節點熵 | 加權平均 | 信息增益 |
---|---|---|---|---|---|
是否喜歡玩球? | 0.9852 | 0.7642 | 0.7219 | 0.7490 * 9/14 + 0.7219 * 5/14 = 0.7491 | 0.2361 |
是否經常發脾氣? | 0.9852 | 0.9183 | 0.8113 | 0.9183 * 6/14 + 0.8113 * 8/14 = 0.8571 | 0.1280 |
最喜歡的食物 = 貓糧 | 0.9852 | 0.8113 | 0 | 0.8113 * 8 /14 + 0.0 * 6/14 = 0.4636 | 0.5216 |
最喜歡的食物 = 狗糧 | 0.9852 | 0.8454 | 0 | 0.8454 * 11/14 + 0.0 * 3/14 = 0.6642 | 0.3210 |
最喜歡的食物 = 培根 | 0.9852 | 0.9183 | 0.971 | 0.9183 * 9/14 + 0.9710 * 5/14 = 0.9371 | 0.0481 |
現在讓我們增加其他的節點到決策樹中。一個子節點只包含貓,另一個子節點還有2只貓和6條狗,我們測試這個節點。同理,按照信息增益方法計算可以得到下表數據:
測試 | 父節點熵 | 左子節點熵 | 右子節點熵 | 加權平均 | 信息增益 |
---|---|---|---|---|---|
是否喜歡玩球? | 0.8113 | 1 | 0 | 1.0 * 4/8 + 0 * 4/8 = 0.5 | 0.3113 |
是否經常發脾氣? | 0.8113 | 0 | 1 | 0.0 * 4/8 + 1 * 4/8 = 0.5 | 0.3113 |
最喜歡的食物 = 狗糧 | 0.8113 | 0.9710 | 0 | 0.9710 * 5/8 + 0.0 * 3/8 = 0.6069 | 0.2044 |
最喜歡的食物 = 培根 | 0.8113 | 0 | 0.9710 | 0.0 * 3/8 + 0.9710 * 5/8 = 0.6069 | 0.2044 |
所有的測試都會出現熵為0的情況,但是從表中可以看出,解釋變量
是否喜歡玩球
和
是否經常發脾氣
的信息增益相等且都是最大的。ID3算法會隨機選擇一個節點繼續測試。我們選擇
是否經常發脾氣
這個解釋變量。它的右節點的8個動物分成左節點是4條狗,右節點是兩只貓兩只狗。如下圖所示:
現在我們對剩下的解釋變量進行信息增益計算,包括
是否喜歡玩球?
,
最喜歡的食物 = 狗糧
,
最喜歡的食物 = 培根
,這些解釋變量測試的結果都是一個節點是一只貓或一條狗,另一個節點是剩下的動物。其信息增益計算結果如下表所示:
測試 | 父節點熵 | 左子節點熵 | 右子節點熵 | 加權平均 | 信息增益 |
---|---|---|---|---|---|
是否喜歡玩球? | 1 | 0.9183 | 0 | 0.688725 | 0.311275 |
最喜歡的食物 = 狗糧 | 1 | 0.9183 | 0 | 0.688725 | 0.311275 |
最喜歡的食物 = 培根 | 1 | 0 | 0.9183 | 0.688725 | 0.311275 |
我們隨機選擇
是否喜歡玩球?
這個解釋變量來生成后面的節點,左節點包含一條狗,右節點包含兩只貓和一條狗。其他兩個解釋變量,
最喜歡的食物 = 狗糧
和
最喜歡的食物 = 培根
產生同樣的結果,左節點包含一條狗,右節點包含兩只貓。然后,我們隨機選擇
最喜歡的食物 = 狗糧
進行測試,最終勝出決策樹如下圖所示:
讓我們用下表的測試集數據對決策樹進行測試:
訓練數據 | 是否喜歡玩球 | 是否經常發脾氣 | 最喜歡的食物 | 種類 |
---|---|---|---|---|
1 | Yes | No | Bacon | Dog |
2 | Yes | Yes | Dog Food | Dog |
3 | No | Yes | Dog Food | Cat |
4 | No | Yes | Bacon | Cat |
5 | No | No | Cat food | Cat |
讓我們來找第一個動物的類型,它喜歡玩球,不經常發脾氣,喜歡培根。沿着決策樹往下走,根節點測試不喜歡貓糧,因此進入左節點。又不經常發脾氣,依然進入左節點,現在的葉子節點只有狗,因此這個動物種類是狗。其他動物也按照同樣的方法去查找,第三個動物是一只貓,根節點測試不喜歡貓糧,進入左節點,然后經常發脾氣,進入右節點,不喜歡玩球,進入左節點,喜歡狗糧,進入右節點,因此該動物是貓。
這樣我們就用ID3算法實現了一個決策樹。還有很多算法也可以實現決策樹,C4.5算法是ID3的改進版,可以用來處理連續的解釋變量並考慮特征值丟失。C4.5算法可以修剪(prune)決策樹,修剪是通過更少的葉節點來替換分支,以縮小決策樹的規模。scikit-learn的決策樹實現算法是CART(Classification and Regression Trees,分類與回歸樹)算法,CART也是一種支持修剪的學習算法。
基尼不純度
前面我們用最大信息增益建立決策樹。還有一個啟發式方法是基尼不純度(Gini impurity),度量一個集合中每種類型的比例。基尼不純度格式如下:
其中,j是類型的數量,t是節點樣本的子集,
是從節點子集中選擇一個類型i的概率。
可以看出,如果集合中只有一類,那么基尼不純度值為0。和熵一樣,當每個類型概率相同時,基尼不純度最大。此時,基尼不純度的最大值有類型的數量決定:
Ginimax=1−1n
我們的例子有兩種類型,所有基尼不純度的最大值是0.5。scikit-learn研究決策樹的算法,既支持信息增益,也支持基尼不純度。到底用哪種方法並沒有規定,實際上,它們產生的結果類似。一般的決策樹都是兩個都用,比較一下結果,哪個好用哪個。
scikit-learn決策樹
下面讓我們用scikit-learn的決策樹來做一個廣告屏蔽程序。這個程序可以預測出網頁上的圖片是廣告還是正常內容。被確認是廣告的圖片通過調整CSS隱藏。我們用互聯網廣告數據集(Internet
Advertisements Data Set)來實現分類器,里面包含了3279張圖片。不過類型的比例並不協調,459幅廣告圖片,2820幅正常內容。決策樹學習算法可以從比例並不協調的數據集中生成一個不平衡的決策樹(biased tree)。在決定是否值得通過過抽樣(over-sampling)和欠抽樣(under-sampling)的方法平衡訓練集之前,我們將用不相關的數據集對模型進行評估。本例的解釋變量就是圖片的尺寸,網址鏈接里的單詞,以及圖片標簽周圍的單詞。響應變量就是圖片的類型。解釋變量已經被轉換成特征向量了。前三個特征值表示寬度,高度,圖像縱橫比(aspect
ratio)。剩下的特征是文本變量的二元頻率值。下面,我們用網格搜索來確定決策樹模型最大最優評價效果(F1 score)的超參數,然后把決策樹用在測試集進行效果評估。
In [24]:
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 import zipfile # 壓縮節省空間 z = zipfile.ZipFile('mlslpic/ad.zip') df = pd.read_csv(z.open(z.namelist()[0]), header=None, low_memory=False) 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)]
首先,我們讀取數據文件,然后解釋變量和響應變量分開。
In [25]:
X.replace(to_replace=' *\?', value=-1, regex=True, inplace=True) X_train, X_test, y_train, y_test = train_test_split(X, y)
我們把廣告圖片設為陽性類型,正文圖片設為陰性類型。超過1/4的圖片其寬帶或高度的值不完整,用空白加問號(“ ?”)表示,我們用正則表達式替換為-1,方便計算。然后我們用交叉檢驗對訓練集和測試集進行分割。
In [26]:
pipeline = Pipeline([ ('clf', DecisionTreeClassifier(criterion='entropy')) ])
我們創建了pipeline和
DecisionTreeClassifier
類的實例,將
criterion
參數設置成
entropy
,這樣表示使用信息增益啟發式算法建立決策樹。
In [27]:
parameters = { 'clf__max_depth': (150, 155, 160), 'clf__min_samples_split': (1, 2, 3), 'clf__min_samples_leaf': (1, 2, 3) }
然后,我們確定網格搜索的參數范圍。最后將
GridSearchCV
的搜索目標
scoring
設置為
f1
。
In [28]:
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('最優參數:') 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))
[Parallel(n_jobs=-1)]: Done 1 jobs | elapsed: 20.3s [Parallel(n_jobs=-1)]: Done 50 jobs | elapsed: 41.5s [Parallel(n_jobs=-1)]: Done 75 out of 81 | elapsed: 51.4s remaining: 4.0s [Parallel(n_jobs=-1)]: Done 81 out of 81 | elapsed: 53.1s finished
Fitting 3 folds for each of 27 candidates, totalling 81 fits 最佳效果:0.899 最優參數: clf__max_depth: 160 clf__min_samples_leaf: 1 clf__min_samples_split: 3 precision recall f1-score support 0 0.97 0.98 0.98 709 1 0.88 0.83 0.86 111 avg / total 0.96 0.96 0.96 820
這個分類器發現了測試集中90%的廣告,真廣告中有88%被模型發現了,你運行的數據結果可能會有不同。分類器的效果還可以,下面我們進一步改善模型的效果。
決策樹集成
集成學習方法將一堆模型組合起來使用,比單個模型可以獲取更好的效果。隨機森林(random forest)是一種隨機選取訓練集解釋變量的子集進行訓練,獲得一系列決策樹的集合的方法。隨機森林通常用其決策樹集合里每個決策樹的預測結果的均值或眾數作為最終預測值。scikit-learn里的隨機森林使用均值作為預測值。隨機森林相比單一決策樹,不太會受到擬合過度的影響,因為隨機森林的每個決策樹都看不到訓練集的全貌,只是訓練一部分解釋變量數據,不會記憶訓練集的全部噪聲。
下面我們用隨機森林升級我們的廣告屏蔽程序。把前面用的
DecisionTreeClassifier
替換成
RandomForestClassifier
就可以了。和前面一樣,我們仍然用網格搜索來探索最優超參數。
In [31]:
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 import zipfile # 壓縮節省空間 z = zipfile.ZipFile('mlslpic/ad.zip') df = pd.read_csv(z.open(z.namelist()[0]), header=None, low_memory=False) 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__n_estimators': (5, 10, 20, 50), 'clf__max_depth': (50, 150, 250), '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('最優參數:') 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))
[Parallel(n_jobs=-1)]: Done 1 jobs | elapsed: 3.4s [Parallel(n_jobs=-1)]: Done 50 jobs | elapsed: 24.0s [Parallel(n_jobs=-1)]: Done 200 jobs | elapsed: 1.3min [Parallel(n_jobs=-1)]: Done 318 out of 324 | elapsed: 2.0min remaining: 2.1s [Parallel(n_jobs=-1)]: Done 324 out of 324 | elapsed: 2.0min finished
Fitting 3 folds for each of 108 candidates, totalling 324 fits 最佳效果:0.914 最優參數: clf__max_depth: 50 clf__min_samples_leaf: 1 clf__min_samples_split: 1 clf__n_estimators: 20 precision recall f1-score support 0 0.98 0.99 0.99 712 1 0.94 0.90 0.92 108 avg / total 0.98 0.98 0.98 820
這個分類器發現了測試集中91%的廣告,各類指標相比單一決策樹都有明顯改善。精確率和召回率都提升到98%。
決策樹的優劣勢
和前面幾章介紹過的模型相比,決策樹的用法更簡單。首先,決策樹對數據沒有零均值,均方差的要求。而且可以容忍解釋變量值的缺失,雖然現在的scikit-learn還沒實現這一特點。決策樹在訓練的時候可以忽略與任務無關的解釋變量。
小型決策樹很容易理解,而且可以通過scikit-learn的
tree
模塊里的
export_graphviz
函數生成圖形,可視化效果好。決策樹的分支都有着邏輯上的聯接關系,很容易通過流程圖畫出來。另外,決策樹支持多輸出任務,單一決策樹可以用於多類分類,不需要使用one-versus-all策略。
和前面介紹過的模型一樣,決策樹是一種積極學習方法(eager learner),必須在它們可以用於預測測試集任務時,先從訓練集建立一個與后面的需求無關的模型,但是模型一旦建好它們可以很快的預測出結果。相反,有些算法是消極學習方法(lazy learners),像K最近鄰(K-Nearest Neighbor,KNN)分類算法,它們必須等到有了訓練集數據的預測需求,才會開始學習整個數據的特征。消極學習方法不需要花時間訓練預測能力,但是比積極學習方法預測速度慢。
決策樹比我們之前介紹的算法更容易擬合過度,因為它們可以通過精確的描述每個訓練樣本的特征,構建出復雜的決策樹,從而忽略了一般性的真實關聯關系。有一些技術可以修正決策樹的擬合過度。修剪就是一個常用的策略,將決策樹里一些最高的子節點和葉子節點剪掉,但是目前scikit-learn還沒有相應的實現。但是,類似的效果可以通過設置決策樹最大深度,或者限定只有當決策樹包含的訓練樣本數量超過限定值時才創建子節點。
DecisionTreeClassifier
和
DecisionTreeRegressor
類都有這樣的參數可以設置。另外,隨機森林決策樹也可以消除擬合過度。
像ID3這樣的決策樹學習算法是貪婪的(greedy)。它們充分的學習有時會深陷於局部最優的美夢,但是不能保證生成最優決策樹。ID3通過選擇解釋變量序列進行測試。一個解釋變量被選中是因為它比其他解釋變量更大幅度的降低了不確定性。但是,有可能全局最優的決策並非局部最優。
在我們的例子中,決策樹的規模並不重要,因為我們可以獲取所有節點。但是,在現實應用中,決策樹的規模被修剪以及其他技術限制。而決策樹經過修剪后的不同形狀會產生不同的效果。實際上,由信息增益和基尼不純度啟發式方法計算出的局部最優決策通常都會生成一個可行的決策樹。
總結
本章我們介紹了一個非線性模型——決策樹,用來解決分類和回歸問題。就像猜猜看游戲一樣,決策樹也是由一些了問題構成一個測試實例。決策樹的一個分支在遇到顯示響應變量值的葉子節點時停止。我們介紹了ID3算法,用來訓練決策樹,通過遞歸分割訓練集,形成子集以減低響應變量的不確定性。我們還介紹了集成學習方法,通過將一系列模型組合起來達到更好的學習效果。最后,我們用隨機森林方法對圖片是廣告還是網頁正文進行了預測。下一章,我們將介紹第一種非監督學習方法:聚類