XGBoost+LR融合方案
XGBoost+LR融合方案
这是14年,facebook提出的一种融合方法。他的核心思想是将boosting看作是一个将样本进行非线性变换的方法。那么我们处理特征变换的一般方法有:
- 对于连续的特征:一个简单的非线性变化就是将特征划分到不同的区域(bin),然后再将这些区域的编号看作一个离散的特征来进行训练。这也就是俗称的连续变量离散化方法,这有非常多的方法可以完成这项事情。
- 对于离散的特征:我们可以直接对离散特征做一个笛卡尔积从而得到一系列特征的组合,当然有些组合是没用的,那些没用的组合可以删掉。
而这里我们要介绍的是另一种特征变换的方法,利用boosting来对样本进行离散化的方法。
我们知道对每一个样本,都对应着每颗树上的一个叶子结点,比如说如上图,我们一共训练了2颗树,一共有5个叶子结点,那么我们可以将这5个叶子结点进行编号,然后用1-k ont hot来表示他们的取值,如果x样本在第一颗树中经过映射到达第2个叶子结点,在第二颗树上到达第二棵树上的第一个叶子结点,那么我们就可以得到样本经过变化后的向量为
xgboost中的例子
data(agaricus.train, package='xgboost')
data(agaricus.test, package='xgboost')
dtrain <- xgb.DMatrix(data = agaricus.train$data, label = agaricus.train$label)
dtest <- xgb.DMatrix(data = agaricus.test$data, label = agaricus.test$label)
param <- list(max_depth=2, eta=1, silent=1, objective='binary:logistic')
nround = 4
bst = xgb.train(params = param, data = dtrain, nrounds = nround, nthread = 2)
# Model accuracy without new features
accuracy.before <- sum((predict(bst, agaricus.test$data) >= 0.5) == agaricus.test$label) /
length(agaricus.test$label)
# Convert previous features to one hot encoding
new.features.train <- xgb.create.features(model = bst, agaricus.train$data)
new.features.test <- xgb.create.features(model = bst, agaricus.test$data)
# learning with new features
new.dtrain <- xgb.DMatrix(data = new.features.train, label = agaricus.train$label)
new.dtest <- xgb.DMatrix(data = new.features.test, label = agaricus.test$label)
watchlist <- list(train = new.dtrain)
bst <- xgb.train(params = param, data = new.dtrain, nrounds = nround, nthread = 2)
# Model accuracy with new features
accuracy.after <- sum((predict(bst, new.dtest) >= 0.5) == agaricus.test$label) /
length(agaricus.test$label)
# Here the accuracy was already good and is now perfect.
cat(paste("The accuracy was", accuracy.before, "before adding leaf features and it is now",
accuracy.after, "!\n"))
里面的函数xgb.create.features
就是对样本进行变换的函数。这里面的例子没有用到LR,而是XGB+XGB了,你也可以用LR来做第二次训练。
LightGBM也可以实现类似的效果,我们只要利用predict(X, pred_leaf=True)这个函数就可以,
或者lgb也可以直接用以下这个函数来代替xgb.create.features
:
library(xgboost)
library(Matrix)
lgb.create.features<-function (model, data)
{
pred_with_leaf <- predict(model, data, predleaf = TRUE)
cols <- lapply(as.data.frame(pred_with_leaf), factor)
cBind(data, sparse.model.matrix(~. - 1, cols))
}
github上有一个实现lgb+lr的代码:https://github.com/neal668/LightGBM-GBDT-LR/blob/master/GBFT%2BLR_simple.py
参考资料
作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者a358463121专栏:http://blog.csdn.net/a358463121,如果涉及源代码请注明GitHub地址:https://github.com/358463121/。商业使用请联系作者。
上一篇: 集成学习之bagging、boosting及AdaBoost的实现
下一篇: Android Studio利用按钮实现页面跳转设置背景+获取控件内容+响应Log工具提示信息+Toast消息对话框
推荐阅读
-
详解小程序中h5页面onShow实现及跨页面通信方案
-
JSP显示中文问题的解决方案
-
婴儿湿疹的最佳治疗方案!
-
cmake ios终端下执行提示错误 iOS version not found, tested: [5.0;5.1;6.0;6.1;7.0;8.3]的解决方案
-
xcode8提交ipa失败无法构建版本问题的解决方案
-
VS2010写的程序在自己电脑可以运行、其他电脑上不能运行的解决方案
-
轻量级asp.net ajax解决方案详解
-
Mysql5.6启动内存占用过高解决方案
-
MySQL多线程复制遇到Error_code: 1872的解决方案
-
2021年广西正在筹建的大学:广西民族大学相思湖学院转设方案