xgboost软件包允许构建随机森林(实际上,它选择列的随机子集来选择用于整棵树拆分的变量,而不是点头算法,这与传统算法的版本一样,但是它可以容忍)。但是似乎为了进行回归,只使用了森林中的一棵树(也许是最后一棵树)。
为了确保这一点,请考虑一个标准的玩具示例。
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)
Run Code Online (Sandbox Code Playgroud)
是的,当然,默认版本的xgboost随机森林不使用基尼分数函数,而仅使用MSE;它可以轻松更改。同样,进行这样的验证也是不正确的,依此类推。它不会影响主要问题。不管尝试哪种参数集,与randomForest实现相比,结果都是令人惊讶的糟糕。这也适用于另一个数据集。
有人能暗示这种奇怪的行为吗?当涉及分类任务时,该算法可以按预期工作。
#好吧,所有的树都长出来了,都用来做预测。您可以通过对“预测”功能使用参数“ ntreelimit”进行检查。
主要问题仍然存在:由xgbbost软件包产生的随机森林算法的特定形式有效吗?
交叉验证,参数调整和其他废话与之无关—每个人都可以对代码进行必要的更正,然后看看会发生什么。
您可以像这样指定“目标”选项:
mse = …Run Code Online (Sandbox Code Playgroud)