今天想簡單聊一下對機器學習中決策樹分類的認識,並實現了乙個用決策樹對經典鳶尾花資料集分類的應用。在我看來,決策樹中最重要的乙個概念就是資訊熵。x的資訊熵用h(x)表示,也就是x所含的資訊量大小。
h(x)=p(x)logp(x)
h(x,y)=p(x,y)logp(x,y)
在決策樹分類的建樹過程中,由根節點到葉子節點,熵的值應該越來越小,一直到0(對分類結果越來越確定)。基本思想是:以資訊熵為度量構造一棵熵值下降最快的樹,到葉子結點熵值為0。
決策樹的選擇特徵屬性的方式也有很多種,例如id3,c4.5,cart等等。以id3為例,這種方式在每一步時選擇資訊增益最大的屬性做下一步的判別屬性。
資訊增益gain(x,f)=h(x)-h(x|f)=i(x|f)
而c4.5依靠資訊增益率gr(x,f)=gain(x,f)/h(f);cart依靠gini係數。在下面的應用中,我們選擇id3對屬性進行選擇。
鳶尾花資料集是最有名的模式識別測試資料。共包括三個鳶尾花種類,每個類別有五十個樣本,四個特徵分別為花萼長度,花萼寬度,花瓣長度,花瓣寬度。
**使用python實現,隨機在四個特徵中選擇兩個進行分類,共六種組合。訓練集佔0.7,測試集佔0.3。
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.tree import decisiontreeclassifier
# 'sepal length', 'sepal width', 'petal length', 'petal width'
iris_feature = u'花萼長度', u'花萼寬度', u'花瓣長度', u'花瓣寬度'
if __name__ == "__main__":
mpl.rcparams['font.sans-serif'] = [u'simhei'] # 黑體 fangsong/kaiti
mpl.rcparams['axes.unicode_minus'] = false
path = 'd:\iris.data'
# 資料檔案路徑
data = pd.read_csv(path, header=none)
x_prime = data[range(4)]
y = pd.categorical(data[4]).codes
feature_pairs = [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]
plt.figure(figsize=(10, 9), facecolor='#ffffff')
for i, pair in enumerate(feature_pairs):
# 準備資料
x = x_prime[pair]
x_train, x_testt, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=1)
# 決策樹學習
clf = decisiontreeclassifier(criterion='entropy', min_samples_leaf=3)
clf.fit(x_train, y_train)
# 畫圖
# 橫縱各取樣多少個值
n, m = 500, 500
x1_min, x2_min = x.min()
x1_max, x2_max = x.max()
t1 = np.linspace(x1_min, x1_max, n)
t2 = np.linspace(x2_min, x2_max, m)
x1, x2 = np.meshgrid(t1, t2) # 生成網格取樣點
x_test = np.stack((x1.flat, x2.flat), axis=1) # 測試點
# 訓練集上的**結果
y_test_hat = clf.predict(x_testt)
y_train_hat = clf.predict(x_train)
#print y_test_hat,y_test
#y = y.reshape(-1)
c = np.count_nonzero(y_test_hat == y_test) # 統計**正確的個數
d = np.count_nonzero(y_train_hat==y_train)
#print 'c=',c
print
'\n特徵: ', iris_feature[pair[0]], ' + ', iris_feature[pair[1]],
print
'\n測試集**正確數目:', c,'\n訓練集**正確數目:',d,
#print '\nacc:',accuracy_score(y_test,y_test_hat)
print
'\n測試集準確率: %.2f%%' % (100 * float(c) / float(len(y_test)))
print
'訓練集準確率: %.2f%%' % (100 * float(d) / float(len(y_train)))
# 顯示
cm_light = mpl.colors.listedcolormap(['#a0ffa0', '#ffa0a0', '#a0a0ff'])
cm_dark = mpl.colors.listedcolormap(['g', 'r', 'b'])
y_hat = clf.predict(x_test) # **值
#y_test_hat = clf.predict(x_testt)
y_hat = y_hat.reshape(x1.shape) # 使之與輸入的形狀相同
plt.subplot(2, 3, i+1)
plt.pcolormesh(x1, x2, y_hat, cmap=cm_light) # **值,畫背景顏色
plt.scatter(x[pair[0]], x[pair[1]], c=y, edgecolors='k', cmap=cm_dark) # 樣本
plt.xlabel(iris_feature[pair[0]], fontsize=14)
plt.ylabel(iris_feature[pair[1]], fontsize=14)
plt.xlim(x1_min, x1_max)
plt.ylim(x2_min, x2_max)
plt.grid()
plt.suptitle(u'決策樹對鳶尾花資料的兩特徵組合的分類結果', fontsize=18)
plt.tight_layout(2)
plt.subplots_adjust(top=0.92)
plt.show()
最終結果如下圖
最終可以看出,通過花瓣長度和花瓣寬度可以得到最佳分類結果。
決策樹完成鳶尾花分類
實驗樓專案 決策樹是一種特殊的樹形結構,一般由節點和有向邊組成。其中,節點表示特徵 屬性或者乙個類。而有向邊包含有判斷條件。決策樹學習 decision tree learning 亦簡稱為決策樹。決策樹可以用來解決分類或回歸問題,分別稱之為分類樹或回歸樹。其中,分類樹的輸出是乙個標量,而回歸樹的一...
決策樹之鳶尾花卉例項解析
決策樹之鳶尾花卉例項解析 1 介紹 以sklearn 資料集中的鳶尾花卉 iris 資料集為例,解析決策樹。鳶尾花卉 iris 資料集中有 150個樣本 示例 4個特徵 屬性 1個標籤 類別變數 以此 150個樣本為訓練樣本得到相應的決策樹。首先,明確一下資料集中的內容。通過以下 可以檢視 解說 f...
python決策樹 sklearn鳶尾花資料集分類
def decision iris 用決策樹進行鳶尾花分類 匯入資料 iris load iris 劃分資料 x train,x test,y train,y test train test split iris.data,iris.target,random state 6 決策樹預估器 esti...