随机森林中的“方差解释”和 XGBoost 中的“merror”有啥区别

Posted

技术标签:

【中文标题】随机森林中的“方差解释”和 XGBoost 中的“merror”有啥区别【英文标题】:what is difference between "variance explained " in Random Forest and "merror" in XGBoost随机森林中的“方差解释”和 XGBoost 中的“merror”有什么区别 【发布时间】:2018-04-01 13:13:37 【问题描述】:

我一直想知道标题上写的一个主题。

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

这是一个结果示例..

XGBoost>>
train-merror:0.718701   

据我所知,merror 是错误的预测分数。 所以,真实的预测分数是1 - 0.718701 = 0.281299

这意味着我制作的这个模型可以预测大约 28% 的正确结果

Random Forest>>
variance explained : 0.301

如上样例,能否解释RF的预测分数优于XGBoost结果?

其实我希望知道variance explainedmerror是否相同。

【问题讨论】:

【参考方案1】:

Variance explained 和 XGBoost 的 merror相同。它们涉及非常不同的统计概念。

    merror 是多类分类错误率。它被计算为 (# wrong case) / (# all cases),参见例如XGBoost R package manual。在二分类问题中,分子则对应于假阳性和假阴性的数量之和,即模型的第一类和第二类错误的数量之和。

    解释的方差就是:模型解释的响应中的方差分数。这是简单线性模型中的R^2值,等于相关系数的平方。


手动计算和比较两个多类分类模型的分类错误率(merror in xgboost)也许有用;这里我们选择iris数据集并使用随机森林和XGBoost分类模型来预测Species ~ .。以下是一个可重现的示例。

我们首先加载必要的库

library(xgboost)
library(randomForest)

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

# 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

我们现在可以定义一个便利函数来计算分类误差,如上所述。

merror <- function(cm)
    sum(setdiff(as.integer(cm), diag(cm))) / sum(as.integer(cm))

那么两个模型的分类误差为

    # 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 中的最终迭代值是如何相同的

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

【讨论】:

感谢您对 Maurits 的评论。是否可以理解两个评估标准不同,因此必须分别解释。有没有办法直接比较这两个标准?或其他.. 最好的,院长 正如我所解释的,它们与不同的概念(分类错误与方差)有关。所以我不确定“直接比较两个标准”是什么意思。它们是两个不同的度量/统计,用于评估两个不同模型的性能。要比较相同的统计量,您可以计算 RF 模型的分类误差,并将其与 boosting 模型的分类误差进行比较。

以上是关于随机森林中的“方差解释”和 XGBoost 中的“merror”有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

用 XGBoost 开发随机森林集成

随机森林、GBDT、Xgboost

如何从 xgboost 或随机森林中区分重要特征的方向?

在 H2O 随机森林和 xgboost 中使用权重列

XGBoost 和随机森林在表格数据上优于深度学习?

当训练数据居中时,XGBoost 和随机森林导致对测试集的持续预测