9.XGBoost
本教程是機器學(xué)習(xí)系列的一部分。 在此步驟中,您將學(xué)習(xí)如何使用功能強大的xgboost庫構(gòu)建和優(yōu)化模型。
What is XGBoost
XGBoost是處理標(biāo)準(zhǔn)表格數(shù)據(jù)的領(lǐng)先模型(您在Pandas DataFrames中存儲的數(shù)據(jù)類型,而不是像圖像和視頻這樣的更奇特的數(shù)據(jù)類型)。 XGBoost模型在許多Kaggle比賽中占據(jù)主導(dǎo)地位。
為了達(dá)到峰值精度,XGBoost模型比Random Forest等技術(shù)需要更多的知識和模型調(diào)整。 在本教程之后,你將能夠
- ???? 遵循XGBoost的完整建模工作流程
- ???? 微調(diào)XGBoost模型以獲得最佳性能
XGBoost是Gradient Boosted決策樹算法的一種實現(xiàn)(scikit-learn有另一個版本的算法,但XGBoost有一些技術(shù)優(yōu)勢。)什么是Gradient Boosted決策樹? 我們將通過一個圖表。
我們經(jīng)歷了重復(fù)構(gòu)建新模型的循環(huán),并將它們組合成一個整體模型。 我們通過計算數(shù)據(jù)集中每個觀察的誤差來開始循環(huán)。 然后我們構(gòu)建一個新模型來預(yù)測。 我們將此誤差預(yù)測模型的預(yù)測添加到“模型集合”中。
為了進(jìn)行預(yù)測,我們添加了以前所有模型的預(yù)測。 我們可以使用這些預(yù)測來計算新誤差,構(gòu)建下一個模型,并將其添加到整體中。
那個周期之外還有一件。 我們需要一些基礎(chǔ)預(yù)測來開始循環(huán)。 在實踐中,最初的預(yù)測可能非常幼稚。 即使它的預(yù)測非常不準(zhǔn)確,隨后對整體的添加將解決這些錯誤。
這個過程可能聽起來很復(fù)雜,但使用它的代碼很簡單。 我們將在下面的模型調(diào)整部分填寫一些額外的解釋性細(xì)節(jié)。
Example
我們將從預(yù)先加載到train_X,test_X,train_y,test_x的數(shù)據(jù)開始。
[1]
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import Imputerdata = pd.read_csv('../input/train.csv') data.dropna(axis=0, subset=['SalePrice'], inplace=True) y = data.SalePrice X = data.drop(['SalePrice'], axis=1).select_dtypes(exclude=['object']) train_X, test_X, train_y, test_y = train_test_split(X.as_matrix(), y.as_matrix(), test_size=0.25)my_imputer = Imputer() train_X = my_imputer.fit_transform(train_X) test_X = my_imputer.transform(test_X) /opt/conda/lib/python3.6/site-packages/ipykernel_launcher.py:9: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.if __name__ == '__main__': /opt/conda/lib/python3.6/site-packages/sklearn/utils/deprecation.py:58: DeprecationWarning: Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22. Import impute.SimpleImputer from sklearn instead.warnings.warn(msg, category=DeprecationWarning)我們像在scikit-learn建立模型和擬合。
【2】
from xgboost import XGBRegressormy_model = XGBRegressor() # Add silent=True to avoid printing out updates with each cycle my_model.fit(train_X, train_y, verbose=False)我們同樣評估模型并像在scikit-learn中那樣進(jìn)行預(yù)測。
【3】
# make predictions predictions = my_model.predict(test_X)from sklearn.metrics import mean_absolute_error print("Mean Absolute Error : " + str(mean_absolute_error(predictions, test_y))) Mean Absolute Error : 17543.750299657535Model Tuning
XGBoost有一些參數(shù)可以顯著影響您的模型的準(zhǔn)確性和訓(xùn)練速度。您應(yīng)該了解的第一個參數(shù)是:
n_estimators 和 early_stopping_rounds
n_estimators指定完成上述建模周期的次數(shù)。
在欠擬合vs過擬合圖中,n_estimators將您向右移動。值太低會導(dǎo)致欠擬合,這對訓(xùn)練數(shù)據(jù)和新數(shù)據(jù)的預(yù)測都是不準(zhǔn)確的。太大的值會導(dǎo)致過度擬合,這時對訓(xùn)練數(shù)據(jù)的預(yù)測準(zhǔn)確,但對新數(shù)據(jù)的預(yù)測不準(zhǔn)確(這是我們關(guān)心的)。您可以試驗數(shù)據(jù)集以找到理想值。典型值范圍從100到1000,但這很大程度上取決于下面討論的學(xué)習(xí)率。
參數(shù)early_stopping_rounds提供了一種自動查找理想值的方法。過早停止會導(dǎo)致模型在驗證分?jǐn)?shù)停止改善時停止迭代,即使我們不是n_estimators的硬停止。為n_estimators設(shè)置一個高值然后使用early_stopping_rounds找到停止迭代的最佳時間是明智的。
由于隨機機會有時會導(dǎo)致單輪,其中驗證分?jǐn)?shù)沒有提高,因此您需要指定一個數(shù)字,以確定在停止前允許多少輪直線惡化。 early_stopping_rounds = 5是一個合理的值。因此,我們在連續(xù)5輪惡化的驗證分?jǐn)?shù)后停止。
以下是適合early_stopping的代碼:
【4】
my_model = XGBRegressor(n_estimators=1000) my_model.fit(train_X, train_y, early_stopping_rounds=5, eval_set=[(test_X, test_y)], verbose=False) XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,max_depth=3, min_child_weight=1, missing=None, n_estimators=1000,n_jobs=1, nthread=None, objective='reg:linear', random_state=0,reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,silent=True, subsample=1)使用early_stopping_rounds時,您需要留出一些數(shù)據(jù)來檢查要使用的輪數(shù)。 如果您以后想要使用所有數(shù)據(jù)擬合模型,請將n_estimators設(shè)置為在過早停止運行時發(fā)現(xiàn)的最佳值。
learning_rate
對于更好的XGBoost模型,這是一個微妙但重要的技巧:
我們不是通過簡單地將每個組件模型中的預(yù)測相加來獲得預(yù)測,而是將每個模型的預(yù)測乘以一個小數(shù)字,然后再添加它們。這意味著我們添加到集合中的每個樹都會減少我們的預(yù)測。 在實踐中,這降低了模型過度擬合的傾向。
因此,您可以使用更高的n_estimators值而不會過度擬合。 如果使用過早停止,將自動設(shè)置適當(dāng)數(shù)量的樹。
一般來說,較小的學(xué)習(xí)率(以及大量的估算器)將產(chǎn)生更準(zhǔn)確的XGBoost模型,盡管它也會使模型更長時間進(jìn)行訓(xùn)練,因為它在整個循環(huán)中進(jìn)行了更多的迭代。
修改上面的示例以包含學(xué)習(xí)率將產(chǎn)生以下代碼:
【5】
my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05) my_model.fit(train_X, train_y, early_stopping_rounds=5, eval_set=[(test_X, test_y)], verbose=False) XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,colsample_bytree=1, gamma=0, learning_rate=0.05, max_delta_step=0,max_depth=3, min_child_weight=1, missing=None, n_estimators=1000,n_jobs=1, nthread=None, objective='reg:linear', random_state=0,reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,silent=True, subsample=1)n_jobs
在較大數(shù)據(jù)集上需要考慮運行時間,您可以使用并行性來更快地構(gòu)建模型。通常將參數(shù)n_jobs設(shè)置為等于計算機上的核心數(shù)。在較小的數(shù)據(jù)集上,這無濟(jì)于事。
由此產(chǎn)生的模型將不會更好,因此對于擬合時間的微優(yōu)化通常只是分散注意力。但是,它在大型數(shù)據(jù)集中非常有用,否則您將在fit命令期間等待很長時間。
XGBoost有許多其他參數(shù),但這些參數(shù)將消耗更長時間幫助您微調(diào)XGBoost模型以獲得最佳性能。
Conclusion
XGBoost是目前用于在傳統(tǒng)數(shù)據(jù)(也稱為表格或結(jié)構(gòu)數(shù)據(jù))上構(gòu)建精確模型的主要算法。去應(yīng)用它來改進(jìn)你的模型!
Your Turn
使用XGBoost轉(zhuǎn)換你的模型。
使用提前停止為n_estimators找到一個好的值。然后使用所有訓(xùn)練數(shù)據(jù)和n_estimators的值重新估計模型。
完成后,返回學(xué)習(xí)機器學(xué)習(xí),繼續(xù)改進(jìn)。
總結(jié)
- 上一篇: java关键字 valotile_Jav
- 下一篇: 《TCP/IP详解》学习笔记(一):基本