楼主: hylnwoau
8427 1

[程序分享] 子集选择和确定最优模型 [推广有奖]

  • 0关注
  • 5粉丝

已卖:368份资源

硕士生

62%

还不是VIP/贵宾

-

威望
0
论坛币
2943 个
通用积分
22.3624
学术水平
2 点
热心指数
0 点
信用等级
0 点
经验
4552 点
帖子
61
精华
0
在线时间
263 小时
注册时间
2017-5-22
最后登录
2022-12-25

楼主
hylnwoau 发表于 2019-1-26 11:32:23 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币

子集选择&如何选择最优模型

1.       最优子集选择

若有p个解释变量,则存在2^p个可用于建模的变量子集,根据RSS和R方的改善情况选择最简单的模型。

2.       逐步选择(向前、向后)

只需拟合p(p+1)/2个模型,运算效率极大提高,但得到的模型可能非最优模型。通常将向前向后逐步选择结合使用,在加入新变量的同时剔除不能提升模型拟合效果的变量。

基于测试误差选择最优模型:

1)  Cp值、AIC、BIC、调整R方,间接估计测试误差

2)  验证集或交叉验证,直接估计测试误差

library(ISLR)    #利用Hitters(棒球)数据集

names(Hitters)

#[1] "AtBat"    "Hits"     "HmRun"   

# [4] "Runs"     "RBI"      "Walks"   

#[7] "Years"    "CAtBat"   "CHits"   

#[10] "CHmRun"   "CRuns"    "CRBI"     

#[13] "CWalks"   "League"   "Division"

#[16] "PutOuts"  "Assists"  "Errors"   

#[19] "Salary"    "NewLeague"

dim(Hitters)

sum(is.na(Hitters$Salary))

Hitters=na.omit(Hitters)    #先剔除缺失值

dim(Hitters)

PartI 利用 CpAICBIC、调整R 确定最优模型

###最优子集选择#####

library(leaps)

regfit.full=regsubsets(Salary~.,Hitters)

summary(regfit.full)

#图1 默认给出最优8变量模型的8种变量筛选结果

regfit.full=regsubsets(Salary~.,Hitters,nvmax=19) #最优19变量模型的19种变量筛选结果

reg.summary=summary(regfit.full)

names(reg.summary)

#通过比较各变量模型的RSS、调整R方、Cp值和BIC值确定最优变量模型

par(mfrow=c(2,2))

plot(reg.summary$rss,xlab = 'Number of Variables',ylab ='RSS',type='l')

plot(reg.summary$adjr2,xlab = 'Number of Variables',ylab = 'AdjustedRSq',type='l')

which.max(reg.summary$adjr2)

points(11,reg.summary$adjr2[11],col='red',cex=2,pch=20)

plot(reg.summary$cp,xlab='number of variables',ylab='Cp',type='l')

which.min(reg.summary$cp)

points(10,reg.summary$cp[10],col='red',cex=2,pch=20)

plot(reg.summary$bic,xlab='number of variables',ylab='Bic',type='l')

which.min(reg.summary$bic)

points(6,reg.summary$bic[6],col='red',cex=2,pch=20)

#a   RSS随着解释变量数目增大而单调递减,无法判断

#b   调整R2——最优模型为11变量模型

#c   Cp——最优模型为10变量模型

#d   BIC——最优模型为6变量模型

par(mfrow=c(2,2))

plot(regfit.full,scale = "r2")

plot(regfit.full,scale = "adjr2")

plot(regfit.full,scale = "Cp")

plot(regfit.full,scale = "bic")


#图2黑色方块表示根据相应的统计指标选择最优模型所含的变量

###向前逐步选择 向后逐步选择####

regfit.fwd=regsubsets(Salary~.,data=Hitters,nvmax=19,method='forward')

summary(regfit.fwd)

regfit.bwd=regsubsets(Salary~.,data=Hitters,nvmax=19,method='backward')

summary(regfit.bwd)

Part2 利用 验证集和交叉验证方法 确定最优模型

###使用验证集和交叉验证 ####

set.seed(1)

train=sample(c(TRUE,FALSE),nrow(Hitters),rep=TRUE)

test=(!train)

regfit.best=regsubsets(Salary~.,data=Hitters[train,],nvmax=19) #训练数据模型拟合

summary(regfit.best)

test.mat=model.matrix(Salary~.,data=Hitters[test,])

val.errors=rep(NA,19)

for(i in 1:19){

  coefi=coef(regfit.best,id=i)  # i变量模型的系数

pred=test.mat[,names(coefi)]%*%coefi

val.errors=mean((Hitters$Salary[test]-pred)^2)

}

val.errors

which.min(val.errors)   #图3 测试误差最小的为10模型

coef(regfit.best,10)   #10模型回归系数


#10折交叉验证

k=10

set.seed(1)

folds=sample(1:k,nrow(Hitters),replace = TRUE)

cv.errors=matrix(NA,k,19,dimnames = list(NULL,paste(1:19)))

for(j in 1:k){

best.fit=regsubsets(Salary~.,data=Hitters[folds!=j,],nvmax=19)

  for(i in 1:19){

    pred=predict(best.fit,Hitters[folds==j,],id=i)

   cv.errors[j,i]=mean((Hitters$Salary[folds==j]-pred)^2)

  }

}

mean.cv.errors=apply(cv.errors,2,mean)

mean.cv.errors

which.min(mean.cv.errors)  #图4 11变量模型的10次交叉验证误差均值最小

reg.best=regsubsets(Salary~.,data=Hitters,nvmax = 19)

coef(reg.best,11)






二维码

扫码加我 拉你入群

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

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

关键词:R语言编程艺术 R语言基础 R语言学习 高维数据处理

子集选择和如何选择最优模型.docx
下载链接: https://bbs.pinggu.org/a-2722328.html

115.88 KB

需要: 1 个论坛币  [购买]

含图片和解释

6.5子集选择&如何选择最优模型.txt

2.25 KB

需要: 1 个论坛币  [购买]

纯代码

已有 1 人评分论坛币 收起 理由
jiangbeilu + 10 精彩帖子

总评分: 论坛币 + 10   查看全部评分

沙发
啊啊啊啊啊吖(未真实交易用户) 发表于 2019-2-1 11:30:03
感谢分享

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-17 23:48