【Kaggle】Intermediate Machine Learning(XGBoost + Data Leakage)
文章目錄
- 6. XGBoost
- 7. Data Leakage 數據泄露
上一篇:【Kaggle】Intermediate Machine Learning(管道+交叉驗證)
6. XGBoost
參考:《統計學習方法》提升方法(Boosting)
extreme gradient boosting “梯度提升”是指對損失函數使用梯度下降來確定此新模型中的參數
from xgboost import XGBRegressormy_model = XGBRegressor(n_estimators=500) my_model.fit(X_train, y_train)from sklearn.metrics import mean_absolute_errorpredictions = 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命令中等待
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(管道+交叉驗證)
總結
以上是生活随笔為你收集整理的【Kaggle】Intermediate Machine Learning(XGBoost + Data Leakage)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 增加、更新、删除
- 下一篇: LeetCode 426. 将二叉搜索树