決策樹是一種基本的分類方法,當然也可以用於回歸。我們一般只討論用於分類的決策樹。決策樹模型呈樹形結構。在分類問題中,表示基於特征對實例進行分類的過程,它可以認為是if-then規則的集合。在決策樹的結構中,每一個實例都被一條路徑或者一條規則所覆蓋。通常決策樹學習包括三個步驟:特征選擇、決策樹的生成和決策樹的修剪。
特征選擇
特征選擇在於選取對訓練數據具有分類能力的特征。這樣可以提高決策樹學習的效率,如果利用一個特征進行分類的結果與隨機分類的結果沒有很大差別,則稱這個特征是沒有分類能力的。經驗上扔掉這樣的特征對決策樹學習的影響不大。通常特征選擇的准則是信息增益,這是個數學概念。通過一個例子來了解特征選擇的過程。
| ID | 年齡 | 有工作 | 有自己的房子 | 信貸情況 | 類別 |
|---|---|---|---|---|---|
| 1 | 青年 | 否 | 否 | 一般 | 否 |
| 2 | 青年 | 否 | 否 | 好 | 否 |
| 3 | 青年 | 是 | 否 | 好 | 是 |
| 4 | 青年 | 是 | 是 | 一般 | 是 |
| 5 | 青年 | 否 | 否 | 一般 | 否 |
| 6 | 中年 | 否 | 否 | 一般 | 否 |
| 7 | 中年 | 否 | 否 | 好 | 否 |
| 8 | 中年 | 是 | 是 | 好 | 是 |
| 9 | 中年 | 否 | 是 | 非常好 | 是 |
| 10 | 中年 | 否 | 是 | 非常好 | 是 |
| 11 | 老年 | 否 | 是 | 非常好 | 是 |
| 12 | 老年 | 否 | 是 | 好 | 是 |
| 13 | 老年 | 是 | 否 | 好 | 是 |
| 14 | 老年 | 是 | 否 | 非常好 | 是 |
| 15 | 老年 | 否 | 否 | 一般 | 否 |
我們希望通過所給的訓練數據學習一個貸款申請的決策樹,用以對文中的貸款申請進行分類,即當新的客戶提出貸款申請時,根據申請人的特征利用決策樹決定是否批准貸款申請。特征選擇其實是決定用那個特征來划分特征空間。下圖中分別是按照年齡,還有是否有工作來划分得到不同的子節點。


問題是究竟選擇哪個特征更好些呢?那么直觀上,如果一個特征具有更好的分類能力,是的各個自己在當前的條件下有最好的分類,那么就更應該選擇這個特征。信息增益就能很好的表示這一直觀的准則。這樣得到的一棵決策樹只用了兩個特征就進行了判斷:

通過信息增益生成的決策樹結構,更加明顯、快速的划分類別。
信息的度量和作用
我們常說信息有用,那么它的作用如何客觀、定量地體現出來呢?信息用途的背后是否有理論基礎呢?這個問題一直沒有很好的回答,直到1948年,香農在他的論文“通信的數學原理”中提到了“信息熵”的概念,才解決了信息的度量問題,並量化出信息的作用。
一條信息的信息量與其不確定性有着直接的關系,比如我們要搞清一件非常不確定的事,就需要大量的信息。相反如果對某件事了解較多,則不需要太多的信息就能把它搞清楚 。所以從這個角度看,可以認為,信息量就等於不確定的多少。那么如何量化信息量的度量呢?2022年舉行世界杯,大家很關系誰是冠軍。假如我錯過了看比賽,賽后我問朋友 ,“誰是冠軍”?他不願意直接告訴我,讓我每猜一次給他一塊錢,他告訴我是否猜對了,那么我需要掏多少錢才能知道誰是冠軍?我可以把球編上號,從1到32,然后提問:冠 軍在1-16號嗎?依次詢問,只需要五次,就可以知道結果。所以誰是世界杯冠軍這條消息只值五塊錢。當然香農不是用錢,而是用“比特”這個概念來度量信息量。一個比特是 一位二進制數,在計算機中一個字節是8比特。
那么如果說有一天有64支球隊進行決賽階段的比賽,那么“誰是世界杯冠軍”的信息量就是6比特,因為要多猜一次,有的同學就會發現,信息量的比特數和所有可能情況的對數函數log有關,(log32=5,log64=6)
另外一方面你也會發現實際上我們不需要猜五次就能才出冠軍,因為像西班牙、巴西、德國、意大利這樣的球隊奪得冠軍的可能性比南非、尼日利亞等球隊大得多,因此第一次猜測時不需要把32支球隊等分成兩個組,而可以把少數幾支最有可能的球隊分成一組,把其他球隊分成一組。然后才冠軍球隊是否在那幾支熱門隊中。這樣,也許三次就猜出結果。因此,當每支球隊奪冠的可能性不等時,“誰是世界杯冠軍”的信息量比5比特少。香農指出,它的准確信息量應該是:
H = -(p1logp1 + p2logp2 + ... + p32log32)
其中,p1...p32為這三支球隊奪冠的概率。H的專業術語稱之為信息熵,單位為比特,當這32支球隊奪冠的幾率相同時,對應的信息熵等於5比特,這個可以通過計算得出。有一個特性就是,5比特是公式的最大值。那么信息熵(經驗熵)的具體定義可以為如下:

