機器學習1 --- 決策樹

1.基本思想

1.1 基本思想

建立分段函數進行迴歸和分類,自動學一個if-else-then的模型.對於連續數據,學習機或者模型的函數集合來自於平行於座標軸的直線,對於離散數據,學習機就是單獨的特徵,選擇單獨的特徵作爲節點,由離散值的種類確定分支數。
西瓜書根據西瓜的一些特徵來判斷西瓜的好壞,而一次我們只用一個特徵,或者只看一個維度,那麼根據數據集,我們可以根據一些指標(這個指標指導每次如何選擇特徵,如信息增益等)使得我們可以更快更準的判斷出一個西瓜是不是好瓜(做決策),這個推斷過程類似一個樹性結構,於是算法起名決策樹。我們根據如下數據集
在這裏插入圖片描述
參考深入淺出理解決策樹算法(一)-核心思想
西瓜書
得到的樹形結構爲:
在這裏插入圖片描述
決策樹模型核心是下面幾部分:

  • 結點和對應的分支
  • 結點有內部結點和葉結點,內部結點表示一個特徵,葉節點表示一個類

2.預測機理

機器學習不用於統計學在於,機器學習重在預測,統計學重在研究變量關係,但是二者由很多相似之處。

如果樹建立起來了,假如我現在告訴你,我買了一個西瓜,它的特點是紋理是清晰,根蒂是硬挺的瓜,你來給我判斷一下是好瓜還是壞瓜,恰好,你構建了一顆決策樹,告訴他,沒問題,我馬上告訴你是好瓜,還是壞瓜?

判斷步驟如下:

根據紋理特徵,已知是清晰,那麼走下面這條路,紅色標記:

在這裏插入圖片描述好的,現在到了第二層了,這個時候,我們需要知道根蒂的特徵是什麼?很好,輸入的西瓜根蒂是硬挺,於是,我們繼續走,如下面藍色所示:
在這裏插入圖片描述
此時,我們到達葉子結點了,根據上面總結的點,可知,葉子結點代表一種類別,我們從如上決策樹中,可以知道,這是一個壞瓜!

寫成數學公式就是 f^\hat f(x) = m=19cmδ(x)\sum\limits_{m=1}^9 c_m \delta(\bm x), 9個葉子節點所以爲m從0到9,9種決策,但是9決策不一定代表西瓜的種類有九種。
每一個從根節點到葉子結點路徑上特徵及其取值的集合x對應的δ(x)\delta(x)函數取值爲1,比如本題,δ(x====)=1\delta(x=紋理清晰,根蒂 =硬挺,觸感=*,色澤 =* ) = 1,其餘的δ(x)\delta(x)取值爲0.

3.劃分選擇

ID3、C4.5、CART三種決策樹的區別

ID3

假設樣本集合D中第k類樣本所佔的比重爲pkp_k,那麼信息熵的計算則爲下面的計算方式

Ent(D)=k=1ypklog2pkEnt(D) = - \sum\limits_{k=1}^{|y|}p_klog_2p_k
當這個Ent(D)的值越小,說明樣本集合D的純度就越高
有了信息熵,當我選擇用樣本的某一個屬性a來劃分樣本集合D時,就可以得出用屬性a對樣本D進行劃分所帶來的“信息增益”Gain(D,a)=Ent(D)v=1VDvDEnt(Dv) Gain(D,a) = Ent(D) - \sum\limits_{v=1}^{|V|}\frac{D^v}{D}Ent(D^v)
V是屬性的可能取值。y=pklog2pky= -p_klog_2p_k的函數曲線圖如圖所示,分類越多,p越小,y的值越小,許多很小的加權求和起來也不大,使得Gain(D,a) 很大。
在這裏插入圖片描述

from matplotlib import pyplot as plt
import  numpy as np
p= np.linspace(0.01, 1.0001, 5000)
Ent =  -p*np.log2(p)
plt.plot(p,Ent)
plt.title("-p*log2(p) curve graph")
plt.xlabel("p")
plt.ylabel("-p*log2(p)")
plt.show()

ID3以信息增益作爲結點的劃分依據,容易偏向與選擇分支數比較多的特徵或者說屬性,極端情況就是選擇數據集中的編號更容易最大信息增益。

c4.5

C4.5使用信息增益率,信息增益除以固有值(intrinsic value)
Gain_ratio(D,a)=Gain(D,a)IV(a)Gain\_ratio (D,a) = \frac{Gain(D,a)}{IV(a)}
IV(a)=v=1VDvDlog2(DvD)IV(a) = - \sum\limits_{v=1}^{V}\frac{D^v}{D}log_2(\frac{D^v}{D})
但是同樣的c4.5的增益率對可取值數目較少的屬性有所偏好,因此C4.5決策樹先從候選劃分屬性中找出信息增益高於平均水平的屬性,在從中選擇增益率最高的。

