系列文章目錄
作者:i阿極
作者簡介:數據分析領域優(yōu)質創(chuàng)作者、多項比賽獲獎者:博主個人首頁
??????如果覺得文章不錯或能幫助到你學習,可以點贊??收藏??評論??+關注哦!??????
??????如果有小伙伴需要數據集和學習交流,文章下方有交流學習區(qū)!一起學習進步!??
大家好,我i阿極。喜歡本專欄的小伙伴,請多多支持
專欄案例:機器學習案例 |
---|
機器學習(一):線性回歸之最小二乘法 |
機器學習(二):線性回歸之梯度下降法 |
機器學習(三):基于線性回歸對波士頓房價預測 |
機器學習(四):基于KNN算法對鳶尾花類別進行分類預測 |
機器學習(五):基于KNN模型對高爐發(fā)電量進行回歸預測分析 |
機器學習(六):基于高斯貝葉斯對面部皮膚進行預測分析 |
機器學習(七):基于多項式貝葉斯對蘑菇毒性分類預測分析 |
機器學習(八):基于PCA對人臉識別數據降維并建立KNN模型檢驗 |
機器學習(十四):基于邏輯回歸對超市銷售活動預測分析 |
機器學習(十五):基于神經網絡對用戶評論情感分析預測 |
機器學習(十六):線性回歸分析女性身高與體重之間的關系 |
機器學習(十七):基于支持向量機(SVM)進行人臉識別預測 |
機器學習(十八):基于邏輯回歸對優(yōu)惠券使用情況預測分析 |
機器學習(十九):基于邏輯回歸對某銀行客戶違約預測分析 |
機器學習(二十):LightGBM算法原理(附案例實戰(zhàn)) |
機器學習(二十一):基于樸素貝葉斯對花瓣花萼的寬度和長度分類預測 |
機器學習(二十二):基于邏輯回歸(Logistic Regression)對股票客戶流失預測分析 |
1、AdaBoost基本原理
AdaBoost是一種通過改變訓練樣本權重來學習多個弱分類器并線性組合成強分類器的Boosting算法。一般來說,Boosting方法要解答兩個關鍵問題:
- 一是在訓練過程中如何改變訓練樣本的權重或者概率分布
- 二是如何將多個弱分類器組合成一個強分類器。
針對這兩個問題,AdaBoost的做法非常樸素:
- 一是提高前一輪被弱分類器分類錯誤的樣本的權重,而降低分類正確的樣本的權重
- 二是對多個弱分類器進行線性組合,提高分類效果好的弱分類器的權重,降低分類誤差率高的弱分類器的權重。
給定訓練集
其中
AdaBoost訓練算法如下:
(1) 初始化訓練數據樣本的權重分布,即為每個訓練樣本分配一個初始權重:
(2) 對于t = 1,2,3,…,T,分別執(zhí)行以下步驟:
(a) 對包含權重分布
D
t
D_t
Dt?的訓練集進行訓練并得到弱分類器
G
t
(
x
)
G_t(x)
Gt?(x)?!?br> (b) 計算
G
t
(
x
)
G_t(x)
Gt?(x)在當前加權訓練集上的分類誤差率:
? t = P ( G t ( x i ) ≠ y i ) = ∑ i = 1 N w t i I ( G t ( x i ) ≠ y i ) \epsilon_t=P\left(G_t\left(x_i\right) \neq y_i\right)=\sum_{i=1}^N w_{t i} I\left(G_t\left(x_i\right) \neq y_i\right) ?t?=P(Gt?(xi?)=yi?)=∑i=1N?wti?I(Gt?(xi?)=yi?)
(c )根據分類誤差率計算當前弱分類器的權重系數 α t \alpha_t αt?:
α t = 1 2 log ? 1 ? ? t ? t \alpha_t=\frac{1}{2} \log \frac{1-\epsilon_t}{\epsilon_t} αt?=21?log?t?1??t??
(d) 調整訓練集的權重分布:
其中 Z t Z_t Zt?為歸一化因子, Z t = ∑ i = 1 N w i exp ? ( ? α t y i G t ( x i ) ) Z_t=\sum_{i=1}^N w_i \exp \left(-\alpha_t y_i G_t\left(x_i\right)\right) Zt?=∑i=1N?wi?exp(?αt?yi?Gt?(xi?))
(3) 最后構建
T
T
T個弱分類器的線性組合:
最終的強分類器可以寫為:
根據 α t = 1 2 log ? 1 ? ? t ? t \alpha_t=\frac{1}{2} \log \frac{1-\epsilon_t}{\epsilon_t} αt?=21?log?t?1??t??的弱分類器權重系數計算過程中,當弱分類器的分類誤差率 ? t ? 1 2 \epsilon_t \leqslant \frac{1}{2} ?t??21?時, 0 ? α t 0 \leqslant\alpha_t 0?αt?,且 α t \alpha_t αt?隨著 ? t \epsilon_t ?t?的減小而變大,這也正是弱分類器權重系數計算公式的設計思想,它能夠使得分類誤差率較低的分類器有較大的權重系數。
根據
訓練樣本權重分布可以寫為:
當樣本被弱分類器正確分類時,它的權重變??;當樣本被弱分類器錯誤分類時,它的權重變大。相比之外,錯誤分類樣本的權重增大了
e
2
α
t
\mathrm{e}^{2 \alpha_t}
e2αt?倍,這就使得在下一輪訓練中,算法將更加關注這些誤分類的樣本。
以上就是AdaBoost算法的基本原理??梢钥吹?,算法步驟非常直觀易懂,巧妙的算法設計能夠非常好地回答B(yǎng)oosting方法的兩個關鍵問題。上述關于AdaBoost的理解可以視為該模型的經典版本。
2、實驗環(huán)境
Python 3.9
Anaconda
Jupyter Notebook
3、AdaBoost函數語法
AdaBoostClassifier分類器
AdaBoostClassifier(base_estimator=None, n_estimators=50,
learning_rate=1.0, algorithm='SAMME.R', random_state=None)
AdaBoostClassifier回歸器
AdaBoostRegressor(base_estimator=None, n_estimators=50,
learning_rate=1.0, loss='linear', random_state=None)
- base_estimator:用于指定提升算法所應用的基礎分類器,默認為分類決策樹(CART),也可以是其他基礎分類器,但分類器必須支持帶樣本權重的學習,如神經網絡。
- n_estimators:用于指定基礎分類器的數量,默認為50個,當模型在訓練數據集中得到完美的擬合后,可以提前結束算法,不一定非得構建完指定個數的基礎分類器。
- learning_rate:用于指定模型迭代的學習率或步長,即對應的提升模型F(x)可以表示為F(x)=F_m?1(x)+υα_mf_m(x),其中的υ就是該參數的指定值,默認值為1;對于較小的學習率υ而言,則需要迭代更多次的基礎分類器,通常情況下需要利用交叉驗證法確定合理的基礎分類器個數和學習率。
- algorithm:用于指定AdaBoostClassifier分類器的算法,默認為’SAMME.R’,也可以使用’SAMME’;使用’SAMME.R’時,基礎模型必須能夠計算類別的概率值;一般而言,'SAMME.R’算法相比于’SAMME’算法,收斂更快、誤差更小、迭代數量更少。
- loss:用于指定AdaBoostRegressor回歸提升樹的損失函數,可以是’linear’,表示使用線性損失函數;也可以是’square’,表示使用平方損失函數;還可以是’exponential’,表示使用指數損失函數;該參數的默認值為’linear’。
- random_state:用于指定隨機數生成器的種子。
4、案例實戰(zhàn)——信用卡是否違約的識別
4.1導入數據
# 導入第三方包
import pandas as pd
import matplotlib.pyplot as plt
# 讀入數據
default = pd.read_excel(r'D:\CSDN\machine learning\default of credit card.xls')
4.2繪制餅圖查看是否違約的客戶比例
plt.axes(aspect = 'equal')
# 中文亂碼和坐標軸負號的處理
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
# 統計客戶是否違約的頻數
counts = default.y.value_counts()
# 繪制餅圖
plt.pie(x = counts, # 繪圖數據
labels=pd.Series(counts.index).map({0:'不違約',1:'違約'}), # 添加文字標簽
autopct='%.1f%%' # 設置百分比的格式,這里保留一位小數
)
# 顯示圖形
plt.show()
4.3拆分為訓練集和測試集
# 導入第三方包
from sklearn import model_selection
from sklearn import ensemble
from sklearn import metrics
# 排除數據集中的ID變量和因變量,剩余的數據用作自變量X
X = default.drop(['ID','y'], axis = 1)
y = default.y
# 數據拆分
X_train,X_test,y_train,y_test = model_selection.train_test_split(X,y,test_size = 0.25, random_state = 1234)
使用train_test_split函數將數據集拆分為訓練集和測試集。其中,參數X和y分別表示自變量和因變量,test_size表示測試集的比例(此處設置為0.25,即25%),random_state用于控制數據集的隨機拆分,確保結果可重復。
4.4構建Adaboost模型并預測
# 構建AdaBoost算法的類
AdaBoost1 = ensemble.AdaBoostClassifier()
# 算法在訓練數據集上的擬合
AdaBoost1.fit(X_train,y_train)
# 算法在測試數據集上的預測
pred1 = AdaBoost1.predict(X_test)
4.5返回模型的預測結果
# 返回模型的預測效果
print('模型的準確率為:\n',metrics.accuracy_score(y_test, pred1))
print('模型的評估報告:\n',metrics.classification_report(y_test, pred1))
4.6計算客戶違約的概率值,用于生成ROC曲線的數據
y_score = AdaBoost1.predict_proba(X_test)[:,1]
fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
# 計算AUC的值
roc_auc = metrics.auc(fpr,tpr)
# 繪制面積圖
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加邊際線
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加對角線
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x軸與y軸標簽
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 顯示圖形
plt.show()
4.7查看自變量的重要性排序
importance = pd.Series(AdaBoost1.feature_importances_, index = X.columns)
importance.sort_values().plot(kind = 'barh')
plt.show()
4.8取出重要性比較高的自變量建模
predictors = list(importance[importance>0.02].index)
predictors
# 通過網格搜索法選擇基礎模型所對應的合理參數組合
# 導入第三方包
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
max_depth = [3,4,5,6]
params1 = {'base_estimator__max_depth':max_depth}
base_model = GridSearchCV(estimator = ensemble.AdaBoostClassifier(base_estimator = DecisionTreeClassifier()),
param_grid= params1, scoring = 'roc_auc', cv = 5, n_jobs = 4, verbose = 1)
base_model.fit(X_train[predictors],y_train)
# 返回參數的最佳組合和對應AUC值
base_model.best_params_, base_model.best_score_
4.9通過網格搜索法選擇提升樹的合理參數組合
# 導入第三方包
from sklearn.model_selection import GridSearchCV
n_estimators = [100,200,300]
learning_rate = [0.01,0.05,0.1,0.2]
params2 = {'n_estimators':n_estimators,'learning_rate':learning_rate}
adaboost = GridSearchCV(estimator = ensemble.AdaBoostClassifier(base_estimator = DecisionTreeClassifier(max_depth = 3)),
param_grid= params2, scoring = 'roc_auc', cv = 5, n_jobs = 4, verbose = 1)
adaboost.fit(X_train[predictors] ,y_train)
# 返回參數的最佳組合和對應AUC值
adaboost.best_params_, adaboost.best_score_
4.10使用最佳的參數組合構建AdaBoost模型
AdaBoost2 = ensemble.AdaBoostClassifier(base_estimator = DecisionTreeClassifier(max_depth = 3),
n_estimators = 300, learning_rate = 0.01)
# 算法在訓練數據集上的擬合
AdaBoost2.fit(X_train[predictors],y_train)
# 算法在測試數據集上的預測
pred2 = AdaBoost2.predict(X_test[predictors])
# 返回模型的預測效果
print('模型的準確率為:\n',metrics.accuracy_score(y_test, pred2))
print('模型的評估報告:\n',metrics.classification_report(y_test, pred2))
4.11計算正例的預測概率,用于生成ROC曲線的數據
y_score = AdaBoost2.predict_proba(X_test[predictors])[:,1]
fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
# 計算AUC的值
roc_auc = metrics.auc(fpr,tpr)
# 繪制面積圖
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加邊際線
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加對角線
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x軸與y軸標簽
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 顯示圖形
plt.show()
文章來源:http://www.zghlxwxcb.cn/news/detail-480991.html
??文章下方有交流學習區(qū)!一起學習進步!??????
??首發(fā)CSDN博客,創(chuàng)作不易,如果覺得文章不錯,可以點贊??收藏??評論??
??你的支持和鼓勵是我創(chuàng)作的動力???文章來源地址http://www.zghlxwxcb.cn/news/detail-480991.html
到了這里,關于機器學習:基于AdaBoost算法模型對信用卡是否違約進行識別的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!