xgboostxgboost 变量重要性性是怎么算的

[译]快速上手:在R中使用XGBoost算法 - 简书
[译]快速上手:在R中使用XGBoost算法
你知道 XGBoost 算法是一种现在在数据科学竞赛的获胜方案很流行的算法吗?
那么,他比传统的随机森林和神经网络算法强在哪里呢?广义上来说,它在效率,准确性,可行性都更有优势(接下来我们将会详细讨论)。
在最近的几年中,模型预测已经变得越来越快速和准确了。我记得我曾花费数个小时在为某个模型构建特征工程上,模型却仅仅提升了几个百分点。现在,这些大量困难的问题都被更好的算法所解决。
从技术上说,XGBoost 是 Extreme Gradient Boosting 的缩写。它的流行源于在著名的Kaggle数据科学竞赛上被称为"奥托分类"的挑战。
2015年8月,Xgboost的R包发布,我们将在本文引用0.4-2版本的xgboost包。
在这篇文章中,我讲解释一个简单的方式来使用xgboost在R中。 因此,下次当你建立一个模型时可以考虑一下这个算法。我确信这是一个令人惊艳和幸福的时刻。
什么是 XGBoost?
xgboost 是"极端梯度上升"(Extreme Gradient Boosting)的简称, 它类似于梯度上升框架,但是更加高效。它兼具线性模型求解器和树学习算法。因此,它快速的秘诀在于算法在单机上也可以并行计算的能力。
这使得xgboost至少比现有的梯度上升实现有至少10倍的提升。它提供多种目标函数,包括回归,分类和排序。
由于它在预测性能上的强大但是相对缓慢的实现,"xgboost" 成为很多比赛的理想选择。它还有做交叉验证和发现关键变量的额外功能。在优化模型时,这个算法还有非常多的参数需要调整。我们将在下一个章节讨论这些因素。
使用XGBoost数据的准备
XGBoost仅适用于数值型向量。是的!你需要使用中区分数据类型。
因此,您需要将所有其他形式的数据转换为数值型向量。一个简单的方法将类别变量转换成数值向量是一个"独热编码"。这个词源于数字电路语言,这意味着一个数组的二进制信号,只有合法的值是0和1。
在R中,一个独热编码非常简单。这一步(如下所示)会在每一个可能值的变量使用标志建立一个稀疏矩阵。稀疏矩阵是一个矩阵的零的值。稀疏矩阵是一个大多数值为零的矩阵。相反,一个稠密矩阵是大多数值非零的矩阵。
假设,你有一个叫“竞选”的数据集,除了反应变量,想将所有分类变量转换成一些标志。如下所示:
sparse_matrix &- sparse.model.matrix(response ~ .-1, data = campaign)
现在让我们分解这个代码如下:
“sparse.model。matrix”这条命令的圆括号里面包含了所有其他输入参数。
参数“反应”说这句话应该忽略“响应”变量。
“-1”意味着该命令会删除矩阵的第一列。
最后你需要指定数据集名称。
想要转化目标变量,你可以使用下面的代码:
output_vector = df[,response] == "Responder"
代码解释:
设 output_vector 初值为0。
在 output_vector 中,将响应变量的值为 "Responder" 的数值设为1;
返回 output_vector。
在R中运用Xgboost建立模型
可以使用xgboost破解任何数据问题,下面是简单的步骤:
第一步:加载的所有库
library(xgboost)
library(readr)
library(stringr)
library(caret)
library(car)
第二步:加载数据集
(这里我用一个银行的数据,我们需要找到一个客户是否有资格获得贷款)。
set.seed(100)
setwd("C:\\Users\\ts93856\\Desktop\\datasource")
# 加载数据
df_train = read_csv("train_users_2.csv")
df_test = read_csv("test_users.csv")
# 加载标签的训练数据
labels = df_train['labels']
df_train = df_train[-grep('labels', colnames(df_train))]
# combine train and test data
df_all = rbind(df_train,df_test)
第三步:数据清洗和特征工程
# 清洗变量 :
这里我筛选出年龄不到14岁或超过100的人
df_all[df_all$age & 14 | df_all$age & 100,'age'] &- -1
df_all$age[df_all$age & 0] &- mean(df_all$age[df_all$age & 0])
# 独热编码分类特征
ohe_feats = c('gender', 'education', 'employer')
dummies &- dummyVars(~ gender +
education + employer, data = df_all)
df_all_ohe &- as.data.frame(predict(dummies, newdata = df_all))
df_all_combined &- cbind(df_all[,-c(which(colnames(df_all) %in% ohe_feats))],df_all_ohe)df_all_combined$agena &- as.factor(ifelse(df_all_combined$age & 0,1,0))
我在 “feature_selected” 中为模型提供一组变量可供使用。本文后面会分享我在选择变量中一个快速又巧妙的方法。
df_all_combined &- df_all_combined[,c('id',features_selected)]
# split train and test
X = df_all_combined[df_all_combined$id %in% df_train$id,]
y &- recode(labels$labels,"'True'=1; 'False'=0)
X_test = df_all_combined[df_all_combined$id %in% df_test$id,]
第四步:调整和运行模式
xgb &- xgboost(data = data.matrix(X[,-1]),
label = y,
eta = 0.1,
max_depth = 15,
nround=25,
subsample = 0.5,
colsample_bytree = 0.5,
eval_metric = "merror",
objective = "multi:softprob",
num_class = 12,
nthread = 3
第五步:测试分数
您现在有了一个对象“xgb”,这是一个xgboost模型。下面是是如何评分测试数量:
# 在测试集预测的值
y_pred &- predict(xgb, data.matrix(X_test[,-1]))
在 Xgboost 中使用参数
我明白,现在,你会非常好奇地想知道用于xgboost模型的各种参数。它有三种类型的参数:通用参数、辅助参数和任务参数。
通用参数为我们提供在上升过程中选择哪种上升模型。常用的是树或线性模型。
辅助参数取决于你选择的上升模型。
任务参数,决定学习场景,例如,回归任务在排序任务中可能使用不同的参数。
让我们详细了解这些参数。我需要你注意,这是实现xgboost算法最关键的部分:
silent : 默认值是0。您需要指定0连续打印消息,静默模式1。
booster : 默认值是gbtree。你需要指定要使用的上升模型:gbtree(树)或gblinear(线性函数)。
num_pbuffer : 这是由xgboost自动设置,不需要由用户设定。阅读的更多细节。
num_feature : 这是由xgboost自动设置,不需要由用户设定。
具体参数树状图:
eta:默认值设置为0.3。您需要指定用于更新步长收缩来防止过度拟合。每个提升步骤后,我们可以直接获得新特性的权重。实际上 eta 收缩特征权重的提高过程更为保守。范围是0到1。低η值意味着模型过度拟合更健壮。
gamma:默认值设置为0。您需要指定最小损失减少应进一步划分树的叶节点。更大,更保守的算法。范围是0到∞。γ越大算法越保守。
max_depth:默认值设置为6。您需要指定一个树的最大深度。参数范围是1到∞。
min_child_weight:默认值设置为1。您需要在子树中指定最小的(海塞)实例权重的和,然后这个构建过程将放弃进一步的分割。在线性回归模式中,在每个节点最少所需实例数量将简单的同时部署。更大,更保守的算法。参数范围是0到∞。
max_delta_step:默认值设置为0。max_delta_step 允许我们估计每棵树的权重。如果该值设置为0,这意味着没有约束。如果它被设置为一个正值,它可以帮助更新步骤更为保守。通常不需要此参数,但是在逻辑回归中当分类是极为不均衡时需要用到。将其设置为1 - 10的价值可能有助于控制更新。参数范围是0到∞。
subsample: 默认值设置为1。您需要指定训练实例的子样品比。设置为0.5意味着XGBoost随机收集一半的数据实例来生成树来防止过度拟合。参数范围是0到1。
colsample_bytree : 默认值设置为1。在构建每棵树时,您需要指定列的子样品比。范围是0到1。
线性上升具体参数
lambda and alpha : 这些都是正则化项权重。λ默认值假设是1和α= 0。
lambda_bias : L2正则化项在偏差上的默认值为0。
base_score : 默认值设置为0.5。您需要指定初始预测分数作为全局偏差。
objective : 默认值设置为reg:linear。您需要指定你想要的类型的学习者,包括线性回归、逻辑回归、泊松回归等。
eval_metric : 您需要指定验证数据的评估指标,一个默认的指标分配根据客观(rmse回归,错误分类,意味着平均精度等级
seed : 随机数种子,确保重现数据相同的输出。
xgboost的高级函数性
与其他机器学习技术相比,我发现xgboost很简单的实现。如果你做了所有我们所做的,直到现在,你已经有了一个模型。
让我们进一步尝试找出模型中重要的变量并且缩小我们变量列表。
#让我们开始寻找实际的树是什么样子吧
model &- xgb.dump(xgb, with.stats = T)
model[1:10] #This statement prints top 10 nodes of the model
# 获得特征的真实名称
names &- dimnames(data.matrix(X[,-1]))[[2]]
# 计算特征重要性矩阵
importance_matrix &- xgb.importance(names, model = xgb)
xgb.plot.importance(importance_matrix[1:10,])
# 在最后一步如果失效可能是因为版本问题,你可以尝试:
barplot(importance_matrix[,1])
可以观察到,许多变量是不值得使用到我们的模型中。您可以方便地删除这些变量并再次运行模型。这一次你可以期待一个更好的精度。
测试结果是否有意义
假设年龄为从上面的分析是最重要的变量,这是一个简单的卡方检验,来检验它是否是真正重要的变量。
test &- chisq.test(train$Age, output_vector)
print(test)
我们可以对所有重要变量做相同的处理。这将显示出模型是否准确地识别所有可能的重要变量。
通过本文,您可以构建一个简单的xgboost模型。对比其他类似的模型这个算法的速度将会令你感到惊奇。本文已经讨论了在R中使用xgboost算法各个方面的情况, 最重要的是你必须将你的数据类型转换成数值型,否则该算法不能工作。
我建议你注意这些参数,它们会决定任何模型的成败。如果你仍然发现这些参数很难理解,可以在评论区留言讨论。
作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者 Harry Zhu 的 FinanceR专栏:: harryzhustudio商业使用请联系作者。
FinanceR 是一个和金融与R语言相关的技术专栏,主要话题包括组合优化、风险管理和量化研究...您还没有登录,快捷通道只有在登录后才能使用。 还没有帐号? 赶紧
python xgboost中的两个问题
在线时间5小时
&&发表于: 02-14
有人知道DMatrix里面那个label是什么吗&训练的时候目标值放哪里呀
在线时间2166小时
&&发表于: 02-14
楼主您好,&&欢迎来到阿里云论坛。&&看起来,您提的问题,很“不常见”喔,xgboost是这个东东吗?
Debian 是一个自由的操作系统 (OS),提供您安装在计算机上使用。操作系统就是能让您的计算机工作的一系列基本程序和实用工具。
在线时间5小时
&&发表于: 02-15
回 1楼dongshan8的帖子
是个决策树,没人知道就算了
在线时间2166小时
&&发表于: 02-15
回 2楼(wpydcr) 的帖子
您好,&&好的,抱歉,我对这个“决策树”是不了解。
Debian 是一个自由的操作系统 (OS),提供您安装在计算机上使用。操作系统就是能让您的计算机工作的一系列基本程序和实用工具。
访问内容超出本站范围,不能确定是否安全
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
您目前还是游客,请
验证问题: 27 + 14 = ?
&回复后跳转到最后一页 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
基于xgboost方法的实体零售业销售额预测研究
下载积分:1000
内容提示:基于xgboost方法的实体零售业销售额预测研究
文档格式:PDF|
浏览次数:21|
上传日期: 20:23:14|
文档星级:
该用户还上传了这些文档
基于xgboost方法的实体零售业销售额预测研究
官方公共微信}

我要回帖

更多关于 xgboost 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信