包允许构建随机森林(实际上,它选择一个随机列子集来选择整棵树中的变量分裂,而不是像经典版本的算法一样对于每个节点都随机选择,但这可以被容忍)。但似乎对于回归问题,只有森林中的一棵树(可能是最后一棵建立的)被使用。
当然,xgboost随机森林的默认版本使用的不是Gini得分函数,而只是MSE;这很容易改变。此外,这样的验证是不正确的,它不会影响主要问题。无论试用哪种参数集,与randomForest实现相比,结果都出奇的差。这对于其他数据集也同样适用。
有人能提供一些关于这种奇怪行为的提示吗?当涉及到分类任务时,算法确实按预期工作。
好吧,所有树木都生长了,同时用于进行预测。您可以使用“predict”函数的“ntree_limit”参数来检查该过程。
主要问题仍然存在:xgbbost软件包生成的Random Forest算法的特定形式是否有效?
交叉验证、参数调整和其他乱七八糟的事情与此无关--每个人都可以向代码添加必要的更正并观察结果。
您可以像这样指定'objective'选项:
为了确保这一点,考虑一个标准的玩具示例。
library(xgboost)
library(randomForest)
data(agaricus.train, package = 'xgboost')
dtrain = xgb.DMatrix(agaricus.train$data,
label = agaricus.train$label)
bst = xgb.train(data = dtrain,
nround = 1,
subsample = 0.8,
colsample_bytree = 0.5,
num_parallel_tree = 100,
verbose = 2,
max_depth = 12)
answer1 = predict(bst, dtrain);
(answer1 - agaricus.train$label) %*% (answer1 - agaricus.train$label)
forest = randomForest(x = as.matrix(agaricus.train$data), y = agaricus.train$label, ntree = 50)
answer2 = predict(forest, as.matrix(agaricus.train$data))
(answer2 - agaricus.train$label) %*% (answer2 - agaricus.train$label)
当然,xgboost随机森林的默认版本使用的不是Gini得分函数,而只是MSE;这很容易改变。此外,这样的验证是不正确的,它不会影响主要问题。无论试用哪种参数集,与randomForest实现相比,结果都出奇的差。这对于其他数据集也同样适用。
有人能提供一些关于这种奇怪行为的提示吗?当涉及到分类任务时,算法确实按预期工作。
好吧,所有树木都生长了,同时用于进行预测。您可以使用“predict”函数的“ntree_limit”参数来检查该过程。
主要问题仍然存在:xgbbost软件包生成的Random Forest算法的特定形式是否有效?
交叉验证、参数调整和其他乱七八糟的事情与此无关--每个人都可以向代码添加必要的更正并观察结果。
您可以像这样指定'objective'选项:
mse = function(predict, dtrain)
{
real = getinfo(dtrain, 'label')
return(list(grad = 2 * (predict - real),
hess = rep(2, length(real))))
}
在选择分裂变量时,建议使用MSE。即使如此,与randomForest相比结果仍然出奇的差。
也许问题是学术性质的,涉及到随机选择特征子集以进行分割的方式。经典实现为每个分割单独选择一组特征子集(大小由randomForest软件包的'mtry'指定),而xgboost实现为每棵树选择一个特征子集(由'colsample_bytree'指定)。
因此,这种微小差别似乎对某些类型的数据集非常重要。确实很有趣。