提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
前言
ChatGPT一問世就給整個社會帶來巨大的震撼和沖擊,不禁讓人驚嘆現(xiàn)在AI的強(qiáng)大,我們好像離通用人工智能更近一步。在過去十幾年人工智能領(lǐng)域的蓬勃發(fā)展中,扮演著主導(dǎo)地位的算法基本都是神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí),很多機(jī)器學(xué)習(xí)算法黯然失色。神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)雖然強(qiáng)大,但這個"黑盒"里面到底是個什么東西我們很難解釋,就像人腦一樣,神經(jīng)元之間的相互作用是非常復(fù)雜微妙的。那機(jī)器學(xué)習(xí)中有沒有一種比較強(qiáng)大的模型但是又可以很好解釋的呢?有,那就是集成學(xué)習(xí)算法隨機(jī)森林,而隨機(jī)森林的每個分類器個體就是我們今天的主角- -決策樹。
一、決策樹算法簡介
決策樹算法是一種常用的有監(jiān)督學(xué)習(xí)的機(jī)器學(xué)習(xí)算法,是一種以樹結(jié)構(gòu)(包括二叉樹和多叉樹)形式來表達(dá)的預(yù)測分析模型。樹是一種特殊的數(shù)據(jù)結(jié)構(gòu),是一種有向無環(huán)圖,即樹是有方向但沒有形成閉環(huán)回路的圖形,主要作用是分類和遍歷。決策樹利用分類的思想,根據(jù)數(shù)據(jù)的特征構(gòu)建數(shù)學(xué)模型,從而達(dá)到數(shù)據(jù)的篩選,并完成決策的目標(biāo)。決策樹中每個節(jié)點(diǎn)表示某個特征對象,而每個分叉路徑則代表某個可能的分類方法,而每個葉節(jié)點(diǎn)則對應(yīng)從根節(jié)點(diǎn)到該葉節(jié)點(diǎn)所經(jīng)歷的路徑所表示的對象的值。
二、決策樹的數(shù)學(xué)原理
決策樹算法是以分類為目的的模型,這種分類旨在降低每個類里面樣本標(biāo)簽的熵值,即讓該類中的樣本數(shù)據(jù)的標(biāo)簽更加一致,經(jīng)過轉(zhuǎn)化我們也可以將決策樹算法應(yīng)用于解決回歸預(yù)測的問題中
1. 熵的度量
熵是表示隨機(jī)變量不確定性的度量,事物的熵越大表示事物的混亂程度越大,事物的熵越小表示事物的混亂程度越小,在物理世界中熵總是朝著增大的方向進(jìn)行。決策樹中我們借助熵來衡量分類后葉子節(jié)點(diǎn)的樣本標(biāo)簽的混亂程度,我們希望分支節(jié)點(diǎn)的熵值越低越好,
這樣才能在后續(xù)葉子節(jié)點(diǎn)的決策中達(dá)到不錯的效果
在決策樹的分支節(jié)點(diǎn)中,我們依據(jù)古典概型,即用隨機(jī)變量所占的比例來衡量它發(fā)生的概率,將概率值轉(zhuǎn)化為信息熵,
H
(
X
)
H(X)
H(X) 表示信息熵值
H
(
X
)
=
?
∑
i
=
1
n
p
i
l
o
g
(
p
i
)
H(X) = -\sum_{i=1}^np_{i}log(p_{i})
H(X)=?i=1∑n?pi?log(pi?)
除了經(jīng)典的信息熵應(yīng)用,我們有時也會涉及到條件熵的概念。條件熵和信息熵的關(guān)系就好像條件概率和概率的關(guān)系,條件熵強(qiáng)調(diào)了對一定條件下事物的不確定性度量,
H
(
Y
∣
X
)
H(Y | X)
H(Y∣X) 表示條件熵
H
(
Y
∣
X
)
=
∑
i
=
1
n
p
i
H
(
Y
∣
X
=
x
i
)
H(Y | X) = \sum_{i=1}^np_{i}H(Y | X=x_{i})
H(Y∣X)=i=1∑n?pi?H(Y∣X=xi?)
H
(
Y
∣
X
=
x
i
)
=
∑
j
=
1
n
p
(
y
j
∣
x
=
x
i
)
l
o
g
(
p
(
y
j
∣
x
=
x
i
)
)
H(Y | X=x_{i}) = \sum_{j=1}^n p(y_{j} | x=x_{i}) log(p(y_{j} | x=x_{i}))
H(Y∣X=xi?)=j=1∑n?p(yj?∣x=xi?)log(p(yj?∣x=xi?))
一般我們在計算 H ( Y ∣ X = x i ) H(Y | X=x_{i}) H(Y∣X=xi?) 時我們通過縮小樣本空間,用古典概型來計算。當(dāng)熵和條件熵中的概率由數(shù)據(jù)估計(特別是極大似然估計)得到時,所對應(yīng)的熵與條件熵分別稱為經(jīng)驗(yàn)熵(empirical entropy)和經(jīng)驗(yàn)條件熵(empirical conditional entropy)。
根據(jù)熵值的函數(shù) p i l o g p i p_{i}logp_{i} pi?logpi?的圖像,當(dāng)隨機(jī)變量的概率值趨近于1或者0時,即該集合中基本上都是這個變量或者基本上不存在這個變量,那表示該集合不確定性很低,此時函數(shù)值趨近0,熵值趨近0,集合內(nèi)的標(biāo)簽很有序;當(dāng)隨機(jī)變量的概率值分布在0到1中間時,即該集合中有這個變量并且還有其他變量,那表示該集合不確定性很高,此時熵值較大,集合內(nèi)的標(biāo)簽混亂無序
2. 信息增益
決策樹模型中常見的三種算法有:ID3、C4.5、CART。ID3算法是以信息增益為標(biāo)準(zhǔn)來度量在不同的節(jié)點(diǎn)特征選擇下哪種方案是最優(yōu)的,即用循環(huán)的方式選擇出信息增益最大的節(jié)點(diǎn)特征然后這樣遞歸下去形成決策樹,用特征
a
a
a 對樣本集
D
D
D 進(jìn)行劃分所獲得的“信息增益”可以表達(dá)為:
I
n
f
o
G
a
i
n
(
D
∣
a
)
=
H
(
D
)
?
H
(
D
∣
a
)
InfoGain(D|a) = H(D) - H(D | a)
InfoGain(D∣a)=H(D)?H(D∣a)
然后我們選擇信息增益最大的特征節(jié)點(diǎn),然后遞歸去遍歷下一個節(jié)點(diǎn)。簡單來說,我們用信息增益方法來達(dá)到節(jié)點(diǎn)標(biāo)簽更加有序的效果,增強(qiáng)葉子節(jié)點(diǎn)的確定性,就像購物網(wǎng)站對商品進(jìn)行分類,先分?jǐn)?shù)碼區(qū)用品,生活用品等,再按品牌或者價格進(jìn)行分類
C4.5算法是用信息增益率來作為標(biāo)準(zhǔn),比ID3算法多考慮了自身熵值存在的影響,假如決策樹分的類別越多,分到每一個子結(jié)點(diǎn),子結(jié)點(diǎn)的純度也就越可能大,因?yàn)閿?shù)量少了嘛,可能在一個類的可能性就最大,甚至可以一個葉子節(jié)點(diǎn)就一個標(biāo)簽值,但這樣會使決策樹模型過擬合,所以我們引入自身屬性的考量降低過擬合風(fēng)險
G
a
i
n
R
a
t
i
o
(
D
∣
a
)
=
?
I
n
f
o
G
a
i
n
(
D
∣
a
)
H
(
D
∣
a
)
GainRatio(D|a) = -\frac{InfoGain(D|a)}{H(D | a)}
GainRatio(D∣a)=?H(D∣a)InfoGain(D∣a)?
CART算法中節(jié)點(diǎn)標(biāo)簽的純度可用基尼值來度量,基尼系數(shù)反映了從數(shù)據(jù)集D中隨機(jī)抽取兩個樣本,其類別標(biāo)記不一致的概率。因此,基尼系數(shù)越小,則節(jié)點(diǎn)的純度越高
G
i
n
i
(
p
)
=
∑
k
=
1
n
p
k
(
1
?
p
k
)
Gini(p) = \sum_{k=1}^np_{k}(1-p_{k})
Gini(p)=k=1∑n?pk?(1?pk?)
3. 剪枝策略
剪枝策略旨在降低決策樹過擬合的風(fēng)險,限制決策邊界過于復(fù)雜,說白了就是你家花園里的樹木枝葉太多過于龐大,這時你就需要給這些枝葉修剪一下,使這棵樹看起來更加精神,更有活力
決策樹的剪枝策略分為預(yù)剪枝和后剪枝,預(yù)剪枝比較簡單,就是在決策樹生成前限制樹的深度和葉子節(jié)點(diǎn)的個數(shù),避免出現(xiàn)一個葉子節(jié)點(diǎn)一個標(biāo)簽值的情況出現(xiàn),相當(dāng)于你家的樹一邊生長你一邊修理枝葉
決策樹的后剪枝是在決策樹生成后再對樹模型進(jìn)行剪枝,代價復(fù)雜度剪枝-CCP用 C ( T ) C(T) C(T) 作為損失函數(shù)衡量決策樹的效果,其中 T T T 是葉子節(jié)點(diǎn)數(shù)。這里面涉及到一個重要參數(shù) α \alpha α, α \alpha α 是自己給定的, α \alpha α 越大則表示你越不希望樹模型過擬合, α \alpha α 越小則表示你越希望決策樹的分類效果好,即葉子節(jié)點(diǎn)的純度越高
三、Python實(shí)現(xiàn)決策樹算法
1. CART決策樹
Python實(shí)現(xiàn)決策樹算法的思路也和前面一樣,先導(dǎo)入常用的包和鳶尾花數(shù)據(jù)集,接著選擇鳶尾花數(shù)據(jù)的幾個特征和標(biāo)簽并將決策樹實(shí)例化,訓(xùn)練決策樹,然后用graphviz工具展示決策樹,并用matplotlib繪制棋盤和決策邊界,最后展示一下
import numpy as np
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
from IPython.display import Image
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
iris = load_iris()
x = iris.data[:, 2:]
y = iris.target
tree_clf = DecisionTreeClassifier(max_depth=2)
tree_clf.fit(x, y)
def plot_decision_boundary(clf, x, y, axes=[0, 7.5, 0, 3]):
x1a = np.linspace(axes[0], axes[1], 100)
x2a = np.linspace(axes[2], axes[3], 100)
x1, x2 = np.meshgrid(x1a, x2a)
x_new = np.c_[x1.ravel(), x2.ravel()]
y_pred = clf.predict(x_new).reshape(x1.shape)
custom_cmap = ListedColormap(['#fafab0', '#9898ff', '#507d50'])
plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)
plt.plot(x[:, 0][y == 0], x[:, 1][y == 0], "yo", label="Iris-Setosa")
plt.plot(x[:, 0][y == 1], x[:, 1][y == 1], "bs", label="Iris-Versicolor")
plt.plot(x[:, 0][y == 2], x[:, 1][y == 2], "g^", label="Iris-Virginica")
plt.axis(axes)
plt.xlabel("Petal length", fontsize=12)
plt.ylabel("Petal width", fontsize=12)
export_graphviz(tree_clf, out_file="iris_tree.dot", feature_names=iris.feature_names[2:], class_names=iris.target_names, rounded=True, filled=True )
plt.figure(figsize=(12, 8))
plot_decision_boundary(tree_clf, x, y)
plt.plot([2.45, 2.45], [0, 3], "k-", linewidth=2)
plt.plot([2.45, 7.5], [1.75, 1.75], "k--", linewidth=2)
plt.plot([4.95, 4.95], [0, 1.75], "k:", linewidth=2)
plt.plot([4.85, 4.85], [1.75, 3], "k:", linewidth=2)
plt.text(1.4, 1.0, "Depth=0", fontsize=15)
plt.text(3.2, 1.8, "Depth=1", fontsize=13)
plt.text(4.05, 0.5, "Depth=2", fontsize=11)
plt.title('Decision Tree')
plt.show()
可以看到?jīng)Q策樹通過
G
i
n
i
Gini
Gini 系數(shù)作為判定節(jié)點(diǎn)分類的效果的標(biāo)準(zhǔn),先以花瓣寬度0.8作為邊界將第一類花完全分開,接著以花瓣寬度1.75作為花瓣的寬度基本將剩下兩種花分開
2. 決策樹剪枝對比
Python實(shí)現(xiàn)決策樹剪枝對比的思路也和前面一樣,先導(dǎo)入常用的包和月亮數(shù)據(jù)集,指定月亮數(shù)據(jù)集的樣本數(shù)和噪音率,接著將決策樹實(shí)例化并訓(xùn)練決策樹,然后用用matplotlib繪制棋盤和決策邊界,最后用兩幅子圖展示一下兩種不同的效果
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.tree import DecisionTreeClassifier
from matplotlib.colors import ListedColormap
x, y = make_moons(n_samples=200, noise=0.3, random_state=50)
tree_clf1 = DecisionTreeClassifier(random_state=50)
tree_clf2 = DecisionTreeClassifier(min_samples_leaf=9, random_state=50)
tree_clf1.fit(x, y)
tree_clf2.fit(x, y)
def plot_decision_boundary(clf, x, y, axes=[0, 7.5, 0, 3]):
x1a = np.linspace(axes[0], axes[1], 100)
x2a = np.linspace(axes[2], axes[3], 100)
x1, x2 = np.meshgrid(x1a, x2a)
x_new = np.c_[x1.ravel(), x2.ravel()]
y_pred = clf.predict(x_new).reshape(x1.shape)
custom_cmap = ListedColormap(['#fafab0', '#9898ff', '#507d50'])
plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)
plt.plot(x[:, 0][y == 0], x[:, 1][y == 0], "yo", label="Iris-Setosa")
plt.plot(x[:, 0][y == 1], x[:, 1][y == 1], "bs", label="Iris-Versicolor")
plt.plot(x[:, 0][y == 2], x[:, 1][y == 2], "g^", label="Iris-Virginica")
plt.axis(axes)
plt.xlabel("Petal length", fontsize=12)
plt.ylabel("Petal width", fontsize=12)
plt.figure(figsize=(12, 8))
plt.subplot(121)
plot_decision_boundary(tree_clf1, x, y, axes=[-1.5, 2.5, -1, 1.5])
plt.title("No restrction")
plt.subplot(122)
plot_decision_boundary(tree_clf2, x, y, axes=[-1.5, 2.5, -1, 1.5])
plt.title("min_slamples=9")
plt.show()
我們可以看到?jīng)]有經(jīng)過剪枝的決策邊界顯得十分復(fù)雜,過擬合風(fēng)險極高;而經(jīng)過剪枝和規(guī)定最小葉子節(jié)點(diǎn)樣本數(shù)的決策邊界相對簡單,過擬合風(fēng)險較低,而且在處理噪音點(diǎn)這方面表現(xiàn)不錯文章來源:http://www.zghlxwxcb.cn/news/detail-403612.html
總結(jié)
以上就是機(jī)器學(xué)習(xí)中決策樹算法的學(xué)習(xí)筆記,本篇筆記簡單地介紹了決策樹的數(shù)學(xué)原理和程序思路。決策樹算是機(jī)器學(xué)習(xí)中非常容易解釋的一種模型,下次筆記里的機(jī)器學(xué)習(xí)集成算法隨機(jī)森林也是對決策樹的一種拓展和延伸,集成算法在深度學(xué)習(xí)得到廣泛吹捧的今天仍然有一席之地,離不開決策樹強(qiáng)大的可解釋性和泛化能力。文章來源地址http://www.zghlxwxcb.cn/news/detail-403612.html
到了這里,關(guān)于Python 機(jī)器學(xué)習(xí)入門 - - 決策樹算法學(xué)習(xí)筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!