随机森林中的变量选择和预测精度
Variable selection in Random forest and prediction accuracy
我有一个横截面数据集重复了 2 年,2009 年和 2010 年。
我使用第一年 (2009) 作为训练集来训练随机森林来解决回归问题,第二年 (2010) 作为测试集。
加载数据
df <- read.csv("https://www.dropbox.com/s/t4iirnel5kqgv34/df.cv?dl=1")
训练完 2009 年的随机森林后,变量重要性表明变量 x1
是最重要的。
使用所有变量的随机森林
set.seed(89)
rf2009 <- randomForest(y ~ x1 + x2 + x3 + x4 + x5 + x6,
data = df[df$year==2009,],
ntree=500,
mtry = 6,
importance = TRUE)
print(rf2009)
Call:
randomForest(formula = y ~ x1 + x2 + x3 + x4 + x5 + x6, data = df[df$year == 2009, ], ntree = 500, mtry = 6, importance = TRUE)
Type of random forest: regression
Number of trees: 500
No. of variables tried at each split: 6
Mean of squared residuals: 5208746
% Var explained: 75.59
变量重要性
imp.all <- as.data.frame(sort(importance(rf2009)[,1],decreasing = TRUE),optional = T)
names(imp.all) <- "% Inc MSE"
imp.all
% Inc MSE
x1 35.857840
x2 16.693059
x3 15.745721
x4 15.105710
x5 9.002924
x6 6.160413
然后我继续测试集,我收到以下准确度指标。
在测试集上的预测和评估
test.pred.all <- predict(rf2009,df[df$year==2010,])
RMSE.forest.all <- sqrt(mean((test.pred.all-df[df$year==2010,]$y)^2))
RMSE.forest.all
[1] 2258.041
MAE.forest.all <- mean(abs(test.pred.all-df[df$year==2010,]$y))
MAE.forest.all
[1] 299.0751
当我训练模型时 没有 变量 x1
,这是上面最重要的一个,并将训练的模型应用于测试集,我观察到以下内容:
用 x1
解释的方差比没有 x1
的情况要高,正如预期的那样
但是没有x1
测试数据的RMSE
更好(RMSE
:2258.041有x1
对比没有 x1
)
的 1885.462
尽管如此 MAE
使用 x1
(299.0751) 与不使用它 (302.3382) 相比稍微好一些。
不包括 x1 的随机森林
rf2009nox1 <- randomForest(y ~ x2 + x3 + x4 + x5 + x6,
data = df[df$year==2009,],
ntree=500,
mtry = 5,
importance = TRUE)
print(rf2009nox1)
Call:
randomForest(formula = y ~ x2 + x3 + x4 + x5 + x6, data = df[df$year == 2009, ], ntree = 500, mtry = 5, importance = TRUE)
Type of random forest: regression
Number of trees: 500
No. of variables tried at each split: 5
Mean of squared residuals: 6158161
% Var explained: 71.14
变量重要性
imp.nox1 <- as.data.frame(sort(importance(rf2009nox1)[,1],decreasing = TRUE),optional = T)
names(imp.nox1) <- "% Inc MSE"
imp.nox1
% Inc MSE
x2 37.369704
x4 11.817910
x3 11.559375
x5 5.878555
x6 5.533794
在测试集上的预测和评估
test.pred.nox1 <- predict(rf2009nox1,df[df$year==2010,])
RMSE.forest.nox1 <- sqrt(mean((test.pred.nox1-df[df$year==2010,]$y)^2))
RMSE.forest.nox1
[1] 1885.462
MAE.forest.nox1 <- mean(abs(test.pred.nox1-df[df$year==2010,]$y))
MAE.forest.nox1
[1] 302.3382
我知道变量重要性指的是训练模型而不是测试模型,但这是否意味着 x1
变量应该 而不是 在模型中?
那么,我应该在模型中包含 x1
吗?
我认为您需要有关模型性能的更多信息。只有一个测试样本,您可以推测出很多为什么 RMSE 在没有 x1 的情况下更好,尽管 x1 具有最高重要性。可能是变量之间的相关性或从训练集中的噪声中解释。
要获得更多信息,我建议查看袋外错误并使用交叉验证进行超参数优化。如果您在测试不同的测试数据集后看到相同的行为,您可以使用和不使用 x1 进行交叉验证。
希望对您有所帮助
我有一个横截面数据集重复了 2 年,2009 年和 2010 年。 我使用第一年 (2009) 作为训练集来训练随机森林来解决回归问题,第二年 (2010) 作为测试集。
加载数据
df <- read.csv("https://www.dropbox.com/s/t4iirnel5kqgv34/df.cv?dl=1")
训练完 2009 年的随机森林后,变量重要性表明变量 x1
是最重要的。
使用所有变量的随机森林
set.seed(89)
rf2009 <- randomForest(y ~ x1 + x2 + x3 + x4 + x5 + x6,
data = df[df$year==2009,],
ntree=500,
mtry = 6,
importance = TRUE)
print(rf2009)
Call:
randomForest(formula = y ~ x1 + x2 + x3 + x4 + x5 + x6, data = df[df$year == 2009, ], ntree = 500, mtry = 6, importance = TRUE)
Type of random forest: regression
Number of trees: 500
No. of variables tried at each split: 6
Mean of squared residuals: 5208746
% Var explained: 75.59
变量重要性
imp.all <- as.data.frame(sort(importance(rf2009)[,1],decreasing = TRUE),optional = T)
names(imp.all) <- "% Inc MSE"
imp.all
% Inc MSE
x1 35.857840
x2 16.693059
x3 15.745721
x4 15.105710
x5 9.002924
x6 6.160413
然后我继续测试集,我收到以下准确度指标。
在测试集上的预测和评估
test.pred.all <- predict(rf2009,df[df$year==2010,])
RMSE.forest.all <- sqrt(mean((test.pred.all-df[df$year==2010,]$y)^2))
RMSE.forest.all
[1] 2258.041
MAE.forest.all <- mean(abs(test.pred.all-df[df$year==2010,]$y))
MAE.forest.all
[1] 299.0751
当我训练模型时 没有 变量 x1
,这是上面最重要的一个,并将训练的模型应用于测试集,我观察到以下内容:
用
x1
解释的方差比没有x1
的情况要高,正如预期的那样但是没有
x1
测试数据的RMSE
更好(RMSE
:2258.041有x1
对比没有x1
) 的 1885.462
尽管如此
MAE
使用x1
(299.0751) 与不使用它 (302.3382) 相比稍微好一些。
不包括 x1 的随机森林
rf2009nox1 <- randomForest(y ~ x2 + x3 + x4 + x5 + x6,
data = df[df$year==2009,],
ntree=500,
mtry = 5,
importance = TRUE)
print(rf2009nox1)
Call:
randomForest(formula = y ~ x2 + x3 + x4 + x5 + x6, data = df[df$year == 2009, ], ntree = 500, mtry = 5, importance = TRUE)
Type of random forest: regression
Number of trees: 500
No. of variables tried at each split: 5
Mean of squared residuals: 6158161
% Var explained: 71.14
变量重要性
imp.nox1 <- as.data.frame(sort(importance(rf2009nox1)[,1],decreasing = TRUE),optional = T)
names(imp.nox1) <- "% Inc MSE"
imp.nox1
% Inc MSE
x2 37.369704
x4 11.817910
x3 11.559375
x5 5.878555
x6 5.533794
在测试集上的预测和评估
test.pred.nox1 <- predict(rf2009nox1,df[df$year==2010,])
RMSE.forest.nox1 <- sqrt(mean((test.pred.nox1-df[df$year==2010,]$y)^2))
RMSE.forest.nox1
[1] 1885.462
MAE.forest.nox1 <- mean(abs(test.pred.nox1-df[df$year==2010,]$y))
MAE.forest.nox1
[1] 302.3382
我知道变量重要性指的是训练模型而不是测试模型,但这是否意味着 x1
变量应该 而不是 在模型中?
那么,我应该在模型中包含 x1
吗?
我认为您需要有关模型性能的更多信息。只有一个测试样本,您可以推测出很多为什么 RMSE 在没有 x1 的情况下更好,尽管 x1 具有最高重要性。可能是变量之间的相关性或从训练集中的噪声中解释。
要获得更多信息,我建议查看袋外错误并使用交叉验证进行超参数优化。如果您在测试不同的测试数据集后看到相同的行为,您可以使用和不使用 x1 进行交叉验证。
希望对您有所帮助