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
設定一個較高的值,然後使用early_stopping_rounds查找停止疊代的最佳時間是很明智的n_estimators
設定
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
-
思考資料洩露問題,本質上需要考慮特征産生的時間順序:
如果該特征在你做出類型判斷之前可以确定,那麼就可以作為類型判斷的依據;
如果該特征必須在你做出類型判斷之後才可以确定,那麼就不可以作為類型判斷的依據,否則就是因果倒置