【Kaggle】Intermediate Machine Learning(XGBoost + Data Leakage)

上一篇:【Kaggle】Intermediate Machine Learning(管道+交叉驗證)

6. XGBoost

參考:《統計學習方法》提升方法(Boosting)

extreme gradient boosting “梯度提升”是指對損失函數使用梯度下降來確定此新模型中的參數

from xgboost import XGBRegressor

my_model = XGBRegressor(n_estimators=500)
my_model.fit(X_train, y_train)

from sklearn.metrics import mean_absolute_error

predictions = my_model.predict(X_valid)
print("Mean Absolute Error: " + str(mean_absolute_error(predictions, y_valid)))

參數調整
XGBoost 具有一些可以極大地影響準確性和訓練速度的參數

  • n_estimators :等於我們包含在集合中的模型數量

值太低會導致擬合不足,導致訓練數據和測試數據的預測不正確。

值太高會導致擬合過度,導致對訓練數據的準確預測,但對測試數據的預測不準確

典型值範圍是100-1000,儘管這在很大程度上取決於下面討論的 learning_rate 參數

  • early_stopping_rounds :提供了一種自動爲n_estimators查找理想值的方法。爲n_estimators設置一個較高的值,然後使用early_stopping_rounds查找停止迭代的最佳時間是很明智的

設置early_stopping_rounds = 5是一個合理的選擇。在這種情況下,連續5輪驗證評分下降後停止

當使用early_stopping_rounds時,還需要預留一些數據來計算驗證分數,這是通過設置eval_set參數來完成的

my_model = XGBRegressor(n_estimators=500)
my_model.fit(X_train, y_train, 
             early_stopping_rounds=5, 
             eval_set=[(X_valid, y_valid)],
             verbose=False)
  • learning_rate
    與其簡單地將每個組件模型的預測相加即可得到預測,還可以在將每個模型的預測相加之前將其乘以一小數(稱爲學習率)

這意味着添加到集合中的每棵樹對我們的幫助都會有所減少
因此,可以爲n_estimators設置更高的值而不會過度擬合
如果我們使用 early stopping,則會自動確定適當的 tree 的數量

通常,學習率較高 且 estimators 多,會生成更精確的模型,但迭代次數較多,花費較長時間,默認情況下,XGBoost 設置 learning_rate = 0.1

my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05)
my_model.fit(X_train, y_train, 
             early_stopping_rounds=5, 
             eval_set=[(X_valid, y_valid)], 
             verbose=False)
  • n_jobs:運行較大數據集,並行更快地構建模型

通常將參數 n_jobs 設置爲等於計算機上的內核數
在較小的數據集上,這無濟於事
但是,在大型數據集中很有用,否則將花費很長時間在fit命令中等待

my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05, n_jobs=4)
my_model.fit(X_train, y_train, 
             early_stopping_rounds=5, 
             eval_set=[(X_valid, y_valid)], 
             verbose=False)

7. Data Leakage 數據泄露

Data Leakage 相關博文

泄漏會導致模型看起來很準確,當開始對模型進行決策爲止,然後模型變得非常不準確

泄漏有兩種主要類型:目標泄漏 target leakage訓練-測試污染train-test contamination

  • 目標泄漏 target leakage
    在這裏插入圖片描述

例子:人們得了肺炎後要服用抗生素藥物才能康復

原始數據顯示這些列之間存在很強的關係,但是在確定got_pneumonia的值後,took_antibiotic_medicine經常更改。這是目標泄漏,因爲我們要預測的是 是否會患肺炎,是否吃藥是在得了肺炎之後的選擇,會不確定,因果關係反了

該模型將發現,對於took_antibiotic_medicine值爲False的任何人都沒有肺炎。由於驗證數據與訓練數據來自同一來源,模型將具有很高的驗證(或交叉驗證)分數

但是,此模型隨後在現實世界中部署時將非常不準確,因爲有些患有肺炎的患者也不會接受抗生素治療
爲防止此類數據泄漏,應當將該特徵數據排除

  • 訓練-測試污染 Train-Test Contamination

驗證旨在衡量模型如何處理之前未考慮過的數據

例如,在調用train_test_split()之前進行了預處理(例如 fitting an Imputer)。模型可能會獲得良好的驗證評分,但是在部署模型進行決策時卻表現不佳

將驗證數據或測試數據中的數據合併到了如何進行預測中,因此即使無法將其推廣到新數據,該方法也可能會對特定數據表現良好。當執行更復雜的特徵工程時,此問題變得更加微妙(更加危險)


例子:信用卡

沒有信用卡的人 —> 100%沒有消費支出
有信用卡的人 —> 2%的人,沒有消費記錄

根據此特徵來預測是否會發放信用卡申請,正確率98%
但是有部分持有信用卡的人可能平時沒有消費,並且統計出來的費用是這張申請的信用卡的消費,還是申請這張信用卡之前的消費呢?這些都不是很清楚,這就可能造成很大偏差

所以這種可能造成很大偏差的特徵要棄用,或者非常謹慎

# Drop leaky predictors from dataset
potential_leaks = ['expenditure', 'share', 'active', 'majorcards']
X2 = X.drop(potential_leaks, axis=1)

# Evaluate the model with leaky predictors removed
cv_scores = cross_val_score(my_pipeline, X2, y, 
                            cv=5,
                            scoring='accuracy')

print("Cross-val accuracy: %f" % cv_scores.mean())

總結:

  • 仔細分離訓練和驗證數據可以防止Train-Test Contamination,並且Pipeline可以幫助實現這種分離
  • 謹慎,常識和數據探索相結合可以幫助識別target leakage
  • 思考數據泄露問題,本質上需要考慮特徵產生的時間順序:
    如果該特徵在你做出類型判斷之前可以確定,那麼就可以作爲類型判斷的依據;
    如果該特徵必須在你做出類型判斷之後纔可以確定,那麼就不可以作爲類型判斷的依據,否則就是因果倒置

完成了課程,獲得證書鼓勵,🚀🚀🚀 加油
在這裏插入圖片描述
上一篇:【Kaggle】Intermediate Machine Learning(管道+交叉驗證)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章