ensemble learning 2—— booasting and stacking

1 Boosting
AdaBoost是英文“Adaptive Boosting”(自適應增強)的縮寫,它的自適應在於:前一個基本分類器被錯誤分類的樣本的權值會增大,而正確分類的樣本的權值會減小,並再次用來訓練下一個基本分類器。同時,在每一輪迭代中,加入一個新的弱分類器,直到達到某個預定的足夠小的錯誤率或達到預先指定的最大迭代次數才確定最終的強分類器。

Adaboost算法可以簡述爲三個步驟:
(1)首先,是初始化訓練數據的權值分佈D1。假設有N個訓練樣本數據,則每一個訓練樣本最開始時,都被賦予相同的權值:w1=1/N。
(2)然後,訓練弱分類器hi。具體訓練過程中是:如果某個訓練樣本點,被弱分類器hi準確地分類,那麼在構造下一個訓練集中,它對應的權值要減小;相反,如果某個訓練樣本點被錯誤分類,那麼它的權值就應該增大。權值更新過的樣本集被用於訓練下一個分類器,整個訓練過程如此迭代地進行下去。
(3)最後,將各個訓練得到的弱分類器組合成一個強分類器。各個弱分類器的訓練過程結束後,加大分類誤差率小的弱分類器的權重,使其在最終的分類函數中起着較大的決定作用,而降低分類誤差率大的弱分類器的權重,使其在最終的分類函數中起着較小的決定作用。

總結起來,誤差率低的弱分類器在最終分類器中佔的權重較大,否則較小。 算法流程如下:
在這裏插入圖片描述

import numpy as np
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles
from sklearn.metrics import classification_report
# 生成2維正態分佈,生成的數據按分位數分爲兩類,500個樣本,2個樣本特徵
x1, y1 = make_gaussian_quantiles(n_samples=500, n_features=2,n_classes=2)
# 生成2維正態分佈,生成的數據按分位數分爲兩類,400個樣本,2個樣本特徵均值都爲3
x2, y2 = make_gaussian_quantiles(mean=(3, 3), n_samples=500, n_features=2, n_classes=2)
# 將兩組數據合成一組數據
x_data = np.concatenate((x1, x2))
y_data = np.concatenate((y1, - y2 + 1))
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
plt.show()

# 決策樹模型
model = tree.DecisionTreeClassifier(max_depth=3)

# 輸入數據建立模型
model.fit(x_data, y_data)

# 獲取數據值所在的範圍
x_min, x_max = x_data[:, 0].min() - 1, x_data[:, 0].max() + 1
y_min, y_max = x_data[:, 1].min() - 1, x_data[:, 1].max() + 1

# 生成網格矩陣
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))

z = model.predict(np.c_[xx.ravel(), yy.ravel()])# ravel與flatten類似,多維數據轉一維。flatten不會改變原始數據,ravel會改變原始數據
z = z.reshape(xx.shape)
# 等高線圖
cs = plt.contourf(xx, yy, z)
# 樣本散點圖
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
plt.show()

# 模型準確率
model.score(x_data,y_data)
# AdaBoost模型
model = AdaBoostClassifier(DecisionTreeClassifier(max_depth=3),n_estimators=10)
# 訓練模型
model.fit(x_data, y_data)

# 獲取數據值所在的範圍
x_min, x_max = x_data[:, 0].min() - 1, x_data[:, 0].max() + 1
y_min, y_max = x_data[:, 1].min() - 1, x_data[:, 1].max() + 1

# 生成網格矩陣
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))

# 獲取預測值
z = model.predict(np.c_[xx.ravel(), yy.ravel()])
z = z.reshape(xx.shape)
# 等高線圖
cs = plt.contourf(xx, yy, z)
# 樣本散點圖
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
plt.show()
# 模型準確率
model.score(x_data,y_data)

2 Stacking
使用多個不同的分類器對訓練集進預測,把預測得到的結果作爲一個次級分類器的輸入。次級分類器的輸出是整個模型的預測結果。
在這裏插入圖片描述
核心代碼實現

# 載入數據集
iris = datasets.load_iris()  
# 只要第1,2列的特徵
x_data, y_data = iris.data[:, 1:3], iris.target  

# 定義三個不同的分類器
clf1 = KNeighborsClassifier(n_neighbors=1)  
clf2 = DecisionTreeClassifier() 
clf3 = LogisticRegression()  
 
# 定義一個次級分類器
lr = LogisticRegression()  
sclf = StackingClassifier(classifiers=[clf1, clf2, clf3],   
                          meta_classifier=lr)
  
for clf,label in zip([clf1, clf2, clf3, sclf],
                      ['KNN','Decision Tree','LogisticRegression','StackingClassifier']):  
    scores = model_selection.cross_val_score(clf, x_data, y_data, cv=3, scoring='accuracy')  
    print("Accuracy: %0.2f [%s]" % (scores.mean(), label)) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章