随机森林中的 "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 explained
和merror
是不是一样
Variance explained 和 XGBoost 的 merror
不 相同。它们涉及非常不同的统计概念。
merror
是 multiclass class 化错误率。它被计算为(# wrong cases)/(# all cases),参见例如XGBoost R package manual。在二元class化问题中,分子则对应于误报数和漏报数的总和,即模型的I类和II类错误数的总和。
解释的方差就是:模型解释的响应中的方差分数。这是简单线性模型中的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
我一直在想标题写的话题。
实际上,我尝试了两个库来预测并得到了结果, 但我不知道两个分数是否相同。
这是一个结果示例..
XGBoost>>
train-merror:0.718701
据我所知,merror
是错误的预测分数。
所以,真实的预测分数是 1 - 0.718701 = 0.281299
.
这意味着我做的这个模型可以预测大约28%的正确结果
Random Forest>>
variance explained : 0.301
像上面的样本,是否可以解释 RF 的预测分数优于 XGBoost 结果?
其实我很想知道variance explained
和merror
是不是一样
Variance explained 和 XGBoost 的 merror
不 相同。它们涉及非常不同的统计概念。
merror
是 multiclass class 化错误率。它被计算为(# wrong cases)/(# all cases),参见例如XGBoost R package manual。在二元class化问题中,分子则对应于误报数和漏报数的总和,即模型的I类和II类错误数的总和。解释的方差就是:模型解释的响应中的方差分数。这是简单线性模型中的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