一、boosting算法
boosting是一種集成學習算法,由一系列基本分類器按照不同的權重組合成為一個強分類器,這些基本分類器之間有依賴關系。包括Adaboost算法、提升樹、GBDT算法

一、Adaboost算法
AdaBoost方法的自適應在於:前一個分類器分錯的樣本會被用來訓練下一個分類器。AdaBoost方法是一種迭代算法,在每一輪中加入一個新的弱分類器,直到達到某個預定的足夠小的錯誤率。每一個訓練樣本都被賦予一個權重,表明它被某個分類器選入訓練集的概率。如果某個樣本點已經被准確地分類,那么在構造下一個訓練集中,它被選中的概率就被降低;相反,如果某個樣本點沒有被准確地分類,那么它的權重就得到提高。通過這樣的方式,AdaBoost方法能“聚焦於”那些較難分(更富信息)的樣本上。雖然AdaBoost方法對於噪聲數據和異常數據很敏感。但相對於大多數其它學習算法而言,卻又不會很容易出現過擬合現象
算法原理
(1)初始化訓練數據(每個樣本)的權值分布:如果有N個樣本,則每一個訓練的樣本點最開始時都被賦予相同的權重:1/N。
(2)訓練弱分類器。具體訓練過程中,如果某個樣本已經被准確地分類,那么在構造下一個訓練集中,它的權重就被降低;相反,如果某個樣本點沒有被准確地分類,那么它的權重就得到提高。同時,得到弱分類器對應的話語權。然后,更新權值后的樣本集被用於訓練下一個分類器,整個訓練過程如此迭代地進行下去。
(3)將各個訓練得到的弱分類器組合成強分類器。各個弱分類器的訓練過程結束后,分類誤差率小的弱分類器的話語權較大,其在最終的分類函數中起着較大的決定作用,而分類誤差率大的弱分類器的話語權較小,其在最終的分類函數中起着較小的決定作用。換言之,誤差率低的弱分類器在最終分類器中占的比例較大,反之較小
AdaBoost的具體步驟如下:

3.迭代完成后,組合弱分類器

其中


然后,加個sign函數,該函數用於求數值的正負。數值大於0,為1。小於0,為-1.等於0,為0.得到最終的強分類器


