初識機器學習之決策樹對鳶尾花進行分類

2021-08-01 06:43:39 字數 3784 閱讀 2517

今天想簡單聊一下對機器學習中決策樹分類的認識,並實現了乙個用決策樹對經典鳶尾花資料集分類的應用。在我看來,決策樹中最重要的乙個概念就是資訊熵。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...