随机森林中的 "variance explained " 和 XGBoost 中的 "merror" 有什么区别

what is difference between "variance explained " in Random Forest and "merror" in XGBoost

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

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

这是一个结果示例..

XGBoost>>
train-merror:0.718701   

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

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

Random Forest>>
variance explained : 0.301

像上面的样本,是否可以解释 RF 的预测分数优于 XGBoost 结果?

其实我很想知道variance explainedmerror是不是一样

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

  1. merror 是 multiclass class 化错误率。它被计算为(# wrong cases)/(# all cases),参见例如XGBoost R package manual。在二元class化问题中,分子则对应于误报数和漏报数的总和,即模型的I类和II类错误数的总和。

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


手动计算和比较两个 multi-class class 的 classification 错误率 (merror in xgboost) 也许有用化模型;这里我们选择 iris 数据集并使用随机森林和 XGBoost class化模型来预测 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

我们现在可以定义一个方便的函数来计算 class化误差,如上所述。

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

两个模型的class化误差为

    # 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