一、xgboost简介:

  • 全称:eXtreme Gradient Boosting
  • 作者:陈天奇(华盛顿大学博士)
  • 基础:GBDT
  • 所属:boosting迭代型、树类算法。
  • 适用范围:分类、回归
  • 优点:速度快、效果好、能处理大规模数据、支持多种语言、支持自定义损失函数等等。
  • 缺点:算法参数过多,调参负责,对原理不清楚的很难使用好XGBoost。不适合处理超高维特征数据。
  • 项目地址:https://github.com/dmlc/xgboost

二、参数速查

参数分为三类:

  • 通用参数:宏观函数控制。
  • Booster参数:控制每一步的booster(tree/regression)。
  • 学习目标参数:控制训练目标的表现。

参数详细解释

二、回归

from xgboost.sklearn import XGBRegressor
from sklearn.model_selection import ShuffleSplit
import xgboost as xgb xgb_model_ = XGBRegressor(n_thread=8)
cv_split = ShuffleSplit(n_splits = 6,train_size=0.7,test_size=0.2)
xgb_params={'max_depth':[4,5,6,7],
'learning_rate':np.linspace(0.03,0.3,10),
'n_estimators':[100,200]} xgb_search = GridSearchCV(xgb_model_,
param_grid=xgb_params,
scoring='r2',
iid=False,
cv=5)
xgb_search.fit(gbdt_train_data,gbdt_train_label) print(xgb_search.grid_scores_)
print(xgb_search.best_params_)
print(xgb_search.best_score_)

1.xgboost不支持MAE的解决方法

xgboost支持自定义目标函数,但是要求目标函数必须二阶可到,我们必须显示给出梯度(一阶导)和海瑟矩阵(二阶导),但是MAE不可导,

(1)xgboost自带的MSE与MAE相距较远。比较接近的损失有Huber Loss 以及 Fair Loss。

  • MSE
  • Huber Loss
  • Fair Loss:$c^2(\frac{|x|}{c}-ln(\frac{|x|}{c}+1))$
  • Psuedo-Huber loss

  

Fair Loss代码:代码来自solution in the Kaggle Allstate Challenge.

def fair_obj(preds, dtrain):
"""y = c * abs(x) - c**2 * np.log(abs(x)/c + 1)"""
x = preds - dtrain.get_labels()
c = 1
den = abs(x) + c
grad = c*x / den
hess = c*c / den ** 2
return grad, hess

  

Psuedo-Huber loss代码:

import xgboost as xgb

dtrain = xgb.DMatrix(x_train, label=y_train)
dtest = xgb.DMatrix(x_test, label=y_test) param = {'max_depth': 5}
num_round = 10 def huber_approx_obj(preds, dtrain):
d = preds - dtrain.get_labels() #remove .get_labels() for sklearn
h = 1 #h is delta in the graphic
scale = 1 + (d / h) ** 2
scale_sqrt = np.sqrt(scale)
grad = d / scale_sqrt
hess = 1 / scale / scale_sqrt
return grad, hess bst = xgb.train(param, dtrain, num_round, obj=huber_approx_obj)

具体可参考:kaggle 讨论 | Xgboost-How to use “mae” as objective function?

(2)自定义近似MAE导数:直接构造MAE的导数

  • Log-Cosh Loss function:$\left.log(cosh(h(\mathbf{x}_{i})-y_{i}))\right.$,$\left.cosh(x)=\frac{e^{x}+e^{-x}}{2}\right.$

Log-cosh代码如下:

def log_cosh_obj(preds, dtrain):
x = preds - dtrain.get_labels()
grad = np.tanh(x)
hess = 1 / np.cosh(x)**2
return grad, hess  

具体参考:kaggle 讨论

三、分类

 前提:已经处理完所有数据,现在开始训练.

#Import libraries:
import pandas as pd
import numpy as np
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
from sklearn import cross_validation, metrics #Additional scklearn functions
from sklearn.grid_search import GridSearchCV #Perforing grid search import matplotlib.pylab as plt
%matplotlib inline
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 12, 4 train = pd.read_csv('train_modified.csv')
target = 'Disbursed'
IDcol = 'ID'

