Infi-chu:
http://www.cnblogs.com/Infi-chu/
一、簡介
決策樹思想的來源非常朴素,程序設計中的條件分支結構就是if-else結構,最早的決策樹就是利用這類結構分割數據的一種分類學習方法
1.定義:
決策樹是一種樹形結構,其中每個內部節點表示一個屬性上的判斷,每個分支代表一個判斷結果的輸出,最后每個葉節點代表一種分類結果,本質是一顆由多個判斷節點組成的樹。
二、決策樹原理
1.熵
在物理學中,熵Entropy是“混亂”程度的度量
系統越有序,熵越低;系統混亂或者越分散,熵越高
信息理論:
1、從信息的完整性上進行的描述:
當系統的有序狀態一致時,**數據越集中的地方熵值越小,數據越分散的地方熵值越大。
2、從信息的有序性上進行的描述:
當數據量一致時,系統越有序,熵值越低;系統越混亂或者分散,熵值越高。
1948年香農提出了信息熵(Entropy)的概念。
假如事件A的分類划分是(A1,A2,...,An),每部分發生的概率是(p1,p2,...,pn),那信息熵定義為公式如下:(log是以2為底,lg是以10為底)
eg.
案例1: 如果一顆骰子的六個面都是1 ,投擲它不會給你帶來任何新信息,因為你知道它的結果肯定是1,它的信息熵為? 答案: - log(1) = 0 。 案例2: 假設我們沒有看世界杯的比賽,但是想知道哪支球隊會是冠軍, 我們只能猜測某支球隊是或不是冠軍,然后觀眾用對或不對來回答, 我們想要猜測次數盡可能少,你會用什么方法? 答案: 二分法: 假如有 16 支球隊,分別編號,先問是否在 1-8 之間,如果是就繼續問是否在 1-4 之間, 以此類推,直到最后判斷出冠軍球隊是哪只。 如果球隊數量是 16,我們需要問 4 次來得到最后的答案。那么世界冠軍這條消息的信息熵就是 4。 如果有32個球隊,准確的信息量應該是: H = -(p1 * logp1 + p2 * logp2 + ... + p32 * logp32), 其中 p1, ..., p32 分別是這 32 支球隊奪冠的概率。 當每支球隊奪冠概率相等都是 1/32 的時:H = -(32 * 1/32 * log1/32) = 5 每個事件概率相同時,熵最大,這件事越不確定。 案例3: 籃球比賽里,有4個球隊 {A,B,C,D} ,獲勝概率分別為{1/2, 1/4, 1/8, 1/8},求H(X) 答案: H(X) = 1\2log(2)+1\4log(4)+1\8log(8)+1\8log(8)=(1\2+1\2+3\8+3\8)log(2)=7\4bits tips: 以2為底,記做lb,單位bit 以e為底,記做ln,單位nat
2.決策樹划分依據——信息增益
定義:
信息增益:以某特征划分數據集前后的熵的差值。熵可以表示樣本集合的不確定性,熵越大,樣本的不確定性就越大。因此可以使用划分前后集合熵的差值來衡量使用當前特征對於樣本集合D划分效果的好壞。
信息增益 = entroy(前) - entroy(后)
公式:
特征A對訓練數據集D的信息增益g(D,A),定義為集合D的信息熵H(D)與特征A給定條件下D的信息條件熵H(D|A)之差,即公式為:
公式詳解:
【注】
信息增益表示得知特征X的信息,使得類Y的信息熵減少的程度。
eg.
如圖,第一列為論壇號碼,第二列為性別,第三列為活躍度,最后一列用戶是否流失。
我們要解決一個問題:性別和活躍度兩個特征,哪個對用戶流失影響更大?
通過計算信息增益可以解決這個問題,統計上右表信息
其中Positive為正樣本(已流失),Negative為負樣本(未流失),下面的數值為不同划分下對應的人數。
可得到三個熵:
整體熵:
性別熵
性別信息熵
活躍度熵
活躍度信息熵
【注】
活躍度的信息增益比性別的信息增益大,也就是說,活躍度對用戶流失的影響比性別大。
在做特征選擇或者數據分析的時候,我們應該重點考察活躍度這個指標。
3.決策樹划分依據——信息增益率
增益率:增益比率度量是用前面的增益度量Gain(S,A)和所分離信息度量SplitInformation(如上例的性別,活躍度等)的比值來共同定義的。
4.決策樹划分依據——基尼值和基尼指數
基尼值Gini(D):從數據集D中隨機抽取兩個樣本,其類別標記不一致的概率。故,Gini(D)值越小,數據集D的純度越高。
基尼指數Gini_index(D):一般,選擇使划分后基尼系數最小的屬性作為最優化分屬性。
eg.
根據下圖列表,按照基尼指數的划分依據,做出決策樹。
1,對數據集非類標號屬性{是否有房,婚姻狀況,年收入}分別計算它們的Gini系數增益,取Gini系數增益值最大的屬性作為決策樹的根節點屬性。
2,根節點的Gini系數為:
3,當根據是否有房來進行划分時,Gini系數增益計算過程為:
4,若按婚姻狀況屬性來划分,屬性婚姻狀況有三個可能的取值{married,single,divorced},分別計算划分后的Gini系數增益。
{married} | {single,divorced}
{single} | {married,divorced}
{divorced} | {single,married}
當分組為{married} | {single,divorced}時:
當分組為{single} | {married,divorced}時:
當分組為{divorced} | {single,married}時:
對比計算結果,根據婚姻狀況屬性來划分根節點時取Gini系數增益最大的分組作為划分結果,即:{married} | {single,divorced}
5,同理可得年收入Gini:
對於年收入屬性為數值型屬性,首先需要對數據按升序排序,然后從小到大依次用相鄰值的中間值作為分隔將樣本划分為兩組。例如當面對年收入為60和70這兩個值時,我們算得其中間值為65。以中間值65作為分割點求出Gini系數增益。
最大化增益等價於最小化子女結點的不純性度量(Gini系數)的加權平均值,現在我們希望最大化Gini系數的增益。根據計算知道,三個屬性划分根節點的增益最大的有兩個:年收入屬性和婚姻狀況,他們的增益都為0.12。此時,選取首先出現的屬性作為第一次划分。
6,接下來,采用同樣的方法,分別計算剩下屬性,其中根節點的Gini系數為(此時是否拖欠貸款的各有3個records)
7,對於是否有房屬性,可得:
8,對於年收入屬性則有:
5.總結
決策樹構建的基本步驟如下:
-
開始將所有記錄看作一個節點
-
遍歷每個變量的每一種分割方式,找到最好的分割點
-
分割成兩個節點N1和N2
-
對N1和N2分別繼續執行2-3步,直到每個節點足夠“純”為止。
決策樹的變量可以有兩種:
-
數字型(Numeric):變量類型是整數或浮點數,如前面例子中的“年收入”。用“>=”,“>”,“<”或“<=”作為分割條件(排序后,利用已有的分割情況,可以優化分割算法的時間復雜度)。
-
名稱型(Nominal):類似編程語言中的枚舉類型,變量只能從有限的選項中選取,比如前面例子中的“婚姻情況”,只能是“單身”,“已婚”或“離婚”,使用“=”來分割。
如何評估分割點的好壞?
如果一個分割點可以將當前的所有節點分為兩類,使得每一類都很“純”,也就是同一類的記錄較多,那么就是一個好分割點。
比如上面的例子,“擁有房產”,可以將記錄分成了兩類,“是”的節點全部都可以償還債務,非常“純”;“否”的節點,可以償還貸款和無法償還貸款的人都有,不是很“純”,但是兩個節點加起來的純度之和與原始節點的純度之差最大,所以按照這種方法分割。構建決策樹采用貪心算法,只考慮當前純度差最大的情況作為分割點。
常見決策樹類型比較
ID3算法
存在的缺點
(1) ID3算法在選擇根節點和各內部節點中的分支屬性時,采用信息增益作為評價標准。信息增益的缺點是傾向於選擇取值較多的屬性,在有些情況下這類屬性可能不會提供太多有價值的信息.
(2) ID3算法只能對描述屬性為離散型屬性的數據集構造決策樹。
C4.5算法
做出的改進(為什么使用C4.5要好)
(1) 用信息增益率來選擇屬性
(2) 可以處理連續數值型屬性
(3)采用了一種后剪枝方法
(4)對於缺失值的處理
C4.5算法的優缺點
優點:
產生的分類規則易於理解,准確率較高。
缺點:
在構造樹的過程中,需要對數據集進行多次的順序掃描和排序,因而導致算法的低效。
此外,C4.5只適合於能夠駐留於內存的數據集,當訓練集大得無法在內存容納時程序無法運行。
CART算法
CART算法相比C4.5算法的分類方法,采用了簡化的二叉樹模型,同時特征選擇采用了近似的基尼系數來簡化計算。
C4.5不一定是二叉樹,但CART一定是二叉樹。
同時,無論是ID3, C4.5還是CART,在做特征選擇的時候都是選擇最優的一個特征來做分類決策,但是大多數,分類決策不應該是由某一個特征決定的,而是應該由一組特征決定的。這樣決策得到的決策樹更加准確。這個決策樹叫做多變量決策樹(multi-variate decision tree)。在選擇最優特征的時候,多變量決策樹不是選擇某一個最優特征,而是選擇最優的一個特征線性組合來做決策。這個算法的代表是OC1,這里不多介紹。
如果樣本發生一點點的改動,就會導致樹結構的劇烈改變。這個可以通過集成學習里面的隨機森林之類的方法解決。
三、cart剪枝
1.為什么剪枝
•橫軸表示在決策樹創建過程中樹的結點總數,縱軸表示決策樹的預測精度。
•實線顯示的是決策樹在訓練集上的精度,虛線顯示的則是在一個獨立的測試集上測量出來的精度。
•隨着樹的增長,在訓練樣集上的精度是單調上升的, 然而在獨立的測試樣例上測出的精度先上升后下降。
出現這種情況的原因:
•原因1:噪聲、樣本沖突,即錯誤的樣本數據。
•原因2:特征即屬性不能完全作為分類標准。
•原因3:巧合的規律性,數據量不夠大。
2.常用剪枝方法
預剪枝
(1)每一個結點所包含的最小樣本數目,例如10,則該結點總樣本數小於10時,則不再分;
(2)指定樹的高度或者深度,例如樹的最大深度為4;
(3)指定結點的熵小於某個值,不再划分。隨着樹的增長, 在訓練樣集上的精度是單調上升的, 然而在獨立的測試樣例上測出的精度先上升后下降。
后剪枝
后剪枝,在已生成過擬合決策樹上進行剪枝,可以得到簡化版的剪枝決策樹。
四、特征工程
1.特征提取
定義:
將任意數據(如文本或圖像)轉換為可用於機器學習的數字特征
【注】特征值化是為了計算機更好的去理解數據
特征提取分類:
- 字典特征提取(特征離散化)
- 文本特征提取
- 圖像特征提取(深度學習將介紹)
API:
sklearn.feature_extraction
2.字典特征提取
作用:對字典數據進行特征值化
- sklearn.feature_extraction.DictVectorizer(sparse=True,…)
- DictVectorizer.fit_transform(X)
- X:字典或者包含字典的迭代器返回值
- 返回sparse矩陣
- DictVectorizer.get_feature_names() 返回類別名稱
- DictVectorizer.fit_transform(X)
五、決策樹算法API
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None) criterion 特征選擇標准 "gini"或者"entropy",前者代表基尼系數,后者代表信息增益。一默認"gini",即CART算法。 min_samples_split 內部節點再划分所需最小樣本數 這個值限制了子樹繼續划分的條件,如果某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特征來進行划分。 默認是2.如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。我之前的一個項目例子,有大概10萬樣本,建立決策樹時,我選擇了min_samples_split=10。可以作為參考。 min_samples_leaf 葉子節點最少樣本數 這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小於樣本數,則會和兄弟節點一起被剪枝。 默認是1,可以輸入最少的樣本數的整數,或者最少樣本數占樣本總數的百分比。如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。之前的10萬樣本項目使用min_samples_leaf的值為5,僅供參考。 max_depth 決策樹最大深度 決策樹的最大深度,默認可以不輸入,如果不輸入的話,決策樹在建立子樹的時候不會限制子樹的深度。一般來說,數據少或者特征少的時候可以不管這個值。如果模型樣本量多,特征也多的情況下,推薦限制這個最大深度,具體的取值取決於數據的分布。常用的可以取值10-100之間 random_state 隨機數種子