CART決策樹

對於分類問題

CART決策樹使用“基尼指數”(Gini index)來選擇劃分屬性,基尼指數反映的是從樣本集D中隨機抽取兩個樣本,其類別標記不一致的概率,因此Gini(D)越小越好,基尼指數定義如下:
Gini(D)=k=1ykkpkpk=k=1ypk(1pk)=1k=1ypk2 Gini(D) = \sum\limits_{k=1}^{|y|}\sum\limits_{k' \neq k} p_kp_k' = \sum\limits_{k=1}^{|y|}p_k(1-p_k) =1- \sum\limits_{k=1}^{|y|}p^2_k
進而,使用屬性α劃分後的基尼指數爲:
Giniindex(D,a)=v=1VDvDGini(Dv)Gini_index (D,a) = \sum\limits_{v=1}^{V} \frac{D^v}{D}Gini(D^v)

對於迴歸問題

最小二乘誤差minf^i=1m(f^(xi)yi)2\min\limits_{\hat f}\sum\limits_{i=1}^m(\hat f(x_i)-y_i)^2
其中f^(x)\hat f(x)是決策樹的閉式表達式,y是真值,least square error其實事先假定了數據點服從高斯分佈。

4. 基本流程

根據loss function選擇特徵、生成決策樹、對決策樹進行修剪。

特徵選擇

特徵選擇決定了使用哪些特徵來做判斷。在訓練數據集中,每個樣本的屬性可能有很多個,不同屬性的作用有大有小。因而特徵選擇的作用就是篩選出跟分類結果相關性較高的特徵,也就是分類能力較強的特徵。
在特徵選擇中通常使用的準則是:信息增益。

決策樹生成

選擇好特徵後,就從根節點觸發,對節點計算所有特徵的信息增益,選擇信息增益最大的特徵作爲節點特徵,根據該特徵的不同取值建立子節點;對每個子節點使用相同的方式生成新的子節點,直到信息增益很小或者沒有特徵可以選擇爲止。

決策樹剪枝

剪枝的主要目的是對抗「過擬合」,通過主動去掉部分分支來降低過擬合的風險。
也分預剪枝和後剪枝

4. 分類與迴歸例子

分類

以鳶尾花數據集合爲例,數據集合有150個數據,特徵包含花瓣長度,寬度,花萼長度,寬度總共四個數據,類別爲’setosa’, ‘versicolor’, 'virginica’三種。爲了可視化我們選取兩個屬性。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier,plot_tree


# 使用自帶的iris數據,爲了方便可視化,我們能使用前兩維度
iris = datasets.load_iris()
X = iris.data[:, [0, 2]]
y = iris.target

# 限制樹的最大深度4
clf = DecisionTreeClassifier(max_depth=4)
#擬合模型
clf.fit(X, y)
# 決策樹
plt.figure()
plot_tree(clf, filled=True)
plt.show()
plt.figure()

# 畫圖
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                     np.arange(y_min, y_max, 0.1))

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z,cmap=plt.cm.RdYlBu)
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.show()

結果
在這裏插入圖片描述
可以看到對於連續值,建立的樹爲二叉樹,因爲根據特徵值是都大於某個數將數據集合一分爲2,爲了限制過擬合,我們設計了最大深度,也可以利用剪枝等操作防止過擬合。
在這裏插入圖片描述
決策樹得到的分類面如圖所示,用平行於座標軸的直線,組合出分界面。

  • 易於理解和解釋,甚至比線性迴歸更直觀;
  • 與人類做決策思考的思維習慣契合;
  • 模型可以通過樹的形式進行可視化展示;

迴歸

我們根據y=ax+b隨機產生80個點,加一點噪聲,使用MSE,限制最大深度,得到的決策樹爲:

print(__doc__)

# Import the necessary modules and libraries
import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

# Create a random dataset
rng = np.random.RandomState(1)
X = np.sort(5 * rng.rand(80, 1), axis=0)
a = 5
b = 2
y = (a*X+b).ravel()
y[::5] += 3 * (0.9 - rng.rand(16))

# Fit regression model
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)

# Predict
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)

# Plot the results
plt.figure()
plt.scatter(X, y, s=20, edgecolor="black",
            c="darkorange", label="data")
plt.plot(X_test, y_1, color="cornflowerblue",
         label="max_depth=2", linewidth=2)
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()