两种XGBoost:

  • xgb - 直接引用xgboost。接下来会用到其中的“cv”函数。
  • XGBClassifier - 是xgboost的sklearn包。这个包允许我们像GBM一样使用Grid Search 和并行处理。
test_results = pd.read_csv('test_results.csv')
def modelfit(alg, dtrain, dtest, predictors,useTrainCV=True, cv_folds=5, early_stopping_rounds=50):
'''
   功能:训练,测试,输出AUC,画出重要特征的功能
参数:alg是分类器,dtrain是训练集(包括label),dtest是测试集(不包括label),predictors是要参与训练的特征(不包括label),
useTrainCV是是否要交叉验证,cv_folds是交叉验证的折数,early_stopping_rounds是到指定次数就停止继续迭代
'''
if useTrainCV:
xgb_param = alg.get_xgb_params()
xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values)
xgtest = xgb.DMatrix(dtest[predictors].values)
cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,
metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)
alg.set_params(n_estimators=cvresult.shape[0]) #训练
alg.fit(dtrain[predictors], dtrain['Disbursed'],eval_metric='auc') #预测
dtrain_predictions = alg.predict(dtrain[predictors])
dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,1] #输出accuracy、AUC分数
print "\nModel Report"
print "Accuracy : %.4g" % metrics.accuracy_score(dtrain['Disbursed'].values, dtrain_predictions)
print "AUC Score (Train): %f" % metrics.roc_auc_score(dtrain['Disbursed'], dtrain_predprob) #预测测试集,输出测试集的AUC分数
dtest['predprob'] = alg.predict_proba(dtest[predictors])[:,1]
results = test_results.merge(dtest[['ID','predprob']], on='ID')
print 'AUC Score (Test): %f' % metrics.roc_auc_score(results['Disbursed'], results['predprob']) feat_imp = pd.Series(alg.booster().get_fscore()).sort_values(ascending=False)
feat_imp.plot(kind='bar', title='Feature Importances')
plt.ylabel('Feature Importance Score')

注意xgboost的sklearn包没有“feature_importance”这个量度,但是get_fscore()函数有相同的功能。

