Kaggle学习笔记--XGBoost
Kaggle學(xué)習(xí)筆記--XGBoost
- 簡介
- XGBoost是什么
- 梯度提升XGBoost是一種通過循環(huán)迭代的將模型添加到集合中的方法
- XGBoost 的優(yōu)點(diǎn)
- 數(shù)據(jù)加載
- 步驟1:創(chuàng)建XGBoost模型
- 步驟2:改進(jìn)模型(1)——獲得更低的MAE
- 步驟3:改進(jìn)模型(2)——獲得更高的MAE
- 總結(jié)
課程原文:https://www.kaggle.com/alexisbcook/xgboost
簡介
XGBoost是什么
Xgboost是Boosting算法的其中一種,Boosting算法的思想是將許多弱分類器集成在一起,形成一個(gè)強(qiáng)分類器。因?yàn)閄gboost是一種提升樹模型,所以它是將許多樹模型集成在一起,形成一個(gè)很強(qiáng)的分類器。而所用到的樹模型則是CART回歸樹模型。Xgboost是在GBDT的基礎(chǔ)上進(jìn)行改進(jìn),使之更強(qiáng)大,適用于更大范圍。
【詳細(xì)介紹 https://www.cnblogs.com/wj-1314/p/9402324.html】
梯度提升XGBoost是一種通過循環(huán)迭代的將模型添加到集合中的方法
1.首先從用單個(gè)模型初始化集合開始,其預(yù)測(cè)結(jié)果可能很天真.(即使其預(yù)測(cè)非常不準(zhǔn)確,隨后對(duì)該集合進(jìn)行的添加也將修正這些錯(cuò)誤。)
2.然后,開始循環(huán):
首先使用當(dāng)前集合為數(shù)據(jù)集中的每個(gè)觀測(cè)值生成預(yù)測(cè)。為了做出預(yù)測(cè),將集合中所有模型的預(yù)測(cè)值相加。這些預(yù)測(cè)用于計(jì)算損失函數(shù)(例如,均方誤差)。
然后,使用損失函數(shù)來擬合將要添加到集合中的新模型。具體來說,我們確定了模型參數(shù),所以將此新模型添加到集合中將減少損失。 (附帶說明:“梯度增強(qiáng)”中的“梯度”是指對(duì)損失函數(shù)使用梯度下降【gradient descent】來確定此新模型中的參數(shù)。)
3.最后,將新模型添加到集合中,并重復(fù)上述操作!
XGBoost 的優(yōu)點(diǎn)
1.正則化
XGBoost在代價(jià)函數(shù)里加入了正則項(xiàng),用于控制模型的復(fù)雜度。正則項(xiàng)里包含了樹的葉子節(jié)點(diǎn)個(gè)數(shù)、每個(gè)葉子節(jié)點(diǎn)上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項(xiàng)降低了模型的variance,使學(xué)習(xí)出來的模型更加簡單,防止過擬合,這也是xgboost優(yōu)于傳統(tǒng)GBDT的一個(gè)特性。
2. 并行處理
XGBoost工具支持并行。Boosting不是一種串行的結(jié)構(gòu)嗎?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能進(jìn)行下一次迭代的(第t次迭代的代價(jià)函數(shù)里包含了前面t-1次迭代的預(yù)測(cè)值)。XGBoost的并行是在特征粒度上的。
我們知道,決策樹的學(xué)習(xí)最耗時(shí)的一個(gè)步驟就是對(duì)特征的值進(jìn)行排序(因?yàn)橐_定最佳分割點(diǎn)),XGBoost在訓(xùn)練之前,預(yù)先對(duì)數(shù)據(jù)進(jìn)行了排序,然后保存為block結(jié)構(gòu),后面的迭代中重復(fù)地使用這個(gè)結(jié)構(gòu),大大減小計(jì)算量。這個(gè)block結(jié)構(gòu)也使得并行成為了可能,在進(jìn)行節(jié)點(diǎn)的分裂時(shí),需要計(jì)算每個(gè)特征的增益,最終選增益最大的那個(gè)特征去做分裂,那么各個(gè)特征的增益計(jì)算就可以開多線程進(jìn)行。
3. 靈活性
XGBoost支持用戶自定義目標(biāo)函數(shù)和評(píng)估函數(shù),只要目標(biāo)函數(shù)二階可導(dǎo)就行。
4. 缺失值處理
對(duì)于特征的值有缺失的樣本,xgboost可以自動(dòng)學(xué)習(xí)出它的分裂方向
5. 剪枝
XGBoost 先從頂?shù)降捉⑺锌梢越⒌淖訕?#xff0c;再從底到頂反向進(jìn)行剪枝。比起GBM,這樣不容易陷入局部最優(yōu)解。
6. 內(nèi)置交叉驗(yàn)證
XGBoost允許在每一輪boosting迭代中使用交叉驗(yàn)證。因此,可以方便地獲得最優(yōu)boosting迭代次數(shù)。而GBM使用網(wǎng)格搜索,只能檢測(cè)有限個(gè)值。
【原文鏈接:https://blog.csdn.net/luanpeng825485697/article/details/79907149.】
數(shù)據(jù)加載
import pandas as pd from sklearn.model_selection import train_test_split# Read the data X = pd.read_csv('.../train.csv', index_col='Id') X_test_full = pd.read_csv('.../test.csv', index_col='Id')# Remove rows with missing target, separate target from predictors X.dropna(axis=0, subset=['SalePrice'], inplace=True) y = X.SalePrice X.drop(['SalePrice'], axis=1, inplace=True)# Break off validation set from training data X_train_full, X_valid_full, y_train, y_valid = train_test_split(X, y, train_size=0.8, test_size=0.2,random_state=0)# "Cardinality" means the number of unique values in a column # Select categorical columns with relatively low cardinality (convenient but arbitrary) low_cardinality_cols = [cname for cname in X_train_full.columns if X_train_full[cname].nunique() < 10 andX_train_full[cname].dtype == "object"]# Select numeric columns numeric_cols = [cname for cname in X_train_full.columns if X_train_full[cname].dtype in ['int64', 'float64']]# Keep selected columns only my_cols = low_cardinality_cols + numeric_cols X_train = X_train_full[my_cols].copy() X_valid = X_valid_full[my_cols].copy() X_test = X_test_full[my_cols].copy()# One-hot encode the data (to shorten the code, we use pandas) X_train = pd.get_dummies(X_train) X_valid = pd.get_dummies(X_valid) X_test = pd.get_dummies(X_test) X_train, X_valid = X_train.align(X_valid, join='left', axis=1) X_train, X_test = X_train.align(X_test, join='left', axis=1)步驟1:創(chuàng)建XGBoost模型
XGBoost(xgboost.XGBRegressor)導(dǎo)入scikit-learn API。這使得能夠像在scikit-learn中一樣構(gòu)建和擬合模型。 XGBRegressor類具有許多可調(diào)參數(shù)
具體步驟如下:
1.首先將“ my_model_1”設(shè)置為XGBoost模型。
2.使用XGBRegressor類,并將隨機(jī)種子設(shè)置為0(random_state = 0)。 將所有其他參數(shù)保留為默認(rèn)值。
3.將模型擬合到X_train和y_train中的訓(xùn)練數(shù)據(jù)。
4.最后,使用mean_absolute_error()函數(shù)來計(jì)算與驗(yàn)證集的預(yù)測(cè)相對(duì)應(yīng)的平均絕對(duì)誤差(MAE)。 其中驗(yàn)證數(shù)據(jù)的標(biāo)簽存儲(chǔ)在y_valid中。
Mean Absolute Error: 16803.434690710616
步驟2:改進(jìn)模型(1)——獲得更低的MAE
1.將my_model_2設(shè)置為XGBoost模型。例設(shè)置n_estimators和learning_rate參數(shù)以獲得更好的結(jié)果。
2.將模型擬合到X_train和y_train中的訓(xùn)練數(shù)據(jù)。
3.將“ predictions_2”設(shè)置為模型對(duì)驗(yàn)證數(shù)據(jù)的預(yù)測(cè)。驗(yàn)證功能存儲(chǔ)在X_valid中。
4.最后,使用mean_absolute_error()函數(shù)來計(jì)算與驗(yàn)證集上的預(yù)測(cè)相對(duì)應(yīng)的平均絕對(duì)誤差(MAE)。驗(yàn)證數(shù)據(jù)的標(biāo)簽存儲(chǔ)在y_valid中。
Mean Absolute Error: 15875.706670055652
步驟3:改進(jìn)模型(2)——獲得更高的MAE
1.將my_model_3設(shè)置為XGBoost模型。修改n_estimators和learning_rate參數(shù)以獲得更差的結(jié)果。
2.將模型擬合到X_train和y_train中的訓(xùn)練數(shù)據(jù)。
3.將“ predictions_3”設(shè)置為模型對(duì)驗(yàn)證數(shù)據(jù)的預(yù)測(cè)。驗(yàn)證功能存儲(chǔ)在X_valid中。
4.最后,使用mean_absolute_error()函數(shù)來計(jì)算與驗(yàn)證集上的預(yù)測(cè)相對(duì)應(yīng)的平均絕對(duì)誤差(MAE)。驗(yàn)證數(shù)據(jù)的標(biāo)簽存儲(chǔ)在y_valid中。
Mean Absolute Error: 21031.549991973458
總結(jié)
通過修改XGBRegressor中n_estimators和learning_rate的參數(shù)的值,從而獲得更好或者更差的結(jié)果。通過多次嘗試可找出針對(duì)本模型MAE的變化規(guī)律:
n_estimators越大 learning_rate越小 模型效果越好
n_estimators越小,learning_rate越大 模型效果越差
從而獲得更優(yōu)秀的訓(xùn)練模型。
【鏈接】:XGBRegressor 參數(shù)調(diào)優(yōu)
總結(jié)
以上是生活随笔為你收集整理的Kaggle学习笔记--XGBoost的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 威斯康星大学计算机专业找工作,威斯康星麦
- 下一篇: UOJ#196. 【ZJOI2016】线