信息增益
自古以來,信息和消除不確定性是相聯系的。所以決策樹的過程其實是在尋找某一個特征對整個分類結果的不確定減少的過程。那么這樣就有一個概念叫做信息增益(information gain)。
那么信息增益表示得知特征X的信息而使得類Y的信息的不確定性減少的程度,所以我們對於選擇特征進行分類的時候,當然選擇信息增益較大的特征,這樣具有較強的分類能力。特征A對訓練數據集D的信息增益g(D,A),定義為集合D的經驗熵H(D)與特征A給定條件下D的經驗條件熵H(D|A)之差,即公式為:

根據信息增益的准則的特征選擇方法是:對於訓練數據集D,計算其每個特征的信息增益,並比較它們的阿笑,選擇信息增益最大的特征。
信息增益的計算

所以首先對於經驗熵來說,計算如下:

那么條件熵計算如下:

既然我們有了這兩個公式,我們可以根據前面的是否通過貸款申請的例子來通過計算得出我們的決策特征順序。那么我們首先計算總的經驗熵為:
H(D) = -(9/15 * log(9/15) + 6/15 * log(6/15)) = 0.9709505944546686
然后計算出年齡的信息增益為:
H(D|年齡) = H(D) - H(D'|年齡) = 0.9709505944546686 - [1/3H(青年) + 1/3H(中年) + 1/3H(老年)]
H(青年) = -(3/5 * log(3/5) + 2/5 * log(2/5))
H(青年) = -(3/5 * log(3/5) + 2/5 * log(2/5))
H(老年) = -(4/5 * log(4/5) + 1/5 * log(1/5))
常見決策樹使用的算法
-
ID3:信息增益 最大的准則
-
C4.5:信息增益比 最大的准則
-
CART:
回歸樹: 平方誤差 最小
分類樹: 基尼系數 最小的准則 在sklearn中可以選擇划分的原則
sklearn決策樹API
sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None):決策樹分類器
參數:
- criterion:默認是’gini’系數,也可以選擇信息增益的熵’entropy’
- max_depth:樹的深度大小
- random_state:隨機數種子
方法:
- decision_path:返回決策樹的路徑
泰坦尼克號案例
在泰坦尼克號和titanic2數據幀描述泰坦尼克號上的個別乘客的生存狀態。在泰坦尼克號的數據幀不包含從劇組信息,但它確實包含了乘客的一半的實際年齡。關於泰坦尼克號旅客的數據的主要來源是百科全書Titanica。這里使用的數據集是由各種研究人員開始的。其中包括許多研究人員創建的旅客名單,由Michael A. Findlay編輯。
我們提取的數據集中的特征是票的類別,存活,乘坐班,年齡,登陸,home.dest,房間,票,船和性別。乘坐班是指乘客班(1,2,3),是社會經濟階層的代表。
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
# 獲取數據
titannic = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# print(titannic.info())
# 選取一些特征
x = titannic[["pclass", "age", "sex"]]
y = titannic["survived"]
# 處理缺失值
x["age"].fillna(x["age"].mean(), inplace=True)
# 數據集分隔
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
# 字典特征抽取
dv = DictVectorizer(sparse=False)
# print(x_train.to_dict(orient="record"))
x_train = dv.fit_transform(x_train.to_dict(orient="records"))
# print(dv.get_feature_names())
x_test = dv.transform(x_test.to_dict(orient="records"))
# 決策樹進行預測
dec = DecisionTreeClassifier()
dec.fit(x_train, y_train)
print("預測的准確率:", dec.score(x_test, y_test))
# 導出決策樹
export_graphviz(dec, out_file="titannic_tree.dot", feature_names=dv.get_feature_names())
輸出結果:
預測的准確率: 0.8206686930091185
sklearn.tree.export_graphviz() 該函數能夠導出DOT格式tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
使用graphviz將dot文件轉換成png圖片。
在ubuntu的安裝命令:
sudo apt-get install graphviz
運行命令轉成png:
dot -Tpng titannic_tree.dot -o titannic_tree.png
決策樹的優缺點以及改進
優點:
-
簡單的理解和解釋,樹木可視化。
-
需要很少的數據准備。其他技術通常需要數據歸一化,需要創建虛擬變量,並刪除空值。但請注意,此模塊不支持缺少值。
-
使用樹的成本(即,預測數據)在用於訓練樹的數據點的數量上是對數的。
缺點:
- 決策樹學習者可以創建不能很好地推廣數據的過於復雜的樹。這被稱為過擬合。修剪(目前不支持)的機制,設置葉節點所需的最小采樣數或設置樹的最大深度是避免此問題的必要條件。
- 決策樹可能不穩定,因為數據的小變化可能會導致完全不同的樹被生成。通過使用合奏中的決策樹來減輕這個問題。
改進:
- 減枝cart算法
- 隨機森林
集成學習方法-隨機森林
集成學習通過建立幾個模型組合的來解決單一預測問題。它的工作原理是生成多個分類器/模型,各自獨立地學習和作出預測。這些預測最后結合成單預測,因此優於任何一個單分類的做出預測。
什么是隨機森林?
在機器學習中,隨機森林是一個包含多個決策樹的分類器,並且其輸出的類別是由個別樹輸出的類別的眾數而定。
學習算法
根據下列算法而建造每棵樹:
- 用N來表示訓練用例(樣本)的個數,M表示特征數目。
- 輸入特征數目m,用於確定決策樹上一個節點的決策結果;其中m應遠小於M。
- 從N個訓練用例(樣本)中以有放回抽樣的方式,取樣N次,形成一個訓練集(即bootstrap取樣),並用未抽到的用例(樣本)作預測,評估其誤差。
- 對於每一個節點,隨機選擇m個特征,決策樹上每個節點的決定都是基於這些特征確定的。根據這m個特征,計算其最佳的分裂方式。
為什么要隨機抽樣訓練集?
如果不進行隨機抽樣,每棵樹的訓練集都一樣,那么最終訓練出的樹分類結果也是完全一樣的。
為什么要有放回地抽樣?
如果不是有放回的抽樣,那么每棵樹的訓練樣本都是不同的,都是沒有交集的,這樣每棵樹都是“有偏的”,都是絕對“片面的”(當然這樣說可能不對),也就是說每棵樹訓練出來都是有很大的差異的;而隨機森林最后分類取決於多棵樹(弱分類器)的投票表決。
集成學習API
class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’,
max_depth=None, bootstrap=True, random_state=None):隨機森林分類器
參數:
- n_estimators:integer,optional(default = 10) 森林里的樹木數量
- criteria:string,可選(default =“gini”)分割特征的測量方法
- max_depth:integer或None,可選(默認=無)樹的最大深度
- bootstrap:boolean,optional(default = True)是否在構建樹時使用放回抽樣
改造之前泰坦尼克號的案例
from sklearn.ensemble import RandomForestClassifier
...
# 隨機森林進行預測
rf = RandomForestClassifier()
# 網格搜索與交叉認證
param = {"n_estimators": [120, 200, 300, 400, 500, 800, 1200], "max_depth": [3, 5, 15, 25, 30]}
gc = GridSearchCV(rf, param_grid=param, cv=2)
gc.fit(x_train, y_train)
print("准確率為:", gc.score(x_test, y_test))
print("最佳的模型參數:", gc.best_params_)
輸出結果:
准確率為: 0.8297872340425532
最佳的模型參數: {'max_depth': 5, 'n_estimators': 120}
隨機森林的優點:
- 在當前所有算法中,具有極好的准確率
- 能夠有效地運行在大數據集上
- 能夠處理具有高維特征的輸入樣本,而且不需要降維
- 能夠評估各個特征在分類問題上的重要性
- 對於缺省值問題也能夠獲得很好得結果
