楼主: yaoqsm321
57200 80

[问答] 随机森林过拟合问题,在训练集上表现很好,在测试集上的表现很差 [推广有奖]

  • 1关注
  • 0粉丝

本科生

28%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
873 点
帖子
81
精华
0
在线时间
70 小时
注册时间
2015-5-28
最后登录
2017-9-7

楼主
yaoqsm321 发表于 2016-12-6 16:17:55 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
模型用途:建立模型,对客户进行分类。

数据有42个自变量,其中有多分类变量、二分类变量和连续性变量,因变量为二分类变量。
所有的二分类变量都转换为0和1,多分类变量用随机的数字来代表,例如

星座
处女座        2
水瓶座        3
天蝎座        5
金牛座        7
巨蟹座        8
白羊座        10
狮子座        13
双鱼座        11
摩羯座        4
天秤座        0
双子座        16
射手座        17

样本为5112个客户,有788个为坏客户,4324个为好客户。现在想通过随机森林对新进来的客户进行分类,训练集为70%的数据,测试集为30%的数据。模型对训练集预测的正确率为100%,对测试集预测的正确率几乎为0,,找不到解决办法。
R语言代码如下:
因变量~id,其余为自变量。
radata <- read.csv("E://jue//1sst.csv",header=T)
ind <- sample(2, nrow(radata), replace=TRUE, prob=c(0.7, 0.3))
traindata <- radata[ind==1,]
testdata<- radata[ind==2,]
traindata$id <- as.factor(traindata$id)
traindata$a <- as.factor(traindata$a)
traindata$b <- as.factor(traindata$b)
traindata$c <- as.factor(traindata$c)
traindata$d <- as.factor(traindata$d)
traindata$g <- as.factor(traindata$g)
traindata$h <- as.factor(traindata$h)
traindata$i <- as.factor(traindata$i)
traindata$n <- as.factor(traindata$n)
traindata$r <- as.factor(traindata$r)
traindata$s <- as.factor(traindata$s)
raindata$ae <- as.factor(traindata$ae)
traindata$ag <- as.factor(traindata$ag)
traindata$ai <- as.factor(traindata$ai)
traindata$aj <- as.factor(traindata$aj)
traindata$am <- as.factor(traindata$am)
traindata$an <- as.factor(traindata$an)

testdata$a <- as.factor(testdata$a)
testdata$b <- as.factor(testdata$b)
testdata$c <- as.factor(testdata$c)
testdata$d <- as.factor(testdata$d)
testdata$g <- as.factor(testdata$g)
testdata$h <- as.factor(testdata$h)
testdata$i <- as.factor(testdata$i)
testdata$n <- as.factor(testdata$n)
testdata$r <- as.factor(testdata$r)
testdata$s <- as.factor(testdata$s)
testdata$ae <- as.factor(testdata$ae)
testdata$ag <- as.factor(testdata$ag)
testdata$ai <- as.factor(testdata$ai)
testdata$aj <- as.factor(testdata$aj)
testdata$am <- as.factor(testdata$am)
testdata$an <- as.factor(testdata$an)

library(randomForest)
randommodel<-randomForest(id~a+b+c+d+e+f+g+h+i+j+k+l+m+n+r+s+v+w+x+y+z+aa+ab+ac+ad+ae+af+ag+ah+ai+aj+ak+al+am+an+ao+ap+aq+ar+as+at+au,data=traindata,ntree=300,mtry=12)

prediction<-predict(randommodel,newdata=testdata,type="class")

frep<-table(prediction,testdata$id)
frep


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:随机森林 测试集 训练集 过拟合 二分类变量 森林

回帖推荐

jgchen1966 发表于69楼  查看完整内容

仅仅复制已有数据,没有增加任何新信息量,结果“突一下”变好了,可信吗?? 当然不可信!!! 据我对你数据分析,用测试数据集(test dataset )的AUC 作模型绩效标准,用 downsample、upsample、smote 、还是,用ROSE , 测试数据集的AUC ,约相同,为 0.605-0.635,没啥子实质改善!!! 你的数据集,非常不规整,理应进行进一步的预处理,并且,这些变量也不是很有效,在实际工作,必然要进一步收集新变量的数据!! ...

