1.什麼是XGBoost

XGBoost是處理標準表格數據(存儲在panda數據流中的數據類型(DataFrames),而不是圖像和視頻等更奇特的數據類型)的領先模型。XGBoost模型主導了Kaggle的許多競賽。

為了得到更高的精度,XGBoost模型比隨機森林等技術需要更多的知識和模型調優。在本教程之後,您將能學習到:

<1>使用XGBoost遵循完整的建模工作流

<2>微調XGBoost模型以獲得最佳性能

XGBoost是梯度增強決策樹(Gradient Boosted Decision Trees)演算法的實現(scikit-learn有該演算法的另一個版本,但XGBoost具有一些技術優勢)。

2.Boost演算法思想:

我們經歷了反覆構建新模型並將它們組合成集成模型的循環。我們通過計算數據集中每個觀測值的誤差來開始這個循環。然後我們建立一個新的模型來預測這些。我們將這個錯誤預測模型中的預測添加到「模型集成」中。

總結:通過使用多個弱模型的組合,構建出一個有強學習能力的集成模型。

3. 房價預測數據集描述

80個輸出特徵

加熱方式:加熱方式,加熱質量控制:加熱質量和狀態,中央空調:中央空調,電氣:電氣系統,一樓一平方英尺,2ndFlrSF:二樓平方英尺,低質量finsf:低質量成品平方英尺(所有樓層),GrLivArea:高於地面的居住面積,BsmtFullBath:地下室全浴室,浴缸:地下室半浴室,全浴室:高檔全浴室,半浴缸:高於標準的半浴缸,卧室:地下室以上的卧室數,廚房:廚房數量,KitchenQual:廚房質量,TotRmsAbvGrd:以上級別房間總數(不含衛生間),功能:家庭功能評級,壁爐:壁爐的數量,FireplaceQu:壁爐質量,GarageType:車庫位置,車庫建好了,車庫裝修:車庫的內部裝修,車庫:車庫容量的大小,車庫面積:車庫面積(平方英尺),GarageQual:車庫質量,GarageCond:車庫條件,PavedDrive:鋪設車道,木甲板:木甲板面積(平方英尺),開放式門廊:開放式門廊面積(平方英尺),圍廊:圍廊面積(平方英尺),3SsnPorch:三季門廊面積(平方英尺),屏風玄關:屏風玄關面積(平方英尺),游泳池面積:游泳池面積的平方英尺,PoolQC:池質量,柵欄,柵欄質量,MiscFeature:其他類別中未包含的雜項特性,雜項功能的$Value,MoSold:月銷售,YrSold:年銷售,銷售類型:銷售類型,銷售條件:銷售條件,

4. XGBoost模型建模流程

import pandas as pd

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import Imputer

#1.讀文件

data = pd.read_csv(../input/train.csv)

data.dropna(axis=0, subset=[SalePrice], inplace=True)

#2切分數據輸入:特徵 輸出:預測目標變數

y = data.SalePrice

X = data.drop([SalePrice], axis=1).select_dtypes(exclude=[object])

#3.切分 訓練集、測試集 切分比例7.5 : 2.5

train_X, test_X, train_y, test_y = train_test_split(X.as_matrix(), y.as_matrix(), test_size=0.25)

#4.空值處理,默認方法:使用特徵列的平均值進行填充

my_imputer = Imputer()

train_X = my_imputer.fit_transform(train_X)

test_X = my_imputer.transform(test_X)

#5.調用XGBoost模型,使用訓練集數據進行訓練(擬合)

from xgboost import XGBRegressor
my_model = XGBRegressor()
# Add silent=True to avoid printing out updates with each cycle
my_model.fit(train_X, train_y, verbose=False)

#6.使用模型對測試集數據進行預測

# make predictions
predictions = my_model.predict(test_X)
#7.對模型的預測結果進行評判(平均絕對誤差)
from sklearn.metrics import mean_absolute_error
print("Mean Absolute Error : " + str(mean_absolute_error(predictions, test_y)))

以上的7個步驟完成了XGBoost模型的級別建模流程。

5.對XGBoot模型進行微調

在上一部分中,XGBoot模型的參數都使用了模型的參數,但默認參數並不是最好的。

n_estimators 為估計器的個數,可以理解為模型對訓練數據的迭代次數。

當對訓練集數據的迭代的次數過少時,在訓練集和測試集的誤差都會很大。即:欠擬合。

當對訓練集數據的迭代的次數過多時,在訓練集中的誤差很小,但是在測試集的誤差會很大,這樣模型對未知數據的預測能力會很差,請不能夠應用。即:過擬合。

estimators 典型值範圍為100-1000,不過這在很大程度上取決於下面討論的學習率(learning_rate)。

early_stopping_rounds提供了一種自動找到理想值的方法。

當我們發現測試集的誤差在下降的過程中,誤差開始持續增大時,即找到了拐點。拐點即為最佳的迭代次數,小於拐點,欠擬合;大於拐點,過擬合。

由於模型迭代具有隨機性。單一輪次,驗證分數的下降會有偶然性,因此我們需要設定一個一個閾值。early_stopping_rounds = 5是一個合理的值。因此,我們在連續5輪驗證分數下降後停止。

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)

learning_rate:如果把建模尋找最佳參數的過程,想像成人走路找東西的過程。那麼estimators 可以理解為走多少步,而learning_rate則可以理解為每一步的大小(步長)。步長大了容易跨過要尋找的東西,步長小了那麼找的過程就細,不容易出錯。但需要更多的步數。

總結:因此我們儘可能設置更大的estimators ,更小的learning_rate。這樣參數的時間會更多,單數精度也會更高。同時,我們需要設定了early_stopping_rounds來保證不會過擬合和欠擬合。

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)

6.結論

XGBoost目前是在傳統數據(也稱為表格或結構數據)上構建精確模型的主流演算法。去應用它來改進你的模型吧!

推薦閱讀:

相关文章