結果
在這裏插入圖片描述
對於二次函數的擬合
在這裏插入圖片描述
將第二個數據點進行改動
在這裏插入圖片描述
因爲決策樹的分類面是個直線,因此它也是用常數函數去擬合二次函數,得到的效果自然不是很好。在特定維度函數非線性的程度很大的話,很難用決策樹去擬合。

5. 過擬合與正則化

奧卡姆剃刀原理:越簡單越好。
no free lunch 定理:所有算法的期望性能相同,
避免Regression Tree的過擬合策略

  • 檢測目標函數值下降小於一定閾值時終止
  • 當樹達到一定預設高度上界時終止
  • 當每個區域包含點個數少於某個預設閾值
    時終止
  • 控制深度
  • 剪枝
  • 控制策略嵌入優化模型:正則化
  • 構造驗證集
    在驗證集效果提升的前提下生長樹
    再生成過擬合完全數後,在驗證集效果
    提升的前提下切割樹

正則化

控制策略嵌入優化模型:正則化
minf^i=1n(f^(xi)yi)+αf^\min\limits_{\hat f}\sum\limits_{i=1}^n (\hat f(x_i)-y_i) + \alpha|\hat f|
在樹生長時,前一項(原目標函數)不斷減小,後一項(正則項)不斷增加, 也就是模型複雜度在增加。

6. 缺失值處理

缺失值處理和多變量決策具體參見西瓜書。
(1)如何選擇劃分屬性。(2)給定劃分屬性,若某樣本在該屬性上缺失值,如何劃分到具體的分支上

  • 對於(1):通過在樣本集D中選取在屬性α上沒有缺失值的樣本子集,計算在該樣本子集上的信息增益,最終的信息增益等於該樣本子集劃分後信息增益乘以樣本子集佔樣本集的比重。即:
  • 對於(2):若該樣本子集在屬性α上的值缺失,則將該樣本以不同的權重(即每個分支所含樣本比例)劃入到所有分支節點中。

7. 多變量決策

學習機不再是平行於座標軸的線,而是有多個屬性進行線性組合.

8. Question and answer

Ⅰ 什麼是機器學習?

“A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E”
機器學習三要素

  • 使用先驗知識和經驗數據 (Experience)
  • 針對某個目標 (Task)
  • 提高學習性能 (Performance)

從三方面理解機器學習
要學什麼 -> 決策函數
從哪裏學 -> 訓練數據+定理
怎樣學習 -> 求解機器學習模型,得到mapping

不同角度理解機器學習

在這裏插入圖片描述

Ⅱ 機器學習的根本要求

機器學習的根本要求是做預測和防止過擬合, 預測分類,預測連續的一個數值等。但在訓練模型的過程中要防止過擬合

Ⅲ 模型驅動與數據驅動的區別

  • 模型驅動可以理解爲知識驅動,結合數據和一些定理,規則進行學習,求解模型,模型的可解釋性好。
  • 數據驅動, 假設所有信息都可以來源於數據,大數據時代,數據量遠遠大於模型參數量,我們可以只利用數據建立預測模型神行預測,指深度學習。
    在之前的文章A Neural Model for Generating Natural Language Summaries of Program Subroutines中,
    在這裏插入圖片描述
    數據集:2.1 million
    參數數量:159million
    這個問題可能會導致模型是欠擬合,在試驗中。

Ⅳ決策樹的思想

  • 數學理解是建立分段函數,程序理解是通過數據,在一定規則下,得到if- else- then的樹形判別結構。
  • 雖然和if-else沒區別,但是if what then what是從數據中基於規則學出來的,而不再需要對於某個問題去自己設計。
  • 決策樹的好壞一方面取決於數據,另一方面取決於設計的特徵。

Ⅴ 決策樹的優缺點

優點

  • 易於理解和解釋,甚至比線性迴歸更直觀;
  • 與人類做決策思考的思維習慣契合,有時候不需要獲得全部信息就可以獲得決策結果;
  • 模型可以通過樹的形式進行可視化展示;
  • 可以直接處理非數值型數據

缺點

  • 模型不夠穩健,因爲它使用橫豎線找分類面或者擬合數據,而且充分考慮到了每一個數據,一個點的變化導致樹的結構發生變化。
  • 數值型變量之間存在許多錯綜複雜的關係,互相不解耦合的話,很難用直線來分
  • 隨着數據量的增大,樹會建立的很大,很深。

參考文獻
決策樹 – Decision tree
深入淺出理解決策樹算法(一)-核心思想
Vay-keen/Machine-learning-learning-notes
sklearn
決策樹算法的Python實現
一文讀懂統計學與機器學習的本質區別(附案例)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章