天天看點

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

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
【Kaggle】Intermediate Machine Learning(XGBoost + Data 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

  • 思考資料洩露問題,本質上需要考慮特征産生的時間順序:

    如果該特征在你做出類型判斷之前可以确定,那麼就可以作為類型判斷的依據;

    如果該特征必須在你做出類型判斷之後才可以确定,那麼就不可以作為類型判斷的依據,否則就是因果倒置