你知道 XGBoost 算法是一种如今在数据科学竞赛的获胜方案很流行的算法吗?html
那么,他比传统的随机森林和神经网络算法强在哪里呢?广义上来讲,它在效率,准确性,可行性都更有优点(接下来咱们将会详细讨论)。node
在最近的几年中,模型预测已经变得愈来愈快速和准确了。我记得我曾花费数个小时在为某个模型构建特征工程上,模型却仅仅提高了几个百分点。git
如今,这些大量困难的问题都被更好的算法所解决。github
从技术上说,XGBoost 是 Extreme Gradient Boosting 的缩写。它的流行源于在著名的Kaggle数据科学竞赛上被称为"奥托分类"的挑战。算法
2015年8月,Xgboost的R包发布,咱们将在本文引用0.4-2版本的xgboost包。segmentfault
在这篇文章中,我讲解释一个简单的方式来使用xgboost在R中。 所以,下次当你创建一个模型时能够考虑一下这个算法。我确信这是一个使人惊艳和幸福的时刻。数组
xgboost 是"极端梯度上升"(Extreme Gradient Boosting)的简称, 它相似于梯度上升框架,可是更加高效。它兼具线性模型求解器和树学习算法。所以,它快速的秘诀在于算法在单机上也能够并行计算的能力。微信
这使得xgboost至少比现有的梯度上升实现有至少10倍的提高。它提供多种目标函数,包括回归,分类和排序。网络
因为它在预测性能上的强大可是相对缓慢的实现,"xgboost" 成为不少比赛的理想选择。
它还有作交叉验证和发现关键变量的额外功能。在优化模型时,这个算法还有很是多的参数须要调整。咱们将在下一个章节讨论这些因素。框架
XGBoost仅适用于数值型向量。是的!你须要使用中区分数据类型。
所以,您须要将全部其余形式的数据转换为数值型向量。一个简单的方法将类别变量转换成数值向量是一个"独热编码"。这个词源于数字电路语言,这意味着一个数组的二进制信号,只有合法的值是0和1。
在R中,一个独热编码很是简单。这一步(以下所示)会在每个可能值的变量使用标志创建一个稀疏矩阵。稀疏矩阵是一个矩阵的零的值。稀疏矩阵是一个大多数值为零的矩阵。相反,一个稠密矩阵是大多数值非零的矩阵。
假设,你有一个叫“竞选”的数据集,除了反应变量,想将全部分类变量转换成一些标志。以下所示:
sparse_matrix <- Matrix::sparse.model.matrix(response ~ .-1, data = campaign)
如今让咱们分解这个代码以下:
sparse.model.matrix
这条命令的圆括号里面包含了全部其余输入参数。想要转化目标变量,你可使用下面的代码:
output_vector = df[,response] == "Responder"
代码解释:
可使用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, seed = 1, eval_metric = "merror", objective = "multi:softprob", num_class = 12, nthread = 3 )
您如今有了一个对象“xgb”,这是一个xgboost模型。下面是是如何评分测试数量:
# 在测试集预测的值 y_pred <- predict(xgb, data.matrix(X_test[,-1]))
我明白,如今,你会很是好奇地想知道用于xgboost模型的各类参数。它有三种类型的参数:通用参数、辅助参数和任务参数。
让咱们详细了解这些参数。我须要你注意,这是实现xgboost算法最关键的部分:
具体参数树状图:
更大,更保守的算法。范围是0到∞。γ越大算法越保守。
若是它被设置为一个正值,它能够帮助更新步骤更为保守。一般不须要此参数,可是在逻辑回归中当分类是极为不均衡时须要用到。将其设置为1 - 10的价值可能有助于控制更新。参数范围是0到∞。
设置为0.5意味着XGBoost随机收集一半的数据实例来生成树来防止过分拟合。参数范围是0到1。
与其余机器学习技术相比,我发现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专栏: https://segmentfault.com/blog...,若是涉及源代码请注明GitHub地址: https://github.com/harryprince。微信号: harryzhustudio 商业使用请联系做者。