调参步骤:

  • 选择较高的学习速率(learning rate)。一般情况下,学习速率的值为0.1。但是,对于不同的问题,理想的学习速率有时候会在0.05到0.3之间波动。选择对应于此学习速率的理想决策树数量。XGBoost有一个很有用的函数“cv”,这个函数可以在每一次迭代中使用交叉验证,并返回理想的决策树数量。

  • 对于给定的学习速率和决策树数量,进行决策树特定参数调优(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在确定一棵树的过程中,我们可以选择不同的参数,待会儿我会举例说明。

  • xgboost的正则化参数的调优。(lambda, alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。

  • 降低学习速率,确定理想参数。

初始参数设置:

  • max_depth = 5 :这个参数的取值最好在3-10之间。我选的起始值为5,但是你也可以选择其它的值。起始值在4-6之间都是不错的选择。
  • min_child_weight = 1:在这里选了一个比较小的值,因为这是一个极不平衡的分类问题。因此,某些叶子节点下的值会比较小。
  • gamma = 0: 起始值也可以选其它比较小的值,在0.1到0.2之间就可以。这个参数后继也是要调整的。
  • subsample, colsample_bytree = 0.8: 这个是最常见的初始值了。典型值的范围在0.5-0.9之间。
  • scale_pos_weight = 1: 这个值是因为类别十分不平衡。
  • 注意,上面这些参数的值只是一个初始的估计值,后继需要调优。这里把学习速率就设成默认的0.1。然后用xgboost中的cv函数来确定最佳的决策树数量。前文中的函数可以完成这个工作。

  

参考文献:

【1】XGBoost python调参示例

【2】Complete Guide to Parameter Tuning in XGBoost (with codes in Python)

【3】xgboost调参(很全)

【4】XGBoost参数调优完全指南(附Python代码)

【5】机器学习算法之XGBoost(非常详细)

Xgboost调参总结的更多相关文章

  1. xgboost 调参参考

    XGBoost的参数 XGBoost的作者把所有的参数分成了三类: 1.通用参数:宏观函数控制. 2.Booster参数:控制每一步的booster(tree/regression). 3.学习目标参 ...

  2. 机器学习--Xgboost调参

    Xgboost参数 'booster':'gbtree', 'objective': 'multi:softmax', 多分类的问题 'num_class':10, 类别数,与 multisoftma ...

  3. 【转载】XGBoost调参

    General Parameters: Guide the overall functioning Booster Parameters: Guide the individual booster ( ...

  4. xgboost 调参 !

    https://jessesw.com/XG-Boost/ http://blog.csdn.net/u010414589/article/details/51153310

  5. xgboost调参

    The overall parameters have been divided into 3 categories by XGBoost authors: General Parameters: G ...

  6. xgboost调参过程

    from http://blog.csdn.net/han_xiaoyang/article/details/52665396

  7. xgboost使用调参

    欢迎关注博主主页,学习python视频资源 https://blog.csdn.net/q383700092/article/details/53763328 调参后结果非常理想 from sklea ...

  8. XGBoost和LightGBM的参数以及调参

    一.XGBoost参数解释 XGBoost的参数一共分为三类: 通用参数:宏观函数控制. Booster参数:控制每一步的booster(tree/regression).booster参数一般可以调 ...

  9. 【新人赛】阿里云恶意程序检测 -- 实践记录10.27 - TF-IDF模型调参 / 数据可视化

    TF-IDF模型调参 1. 调TfidfVectorizer的参数 ngram_range, min_df, max_df: 上一篇博客调了ngram_range这个参数,得出了ngram_range ...

随机推荐

  1. python数据类型之字典(二)

    字典的基本操作 键值查找: >>> aInfo = {'Wangdachui':3000,'Niuyun':2000,'Linling':4500,'Tianqi':8000} &g ...

  2. easyui---layout实战

    第一步: <div id="cc" class="easyui-layout" fit=true> <div region="nor ...

  3. 使用ELK收集分析MySQL慢查询日志

    参考文档:https://www.cnblogs.com/bixiaoyu/p/9638505.html MySQL开启慢查询不详述 MySQL5.7慢查询日志格式如下 /usr/local/mysq ...

  4. 洛谷P1433 吃奶酪【dfs】【剪枝】

    题目:https://www.luogu.org/problemnew/show/P1433 题意: 给定n个坐标,要求从(0,0)开始走遍所有点,最少经过的路程. 思路: 刚开始想像数字三角形一样适 ...

  5. C# 调用存储过程 Sql Server存储过程 存储过程报错,程序中的try

    C#程序调用Sql Server存储过程,存储过程中报错情况,返回值... 0.SQL存储过程 USE [Opos] GO /****** Object: StoredProcedure [dbo]. ...

  6. jQuery 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each、data、Ajax

    jQuery jQuery介绍 1.jQuery是一个轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方 ...

  7. MFC实现一元稀疏多项式运算器

    MFC实现一元稀疏多项式运算器 基本要求 输入并建立两个多项式 多项式a与b相加,建立和多项式c 多项式a与b相减,建立差多项式d 输出多项式a, b, c, d.输出格式:比如多项式a为:A(x)= ...

  8. 如何从视频中分离出音乐,和对音乐做分割,合并的处理(瑞典音乐家-新八宝盒.mp3.rar下载)

    点击下载:瑞典音乐家-新八宝盒.mp3.rar 1.工具 Total Video Converter 3.71 视频处理(安装软件,有绿色版的) MP3剪切器 MP3剪切器(小工具) Mp3mateP ...

  9. vim中的ctrl+s导致的“假死”、无响应、不接受输入

    有时候vim看到vim的光标在闪烁,但无法输入任何东西,最后只好结束终端了事. 这种现象,是windows用户在使用vim时经常犯的“错误”.在windows下,为了保护自己的劳动成果,ctrl+s已 ...

  10. iOS引用类型

    强引用, 默认引用类型.被强引用指向的内存不被释放.强引用会对被引用对象的引用计数器+1,从而扩展对象的生命周期. 弱引用, 弱引用是医用特殊的引用类型.它不会增加引用计数器,因而不会扩展对象的生命周 ...