那么這個更新后的權重怎么得來的
首先錯誤率e=0.1*3=0.3
系數aj=0.5log(0.7/0.3)=0.42364893019360184
分別計算分類錯誤和分類正確的權重,由上面可知分類正確與否的權重其實只與e上面的指數的正負有關,分錯的是e**aj,分對的是e**-aj,他們分別等於1.5275252316519468,0.6546536707079771
最后再歸一化,比如1.5275252316519468/(1.5275252316519468*3+0.6546536707079771*7)=0.16666666666666666
Adaboost是一種比較有特點的算法,可以總結如下:
1)每次迭代改變的是樣本的分布,而不是重復采樣(reweight);
2)樣本分布的改變取決於樣本是否被正確分類,總是分類正確的樣本權值低,總是分類錯誤的樣本權值高(通常是邊界附近的樣本);
3)最終的結果是弱分類器的加權組合,權值表示該弱分類器的性能
Adaboost有很多優點:
1)adaboost是一種有很高精度的分類器
2)可以使用各種方法構建子分類器,adaboost算法提供的是框架
3)當使用簡單分類器時,計算出的結果是可以理解的。而且弱分類器構造極其簡單
4)簡單,不用做特征篩選
5)不用擔心overfitting!
實際應用
(1)用於二分類或多分類
(2)特征選擇
(3)分類人物的baseline
1.Adaboost用於分類
函數解析
class sklearn.ensemble.AdaBoostClassifier(base_estimator=None, n_estimators=50,learning_rate=1.0, algorithm=’SAMME.R’,random_state=None)
參數解析:
1.1 base_estimator: 可選參數,默認為DecisionTreeClassifier。理論上可以選擇任何一個分類或者回歸學習器,不過需要支持樣本權重。我們常用的一般是CART決策樹或者神經網絡MLP。默認是決策樹,即AdaBoostClassifier默認使用CART分類樹DecisionTreeClassifier,另外有一個要注意的點是,如果我們選擇的AdaBoostClassifier算法是SAMME.R,則我們的弱分類學習器還需要支持概率預測,也就是在scikit-learn中弱分類學習器對應的預測方法除了predict還需要有predict_proba
1.2 n_estimators: 整數型,可選參數,默認為50。弱學習器的最大迭代次數,或者說最大的弱學習器的個數。一般來說n_estimators太小,容易欠擬合,n_estimators太大,又容易過擬合,一般選擇一個適中的數值。默認是50。在實際調參的過程中,我們常常將n_estimators和下面介紹的參數learning_rate一起考慮
1.3 learning_rate: 學習率,表示梯度收斂速度,默認為1,如果過大,容易錯過最優值,如果過小,則收斂速度會很慢;該值需要和n_estimators進行一個權衡,當分類器迭代次數較少時,學習率可以小一些,當迭代次數較多時,學習率可以適當放大。每個弱學習器的權重縮減系數
1.4 algorithm: 可選參數,默認為SAMME.R。boosting算法,也就是模型提升准則,scikit-learn實現了兩種Adaboost分類算法,SAMME和SAMME.R。兩者的主要區別是弱學習器權重的度量,SAMME使用對樣本集分類效果作為弱學習器權重,而SAMME.R使用了對樣本集分類的預測概率大小來作為弱學習器權重。由於SAMME.R使用了概率度量的連續值,迭代一般比SAMME快,因此AdaBoostClassifier的默認算法algorithm的值也是SAMME.R。我們一般使用默認的SAMME.R就夠了,但是要注意的是使用了SAMME.R, 則弱分類學習器參數base_estimator必須限制使用支持概率預測的分類器。SAMME算法則沒有這個限制
1.5 random_state: 整數型,可選參數,默認為None。如果RandomState的實例,random_state是隨機數生成器; 如果None,則隨機數生成器是由np.random使用的RandomState實例
Adaboost-對象
- estimators_:以列表的形式返回所有的分類器。
- classes_:類別標簽。
- estimator_weights_:每個分類器權重。
- estimator_errors_:每個分類器的錯分率,與分類器權重相對應。
- feature_importances_:特征重要性,這個參數使用前提是基分類器也支持這個屬性。
Adaboost-方法
- decision_function(X):返回決策函數值(比如svm中的決策距離)。
- fit(X,Y):在數據集(X,Y)上訓練模型。
- get_parms():獲取模型參數。
- predict(X):預測數據集X的結果。
- predict_log_proba(X):預測數據集X的對數概率。
- predict_proba(X):預測數據集X的概率值。
- score(X,Y):輸出數據集(X,Y)在模型上的准確率。
- staged_decision_function(X):返回每個基分類器的決策函數值。
- staged_predict(X):返回每個基分類器的預測數據集X的結果。
- staged_predict_proba(X):返回每個基分類器的預測數據集X的概率結果。
- staged_score(X, Y):返回每個基分類器的預測准確率
# -*- coding: utf-8 -*- """ Created on Tue Aug 11 10:12:48 2020 """ from sklearn.ensemble import AdaBoostClassifier ,AdaBoostRegressor from sklearn.datasets import load_iris x_data=load_iris().data y_data=load_iris().target from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(x_data,y_data,test_size=0.3,random_state=1,stratify=y_data) #單個決策樹模型 from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score tree = DecisionTreeClassifier(criterion='gini',max_depth=4,random_state=1) tree.fit(X_train,y_train) y_train_pred = tree.predict(X_train) y_test_pred = tree.predict(X_test) tree_train = accuracy_score(y_train,y_train_pred) tree_test = accuracy_score(y_test,y_test_pred) print('Decision tree train/test accuracies %.3f/%.3f' % (tree_train,tree_test)) #Decision tree train/test accuracies 0.971/0.978 ## 我們使用Adaboost集成建模: ada = AdaBoostClassifier(base_estimator=tree,n_estimators=200,learning_rate=0.2,random_state=1) ada = ada.fit(X_train,y_train) y_train_pred = ada.predict(X_train) y_test_pred = ada.predict(X_test) ada_train = accuracy_score(y_train,y_train_pred) ada_test = accuracy_score(y_test,y_test_pred) print('Adaboost train/test accuracies %.3f/%.3f' % (ada_train,ada_test)) #Adaboost train/test accuracies 1.000/0.978
2.Adaboost用於回歸
參數基本一樣,唯一的區別是用於回歸時有loss參數,參數說明如下:

