gpt4 book ai didi

r - xgboost 包和随机森林回归

转载 作者:行者123 更新时间:2023-12-04 19:02:20 34 4
gpt4 key购买 nike

xgboost 包允许构建一个随机森林(实际上,它选择列的随机子集来为整棵树的 split 选择一个变量,而不是为了点头,因为它是算法的经典版本,但它可以忍受)。但是对于回归,似乎只使用了森林中的一棵树(也许是最后一棵树)。

为了确保这一点,请考虑一个标准的玩具示例。

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 实现相比,无论尝试哪些参数集,结果都非常糟糕。这也适用于其他数据集。

有人可以提供有关这种奇怪行为的提示吗?当涉及到分类任务时,算法确实按预期工作。

#

嗯,所有的树都长出来了,所有的树都被用来做预测。您可以检查使用参数 'ntreelimit' 的 'predict' 函数。

主要问题仍然存在:xgbbost包产生的随机森林算法的具体形式是否有效?

交叉验证、参数调整和其他废话与此无关——每个人都可以向代码添加必要的更正,看看会发生什么。

您可以像这样指定 'objective' 选项:
mse = function(predict, dtrain)
{
real = getinfo(dtrain, 'label')
return(list(grad = 2 * (predict - real),
hess = rep(2, length(real))))
}

这使您可以在为拆分选择变量时使用 MSE。即使在那之后,与 randomForest 的结果相比,结果也出人意料地糟糕。

也许,问题是学术性质的,涉及如何选择随机特征子集进行分割的方式。经典实现为每个单独的拆分选择一个特征子集(用 'mtry' 为 randomForest 包指定大小),而 xgboost 实现为树选择一个子集(用 'colsample_bytree' 指定)。

因此,这种细微差别似乎非常重要,至少对于某些类型的数据集而言。确实很有趣。

最佳答案

xgboost(随机森林风格)确实使用不止一棵树来预测。但还有许多其他差异需要探索。

我自己是 xgboost 的新手,但很好奇。所以我写了下面的代码来可视化树。您可以自己运行代码以验证或探索其他差异。

您选择的数据集是一个分类问题,因为标签是 0 或 1。我喜欢切换到一个简单的回归问题来可视化 xgboost 的作用。

真实模型:$y = x_1 * x_2$ + 噪声

如果您训练单棵树或多棵树,通过下面的代码示例,您会观察到学习的模型结构确实包含更多树。您不能仅从预测准确性来争论训练了多少棵树。

也许预测不同是因为实现不同。我所知道的大约 5 个 RF 实现中没有一个是完全相同的,并且这个 xgboost(rf 样式)与一个遥远的“表亲”最接近。

我观察 colsample_bytree 不等于 mtry ,因为前者对整个树使用相同的变量/列子集。我的回归问题只是一个大的交互,如果树只使用 就无法学习。 x1 x2 .因此在这种情况下 colsample_bytree 必须设置为 1 才能在所有树中使用这两个变量。常规 RF 可以使用 mtry=1 对这个问题进行建模,因为每个节点将使用 X1 X2

我看到您的 randomForest 预测没有经过现成的交叉验证。如果对预测得出任何结论,您必须进行交叉验证,尤其是对于完全生长的树木。

注意您需要修复函数 vec.plot 因为它不支持开箱即用的 xgboost,因为其他一些框中的 xgboost 不会将 data.frame 作为有效输入。 代码中的说明应该很清楚

library(xgboost)
library(rgl)
library(forestFloor)
Data = data.frame(replicate(2,rnorm(5000)))
Data$y = Data$X1*Data$X2 + rnorm(5000)*.5
gradientByTarget =fcol(Data,3)
plot3d(Data,col=gradientByTarget) #true data structure

fix(vec.plot) #change these two line in the function, as xgboost do not support data.frame
#16# yhat.vec = predict(model, as.matrix(Xtest.vec))
#21# yhat.obs = predict(model, as.matrix(Xtest.obs))

#1 single deep tree
xgb.model = xgboost(data = as.matrix(Data[,1:2]),label=Data$y,
nrounds=1,params = list(max.depth=250))
vec.plot(xgb.model,as.matrix(Data[,1:2]),1:2,col=gradientByTarget,grid=200)
plot(Data$y,predict(xgb.model,as.matrix(Data[,1:2])),col=gradientByTarget)
#clearly just one tree

#100 trees (gbm boosting)
xgb.model = xgboost(data = as.matrix(Data[,1:2]),label=Data$y,
nrounds=100,params = list(max.depth=16,eta=.5,subsample=.6))
vec.plot(xgb.model,as.matrix(Data[,1:2]),1:2,col=gradientByTarget)
plot(Data$y,predict(xgb.model,as.matrix(Data[,1:2])),col=gradientByTarget) ##predictions are not OOB cross-validated!


#20 shallow trees (bagging)
xgb.model = xgboost(data = as.matrix(Data[,1:2]),label=Data$y,
nrounds=1,params = list(max.depth=250,
num_parallel_tree=20,colsample_bytree = .5, subsample = .5))
vec.plot(xgb.model,as.matrix(Data[,1:2]),1:2,col=gradientByTarget) #bagged mix of trees
plot(Data$y,predict(xgb.model,as.matrix(Data[,1:2]))) #terrible fit!!
#problem, colsample_bytree is NOT mtry as columns are only sampled once
# (this could be raised as an issue on their github page, that this does not mimic RF)


#20 deep tree (bagging), no column limitation
xgb.model = xgboost(data = as.matrix(Data[,1:2]),label=Data$y,
nrounds=1,params = list(max.depth=500,
num_parallel_tree=200,colsample_bytree = 1, subsample = .5))
vec.plot(xgb.model,as.matrix(Data[,1:2]),1:2,col=gradientByTarget) #boosted mix of trees
plot(Data$y,predict(xgb.model,as.matrix(Data[,1:2])))
#voila model can fit data

关于r - xgboost 包和随机森林回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34874395/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com