沙发
foozhencheng 学生认证  发表于 2016-12-6 16:29:00 来自手机
可以试试Logistic Regression以及SVM

藤椅
yaoqsm321 发表于 2016-12-6 16:33:16
foozhencheng 发表于 2016-12-6 16:29
可以试试Logistic Regression以及SVM
逻辑回归试过了,没有决策树好,svm还没有考虑,想等这个实在搞不出来再用svm,毕竟还不会,哈哈

板凳
jgchen1966 发表于 2016-12-6 21:36:58
yaoqsm321 发表于 2016-12-6 16:33
逻辑回归试过了,没有决策树好,svm还没有考虑,想等这个实在搞不出来再用svm,毕竟还不会,哈哈
randomForest 、SVM、等等机器学习算法,有个很关键,但常被忽视的问题:数据必须满足“独立同分布”条件,否则必过似。。。如何解决??只能依赖于对数据特性、数据发生及其相关专业学科知识。。例如,股市中所有公司的财报数据,不仅公司间不独立不同公布,同一公司不同年份间也难满足。。是一大难题!!!
   针对,你的问题。。。不太清楚,可能客户分布异形,也可能其它,不了解你的数据,也不了解你的专业知识,难说啥。。。。

报纸
jameschin007 发表于 2016-12-7 01:33:34
好歹把frep 的结果让我们看一下啊。
程序没问题,你的让大家看结果。

另外,要防止过拟合, 用cv啊。

地板
jameschin007 发表于 2016-12-7 01:40:09
yaoqsm321 发表于 2016-12-6 16:33
逻辑回归试过了,没有决策树好,svm还没有考虑,想等这个实在搞不出来再用svm,毕竟还不会,哈哈
svm 没有意义。 用着很简单,调参数全凭感觉。没经验,就gridsearch吧。
SVM未必效果好。要用的话, 做one-hot编码。

随机森林应该是最不矫情的模型。
建议是 做5 folds 或者10folds的CV吧。
这是防止过拟合的利器。 mtry 用默认值吧。为什么用12 ?

逻辑回归?哪种?最原始的那种? 直接上 弹性网。 然后根据lamda,选特征变量吧。再用弹性网预测。一般效果会不错的。


7
yaoqsm321 发表于 2016-12-8 11:40:00
jameschin007 发表于 2016-12-7 01:40
svm 没有意义。 用着很简单,调参数全凭感觉。没经验,就gridsearch吧。
SVM未必效果好。要用的话, 做o ...
n <- ncol(traindata)
set.seed(1234)
for (i in 1:(n-1)){
  model<-randomForest(id~a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+aa+ab+ac+ad+ae+af+ag+ah+ai+aj+ak+al+am+an+ao+ap+aq+ar+as+at+au,data=traindata,mtry=i)
  err<-mean(model$err.rate)
  print(err)
}
mtry的值是根据这段代码算出来的,应该是没问题的。
这个交叉验证改怎么用啊,有代码吗?

8
yaoqsm321 发表于 2016-12-8 11:43:13
jameschin007 发表于 2016-12-7 01:33
好歹把frep 的结果让我们看一下啊。
程序没问题,你的让大家看结果。
对测试集的运行结果如下,效果不是太好
prediction   0   1
         0   1   3
         1 154 836

对训练集本身再去预测是很准的:
prediction    0    1
         0  632    0
         1    0 3416

9
yaoqsm321 发表于 2016-12-8 11:44:36
jgchen1966 发表于 2016-12-6 21:36
randomForest 、SVM、等等机器学习算法,有个很关键,但常被忽视的问题:数据必须满足“独立同分布”条件 ...
我知道有些算法要求数据符合正态分布或者独立同分布,但是实际数据中很少会有符合这些条件的。但就算不符合,你也是要去做的啊。

10
jgchen1966 发表于 2016-12-8 13:38:33
yaoqsm321 发表于 2016-12-8 11:44
我知道有些算法要求数据符合正态分布或者独立同分布,但是实际数据中很少会有符合这些条件的。但就算不符 ...
当然,你愿承担由此带来的“模型风险”,没人会反对的!!!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 07:18