首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机森林中的“方差解释”与XGBoost中的"merror“有什么区别?

随机森林中的“方差解释”与XGBoost中的"merror“有什么区别?
EN

Stack Overflow用户
提问于 2017-10-20 11:07:13
回答 1查看 2.6K关注 0票数 0

我一直在想写在标题上的一个话题。

实际上,我尝试了两个库来预测,并得到了一个结果,但我不知道两个分数是否相同。

这是一个结果的样本。

代码语言:javascript
复制
XGBoost>>
train-merror:0.718701   

据我所知,merror是错误的预测分数。因此,真正的预测得分是1 - 0.718701 = 0.281299

这意味着我所建立的模型可以预测出大约28%的正确结果。

代码语言:javascript
复制
Random Forest>>
variance explained : 0.301

像上面这样的样本,是否有可能解释RF的预测评分优于XGBoost的结果?

事实上,我希望知道variance explainedmerror是否相同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-20 11:58:02

方差解释和XGBoost的merror不一样。它们与非常不同的统计概念有关。

  1. merror是多类分类错误率。它被计算为(#错误的情况)/ (#所有的情况),参见例如XGBoost R包装手册。在二进制分类问题中,分子对应于假阳性和假负数之和,即模型的I和II型错误数之和。
  2. 解释的方差就是:由模型解释的响应中的方差分数。这是一个简单线性模型中的R^2值,等于平方相关系数。

对于两种多类分类模型,手工计算和比较分类错误率(merror in xgboost)可能很有用;在这里,我们选择iris数据集,并使用随机森林和XGBoost分类模型来预测Species ~ .。下面是一个可重复的例子。

我们从加载必要的库开始

代码语言:javascript
复制
library(xgboost)
library(randomForest)

现在,我们在完整的iris数据上对这两个模型进行培训,并显示各自的混淆矩阵。

代码语言:javascript
复制
# Model: Random forest
model.rf <- randomForest(
    Species ~ ., data = iris)
cm.rf <- model.rf$confusion
cm.rf
#           setosa versicolor virginica class.error
#setosa         50          0         0        0.00
#versicolor      0         47         3        0.06
#virginica       0          3        47        0.06

# Model: XGBoost
model.xg <- xgboost(
    data = as.matrix(iris[, 1:4]),
    label = as.factor(iris[, 5]),
    nrounds = 10,
    eval.metric = "merror",
    num_class = 4) 
pred <- levels(iris[, 5])[as.integer(predict(model.xg, as.matrix(iris[, 1:4])))]
cm.xg <- table(pred, as.factor(iris[, 5]))
cm.xg
#
#pred         setosa versicolor virginica
#  setosa         50          0         0
#  versicolor      0         48         0
#  virginica       0          2        50

我们现在可以定义一个方便的函数来计算分类错误,正如上面所解释的。

代码语言:javascript
复制
merror <- function(cm)
    sum(setdiff(as.integer(cm), diag(cm))) / sum(as.integer(cm))

然后,对这两种模型的分类误差进行了分析。

代码语言:javascript
复制
    # Model: Random forest
    merror.rf <- merror(cm.rf[, 1:3])
    merror.rf
    #[1] 0.02

    # Model: XGBoost
    merror.xg <- merror(cm.xg)
    merror.xg
    #[1] 0.01333333

注意merror.xg的值是如何与XGBoost模型的evaluation_log中的最后一次迭代的值相同的。

代码语言:javascript
复制
model.xg$evaluation_log
#    iter train_merror
# 1:    1     0.026667
# 2:    2     0.020000
# 3:    3     0.020000
# 4:    4     0.020000
# 5:    5     0.020000
# 6:    6     0.020000
# 7:    7     0.013333
# 8:    8     0.013333
# 9:    9     0.013333
#10:   10     0.013333
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46847845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档