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目前是在传统数据(也称为表格或结构数据)上构建精确模型的主流演算法。去应用它来改进你的模型吧!

推荐阅读:

相关文章