我正在使用不平衡数据的随机森林,这个站点上已经在这里评论了一个问题,并针对该问题提供了几种解决方案,重点是过采样,欠采样和SMOTE。
我要研究的变量由数字0的75%和数字1的25%(或接近56.000 / 14.000)组成,这些变量将由其他18个变量回归。我不知道是否有必要在此处发布数据库,或者仅通过查看下面将发布的代码是否可以解决问题。
我最初使用80%的数据进行了训练,而使用20%的进行了测试,结果在MSE方面非常好,但考虑到预测1时,准确性,回想度和f1得分较差提示该模型的0偏差较大。
在另一篇文章中,建议strata
中的sampsize
和randomForest
函数可以解决此问题,使我的代码看起来像这样(sinistros2是我的数据): / p>
train_idx <- sample(1:nrow(sinistros2),56538,replace=FALSE)
train6 <- sinistros2[train_idx,] # select all these rows
teste6 <- sinistros2[-train_idx,]
rf.mdl <- randomForest( y=as.factor(train6[,1]), x=train6[,2:ncol(sinistros2)],
strata=as.factor(train6$ev), sampsize=c(50,50),
ntree=100)
plot(rf.mdl)
print(rf.mdl)
Call:
randomForest(x = train6[, 2:ncol(sinistros2)], y = as.factor(train6[, 1]), ntree = 100, strata = as.factor(train6$ev), sampsize = c(50, 50))
Type of random forest: classification
Number of trees: 100
No. of variables tried at each split: 4
OOB estimate of error rate: 0.23%
Confusion matrix:
0 1 class.error
0 43465 0 0.00000000
1 131 12942 0.01002065
所以我对测试集进行了预测,并计算了测量,召回率和F1 socre的准确性
pred6<-predict(rf.mdl, newdata=teste6) #prediction
tab6<-table(pred6,teste6$ev)
tab6
pred6 0 1
0 10725 42
1 0 3233
1-sum(diag(tab6))/sum(tab6)
[1] 0.003
p1<-tab6[1,1]/(tab6[1,1]+tab6[2,1]) #classe1 precision
[1] 1
p2<-tab6[2,2]/(tab6[2,2]+tab6[1,2]) #classe 2 precision
[1] 0.9871756
r1<-tab6[1,1]/(tab6[1,1]+tab6[1,2]) #classe 1 recall
[1] 0.9960992
r2<-tab6[2,2]/(tab6[2,2]+tab6[2,1]) #classe 1 recall
[1] 1
f1<-2*p1*r1/(p1+r1) #f1 score
[1] 0.9980458
f2<-2*p2*r2/(p2+r2) #f1 score
[1] 0.9935464
如您所见,结果显然非常好,如果我没有弄错的话,这会让我很感兴趣。您能找到什么帮助吗?
在发布此问题之前,我在这里阅读了很多内容,但没有任何帮助。 This是一个与我的问题类似的问题,但是我的算法显示出很高的准确性,因此无法估算ROC曲线和AUC。