AdaBoost 不僅可以用於分類問題,還可以用於回歸分析。
這次我們的主要目標是使用 AdaBoost 預測房價,這是一個回歸問題。
兩個任務:
1、AdaBoost 工具的使用,包括使用 AdaBoost 進行分類,以及回歸分析。
2、使用其他的回歸工具,比如決策樹回歸,對比 AdaBoost 回歸和決策樹回歸的結果。
如何使用 AdaBoost 工具
我們可以直接在 sklearn 中使用 AdaBoost。如果我們要用 AdaBoost 進行分類,需要在使用前引用代碼:
from sklearn.ensemble import AdaBoostClassifier
我們之前講到過,如果你看到了 Classifier 這個類,一般都會對應著 Regressor 類。AdaBoost 也不例外,回歸工具包的引用代碼如下:
from sklearn.ensemble import AdaBoostRegressor
我們先看下如何在 sklearn 中創建 AdaBoost 分類器。
我們需要使用 AdaBoostClassifier(base_estimator=None, n_estimators=50, learning_rate=1.0, algorithm=』SAMME.R』, random_state=None) 這個函數,其中有幾個比較主要的參數,我分別來講解下:
那麼如何創建 AdaBoost 回歸呢?
你能看出來回歸和分類的參數基本是一致的,不同點在於回歸演算法里沒有 algorithm 這個參數,但多了一個 loss 參數。
loss 代表損失函數的設置,一共有 3 種選擇,分別為 linear、square 和 exponential,它們的含義分別是線性、平方和指數。默認是線性。一般採用線性就可以得到不錯的效果。
創建好 AdaBoost 分類器或回歸器之後,我們就可以輸入訓練集對它進行訓練。我們使用 fit 函數,傳入訓練集中的樣本特徵值 train_X 和結果 train_y,模型會自動擬合。使用 predict 函數進行預測,傳入測試集中的樣本特徵值 test_X,然後就可以得到預測結果。
如何用 AdaBoost 對房價進行預測
了解了 AdaBoost 工具包之後,我們看下 sklearn 中自帶的波士頓房價數據集。
這個數據集一共包括了 506 條房屋信息數據,每一條數據都包括了 13 個指標,以及一個房屋價位。
具體代碼如下:
from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error from sklearn.datasets import load_boston from sklearn.ensemble import AdaBoostRegressor # 載入數據 data=load_boston() # 分割數據 train_x, test_x, train_y, test_y = train_test_split(data.data, data.target, test_size=0.25, random_state=33) # 使用 AdaBoost 回歸模型 regressor=AdaBoostRegressor() regressor.fit(train_x,train_y) pred_y = regressor.predict(test_x) mse = mean_squared_error(test_y, pred_y) print(" 房價預測結果 ", pred_y) print(" 均方誤差 = ",round(mse,2))
輸出結果:
同樣,我們可以使用不同的回歸分析模型分析這個數據集,比如使用決策樹回歸和 KNN 回歸。
編寫代碼如下:
from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.tree import DecisionTreeRegressor from sklearn.neighbors import KNeighborsRegressor # 使用決策樹回歸模型 dec_regressor=DecisionTreeRegressor() dec_regressor.fit(train_x,train_y) pred_y = dec_regressor.predict(test_x) mse = mean_squared_error(test_y, pred_y) print(" 決策樹均方誤差 = ",round(mse,2)) # 使用 KNN 回歸模型 knn_regressor=KNeighborsRegressor() knn_regressor.fit(train_x,train_y) pred_y = knn_regressor.predict(test_x) mse = mean_squared_error(test_y, pred_y) print("KNN 均方誤差 = ",round(mse,2))
你能看到相比之下,AdaBoost 的均方誤差更小,也就是結果更優。雖然 AdaBoost 使用了弱分類器,但是通過 50 個甚至更多的弱分類器組合起來而形成的強分類器,在很多情況下結果都優於其他演算法。因此 AdaBoost 也是常用的分類和回歸演算法之一。
在 sklearn 中 AdaBoost 默認採用的是決策樹模型,我們可以隨機生成一些數據,然後對比下 AdaBoost 中的弱分類器(也就是決策樹弱分類器)、決策樹分類器和 AdaBoost 模型在分類準確率上的表現。
如果想要隨機生成數據,我們可以使用 sklearn 中的 make_hastie_10_2 函數生成二分類數據。假設我們生成 12000 個數據,取後 2000 個作為測試集,其餘作為訓練集。
有了數據和訓練模型後,我們就可以編寫代碼。我設置了 AdaBoost 的迭代次數為 200,代表 AdaBoost 由 200 個弱分類器組成。針對訓練集,我們用三種模型分別進行訓練,然後用測試集進行預測,並將三個分類器的錯誤率進行可視化對比,可以看到這三者之間的區別:
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.metrics import zero_one_loss from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import AdaBoostClassifier # 設置 AdaBoost 迭代次數 n_estimators=200 # 使用 X,y=datasets.make_hastie_10_2(n_samples=12000,random_state=1) print(type(X)) # 從 12000 個數據中取後2000 行作為測試集,其餘作為訓練集 test_x, test_y = X[2000:],y[2000:] train_x, train_y = X[:2000],y[:2000] # 弱分類器 dt_stump = DecisionTreeClassifier(max_depth=1,min_samples_leaf=1) dt_stump.fit(train_x, train_y) dt_stump_err = 1.0-dt_stump.score(test_x, test_y) # 決策樹分類器 dt = DecisionTreeClassifier() dt.fit(train_x, train_y) dt_err = 1.0-dt.score(test_x, test_y) # AdaBoost 分類器 ada = AdaBoostClassifier(base_estimator=dt_stump,n_estimators=n_estimators) ada.fit(train_x, train_y) # 三個分類器的錯誤率可視化 fig = plt.figure() # 設置 plt 正確顯示中文 plt.rcParams[font.sans-serif] = [SimHei] ax = fig.add_subplot(111) ax.plot([1,n_estimators],[dt_stump_err]*2, k-, label=u決策樹弱分類器 錯誤率) ax.plot([1,n_estimators],[dt_err]*2,k--, label=u決策樹模型 錯誤率) ada_err = np.zeros((n_estimators,)) # 遍歷每次迭代的結果 i 為迭代次數, pred_y 為預測結果 for i,pred_y in enumerate(ada.staged_predict(test_x)): # 統計錯誤率 ada_err[i]=zero_one_loss(pred_y, test_y) # 繪製每次迭代的 AdaBoost 錯誤率 ax.plot(np.arange(n_estimators)+1, ada_err, label=AdaBoost Test 錯誤率, color=orange) ax.set_xlabel(迭代次數) ax.set_ylabel(錯誤率) leg=ax.legend(loc=upper right,fancybox=True) plt.show()
從圖中你能看出來,弱分類器的錯誤率最高,只比隨機分類結果略好,準確率稍微大於 50%。決策樹模型的錯誤率明顯要低很多。而 AdaBoost 模型在迭代次數超過 25 次之後,錯誤率有了明顯下降,經過 125 次迭代之後錯誤率的變化形勢趨於平緩。
因此我們能看出,雖然單獨的一個決策樹弱分類器效果不好,但是多個決策樹弱分類器組合起來形成的 AdaBoost 分類器,分類效果要好於決策樹模型。
1、回歸分析的問題,我們直接使用 sklearn 中的 AdaBoostRegressor 即可,如果是分類,我們使用 AdaBoostClassifier。
2、AdaBoost 的優勢在於框架本身,它通過一種迭代機制讓原本性能不強的分類器組合起來,形成一個強分類器。
3、經過多個弱分類器組合形成的 AdaBoost 強分類器,準確率要明顯高於決策樹演算法。
4、IBM 伺服器追求的是單個伺服器性能的強大,比如打造超級伺服器。而 Google 在創建集群的時候,利用了很多 PC 級的伺服器,將它們組成集群,整體性能遠比一個超級伺服器的性能強大。oracle高可用架構RAC,mysql高可用架構主從,都是同樣的道理。在內存分配上,raid技術也是如此。都是集群資源大於部分之和。
數據分析實戰45講