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 也是常用的分類和回歸演算法之一。

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講


推薦閱讀:
相关文章