是什么区别"方差解释"在随机森林和" merror"在XGBoost中

时间:2017-10-20 11:07:14

标签: r random-forest xgboost

我一直想知道题目中写的主题。

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

以下是结果示例..

XGBoost>>
train-merror:0.718701   

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

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

Random Forest>>
variance explained : 0.301

如上所述,可以解释RF的预测分数是否优于XGBoost结果?

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

1 个答案:

答案 0 :(得分:1)

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

  1. merror是多类分类错误率。它被计算为(#个错误的情况)/(#所有情况),参见例如XGBoost R package manual。在二元分类问题中,分子然后对应于误判数和假阴性数之和,即模型的I型和II型错误数之和。

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

  3. 对于两个多级分类模型,手动计算和比较merror中的分类错误率(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