機器學習(二)決策樹的比較以房屋價格預測為例
阿新 • • 發佈:2020-12-22
實驗內容
使用普通的決策樹迴歸器和帶AdaBoost演算法的決策樹迴歸器預測房屋價格,評價兩種迴歸器的訓練效果
實驗步驟
(1) 建立一個新的Python檔案housing.py,然後加入下面的程式碼
import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn import datasets
from sklearn.metrics import mean_squared_error,explained_variance_score
from sklearn.utils import shuffle
import matplotlib.pyplot as plt
(2) 使用scikit-learn上資料介面載入網上的標準房屋價格資料庫
housing_data = datasets.load_boston()# 載入資料
(3) 接下來把輸入資料與輸出結果分成不同的變數。我們可以通過shuffle函式把資料的順 序打亂:
X, y = shuffle(housing_data.data, housing_data.target, random_state=7)# random_state 控制如何打亂資料
(4) 接下來把資料 分成訓練資料集和測試資料集,其中80%的資料用於訓練,剩餘20%的資料用於測試:
num_training = int(0.8*len(X))
X_train, y_train = X[:num_training], y[:num_training]
X_test, y_test = X[num_training:], y[num_training:]
(5) 現在已經可以擬合一個決策樹迴歸模型了。選一個最大深度為4的決策樹,這樣可以限制 決策樹不變成任意深度:
dt_regressor = DecisionTreeRegressor( max_depth=4)
dt_regressor.fit(X_train, y_train)
(6) 再用帶AdaBoost演算法的決策樹迴歸模型進行擬合
ab_regressor = AdaBoostRegressor(DecisionTreeRegressor(max_depth=4),
n_estimators=400, random_state=7)
# 第一個引數是基分類器,n_estimators 基分類器迴圈次數,random_state隨機種子設定
ab_regressor.fit(X_train, y_train)
(7) 接下來評價決策樹迴歸器的訓練效果
y_pred_dt = dt_regressor.predict(X_test)
mse = mean_squared_error(y_test, y_pred_dt)
evs = explained_variance_score(y_test, y_pred_dt)
print("\n#### Decision Tree 效能表現 ####")
print("Mean squared error(均方誤差) =", round(mse, 2))
print("Explained variance score(可釋方差分數) =", round(evs, 2))
(8) 現在評價一下AdaBoost演算法改善的效果:
y_pred_ab = ab_regressor.predict(X_test)
mse = mean_squared_error(y_test, y_pred_ab)
evs = explained_variance_score(y_test, y_pred_ab)
print("\n#### AdaBoost 效能表現 ####")
print("Mean squared error(均方誤差) =", round(mse, 2))
print("Explained variance score (可釋方差分數)=", round(evs, 2))
實驗結果
實驗結論
使用帶AdaBoost的決策樹得到的均方誤差更小,優於普通決策樹,這是因為AdaBoost是一種整合學習方法,其工作機制類似:先從初始訓練集訓練出一個基學習器,再根據基學習器的表現對訓練樣本分佈進行調整,使得先前基學習器做錯的訓練樣本在後續受到更多關注,然後基於調整後的樣本分佈來訓練下一個基學習器;如此反覆進行,直至基學習器數目n_estimator達到事先指定的值T,最終將這T個基學習器進行加權結合