Kaggle 的很多比赛中,我们可以看到XGBoost有非常好的表现,那 XGBoost到底是什么以及为什么有这么好的效果,又该如何应用它呢?
XGBoost 所应用的算法就是 gradient boosting decision tree,既可以用于分类也可以用于回归问题中比这上一篇文章对其原理有介绍:http://blog.csdn.net/meihao5/article/details/79507010
而 XGBoost 的特点就是计算速度快,模型表现好,这两点也正是这个项目的目标。
表现快是因为它具有这样的设计:
Parallelization:
训练时可以用所有的 CPU 内核来并行化建树。Distributed Computing :
用分布式计算来训练非常大的模型。Out-of-Core Computing:
对于非常大的数据集还可以进行 Out-of-Core Computing。Cache Optimization of data structures and algorithms:
更好地利用硬件。官方文档可参考:
http://xgboost.readthedocs.io/en/latest/parameter.html
使用XGBoost涉及到大量调参,结合一个完整实例进行分析:
import xgboost as xgb //引入XGBoost
import numpy as np
# 1、xgBoost的基本使用
# 2、自定义损失函数的梯度和二阶导
# 3、binary:logistic/logitraw
# 定义f: theta * x
def log_reg(y_hat, y): #自定义的书损失函数,也可以使用模型自带的损失函数(逻辑损失),如果不知道损失函数的意义,建议先去了解一下
p = 1.0 / (1.0 + np.exp(-y_hat))
g = p - y.get_label()
h = p * (1.0-p)
return g, h
def error_rate(y_hat, y): #自定义误差比例函数
return 'error', float(sum(y.get_label() != (y_hat > 0.5))) / len(y_hat)
if __name__ == "__main__":
# 读取数据
data_train = xgb.DMatrix('agaricus_train.txt')
data_test = xgb.DMatrix('agaricus_test.txt')
# 设置参数
param = {'max_depth': 2, 'eta': 1, 'silent': 1, 'objective': 'binary:logitraw'} # logitraw
# param = {'max_depth': 3, 'eta': 0.3, 'silent': 1, 'objective': 'reg:logistic'}
watchlist = [(data_test, 'eval'), (data_train, 'train')]
n_round = 3
# ,引入模型,是不是很简单.....bst = xgb.train(param, data_train, num_boost_round=n_round, evals=watchlist)
bst = xgb.train(param, data_train, num_boost_round=n_round, evals=watchlist, obj=log_reg, feval=error_rate)
# 计算错误率
y_hat = bst.predict(data_test)
y = data_test.get_label() #获取真实值
print (y_hat) #打印预测值
print (y)
error = sum(y != (y_hat > 0))
error_rate = float(error) / len(y_hat)
print ('样本总数:\t', len(y_hat))
print ('错误数目:\t%4d' % error)
print ('错误率:\t%.5f%%' % (100*error_rate))