# -*- coding: utf-8 -*- """ Created on Tue Aug 11 10:12:48 2020 """ from sklearn.ensemble import AdaBoostClassifier ,AdaBoostRegressor from sklearn.datasets import load_boston x_data=load_boston().data y_data=load_boston().target from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(x_data,y_data,test_size=0.3,random_state=1) #數據標准化 # 從 sklearn.preprocessing 導入數據標准化模塊。 from sklearn.preprocessing import StandardScaler # 分別初始化對特征和目標值的標准化器。 ss_X = StandardScaler() ss_y = StandardScaler() # 分別對訓練和測試數據的特征以及目標值進行標准化處理。 X_train = ss_X.fit_transform(X_train) X_test = ss_X.transform(X_test) y_train = ss_y.fit_transform(y_train.reshape(-1,1)) y_test = ss_y.transform(y_test.reshape(-1,1)) import numpy as np import matplotlib.pyplot as plt def plot_feature_importances(feature_importances, title, feature_names): # Normalize the importance values feature_importances = 100.0 * (feature_importances / max(feature_importances)) # Sort the values and flip them index_sorted = np.flipud(np.argsort(feature_importances)) # Arrange the X ticks pos = np.arange(index_sorted.shape[0]) + 0.5 # Plot the bar graph plt.figure() plt.bar(pos, feature_importances[index_sorted], align='center') plt.xticks(pos, feature_names[index_sorted]) plt.ylabel('Relative Importance') plt.title(title) plt.show() #單個決策樹模型 from sklearn.tree import DecisionTreeRegressor from sklearn.metrics import r2_score, mean_squared_error tree = DecisionTreeRegressor(max_depth=6,random_state=1) tree.fit(X_train,y_train) y_train_pred = tree.predict(X_train) y_test_pred = tree.predict(X_test) tree.score(X_test, y_test) #0.8427465276357865 r2_score(y_train,y_train_pred) #0.9485651664023145 r2_score(y_test,y_test_pred) #0.8427465276357866 mean_squared_error(y_train,y_train_pred) #0.05143483359768557 mean_squared_error(y_test,y_test_pred) #0.17752374245868488 tree.feature_importances_ plot_feature_importances(tree.feature_importances_, 'Decision Tree regressor', load_boston().feature_names) ## 我們使用Adaboost集成建模: ada = AdaBoostRegressor(base_estimator=tree,n_estimators=200,learning_rate=0.2,random_state=1) ada = ada.fit(X_train,y_train) y_train_pred = ada.predict(X_train) y_test_pred = ada.predict(X_test) ada.score(X_test, y_test) # 0.8781684126580823 r2_score(y_train,y_train_pred) #0.9829984375151436 r2_score(y_test,y_test_pred) #0.8781684126580824 mean_squared_error(y_train,y_train_pred) #0.017001562484856434 mean_squared_error(y_test,y_test_pred) #0.13753590944260316 tree.feature_importances_ plot_feature_importances(ada.feature_importances_, 'Decision Tree regressor', load_boston().feature_names)


