1. 程式人生 > >機器學習教程之13-決策樹(decision tree)的sklearn實現

機器學習教程之13-決策樹(decision tree)的sklearn實現

0.概述

決策樹(decision tree)是一種基本的分類與迴歸方法。
主要優點:模型具有可讀性,分類速度快。
決策樹學習通常包括3個步驟:特徵選擇決策樹的生成決策樹的修剪

1.決策樹模型與學習

節點:根節點、子節點;內部節點(internal node)和葉節點(leaf node)。

決策樹學習本質上是從訓練資料集中歸納出一組分類規則

決策樹學習仍然需要將代價函式最小化

為了防止有過擬合現象,需要對決策圖進行修剪

決策圖的生成對應於模型的區域性選擇,決策樹的剪枝則考慮全域性最小選擇。

2.特徵選擇

特徵選擇在於選取對訓練資料具有分類能力的特徵。可以用一個例子說明:預測波斯頓的房價,把蓋房子所用磚頭的顏色作為特徵,顯示是沒有意義的!

特徵選擇的準則是資訊增益資訊增益比

特徵有多個,選擇哪個決策圖更科學呢?答案是:
如果一個特徵具有更好的分類能力,或者說,按照這一特徵將訓練資料集分割成子集,使得各個子集在當前條件下有最好的分類,那麼就更應該選擇這個特徵。資訊增益(information gain)就能夠很好地表示這一直觀的準則。

決策樹學習應用資訊增益準則選擇特徵。資訊增益大的特徵具有更強的分類能力。

特徵選擇的方法:對訓練資料集(或子集)D,計算其每個特徵的資訊增益,並比較它們的大小,選擇資訊增益最大的特徵。

資訊增益演算法
這裡寫圖片描述

例子
這裡寫圖片描述

3.決策圖的生成

決策樹學習的經典演算法:ID3、C4.5中的生成演算法。

通過例項理解ID3演算法:

這裡寫圖片描述

4.決策樹的剪枝

決策樹的減枝是為了解決過擬合現象,決策樹的剪枝往往通過極小化決策樹整體的代價函式來實現。

5.程式碼

"""
功能:迴歸決策樹
說明:人為設定函式模型為每隔5個點引入噪音的離散的sin(x),我們利用決策樹迴歸擬合這些資料
作者:唐天澤
部落格:http://blog.csdn.net/u010837794/article/details/76596063
日期:2017-08-03
"""

"""
匯入專案所需的包
"""
import numpy as np
from sklearn.tree import DecisionTreeRegressor
# 使用交叉驗證的方法,把資料集分為訓練集合測試集
from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt def creat_data(n): ''' 產生用於迴歸問題的資料集 :param n: 資料集容量 :return: 返回一個元組,元素依次為:訓練樣本集、測試樣本集、訓練樣本集對應的值、測試樣本集對應的值 ''' np.random.seed(0) X = 5 * np.random.rand(n, 1) y = np.sin(X).ravel() noise_num=(int)(n/5) y[::5] += 3 * (0.5 - np.random.rand(noise_num)) # 每第5個樣本,就在該樣本的值上新增噪音 X_train, X_test, y_train, y_test=train_test_split(X, y,test_size=0.25,random_state=1) return X_train, X_test, y_train, y_test # 拆分原始資料集為訓練集和測試集,其中測試集大小為元素資料集大小的 1/4 # 使用DecisionTreeRegressor考察線性迴歸決策樹的預測能力 def test_DecisionTreeRegressor(X_train, X_test, y_train, y_test): # 選擇模型 cls = DecisionTreeRegressor() # 把資料交給模型訓練 cls.fit(X_train, y_train) print("Training score:%f" % (cls.score(X_train, y_train))) print("Testing score:%f" % (cls.score(X_test, y_test))) """繪圖""" fig = plt.figure() ax = fig.add_subplot(1, 1, 1) X = np.arange(0.0, 5.0) fig = plt.figure() ax = fig.add_subplot(1, 1, 1) X = np.arange(0.0, 5.0, 0.01)[:, np.newaxis] # X為array([[ 0. ],[ 0.01],...,[4.99]] Y = cls.predict(X) # 離散點 ax.scatter(X_train, y_train, label="train sample", c='g') ax.scatter(X_test, y_test, label="test sample", c='r') # 連續點 ax.plot(X, Y, label="predict_value", linewidth=2, alpha=0.5) ax.set_xlabel("data") ax.set_ylabel("target") ax.set_title("Decision Tree Regression") ax.legend(framealpha=0.5) plt.show() if __name__=='__main__': X_train,X_test,y_train,y_test=creat_data(100) # 產生用於迴歸問題的資料集 test_DecisionTreeRegressor(X_train,X_test,y_train,y_test) # 呼叫 test_DecisionTreeRegressor

這裡寫圖片描述

這裡寫圖片描述

6.參考資料

[1] 李航 《統計學習方法》
[2] 華校專《Python大戰機器學習》