复现《统计学习导论:基于R应用》6.5.3节实验结果遇问题
复现《统计学习导论:基于R应用》6.5.3节实验的完整代码与问题解决
我正在尝试复现《统计学习导论:基于R应用》(An Introduction to Statistical Learning with Applications in R)6.5.3节的实验结果,已经严格按照书中代码操作,但代码还没完成,请求协助完成并解决相关问题。
已编写的代码片段
library("ISLR") library("leaps") set.seed(1) train = sample(c(TRUE, FALSE), nrow(Hitters), rep = TRUE) test = (!train) regfit.best = regsubsets(Salary ~., data = Hitters[train,], nvmax= 19) test.mat = model.matrix(Salary~., data = Hitters[test,]) val.errors = rep(NA, 19) for (i in 1:19){ coefi= coef(regfit.be...
完整代码与步骤解释
首先要注意,原书中第一步是去除缺失值,这很容易被忽略,否则后续分析会出现问题。下面是补全并修正后的完整代码:
# 1. 加载所需包 library("ISLR") library("leaps") # 2. 去除数据中的缺失值(原书中关键步骤,不可省略) Hitters = na.omit(Hitters) # 3. 设置随机种子保证结果可复现 set.seed(1) # 4. 拆分训练集与测试集 train = sample(c(TRUE, FALSE), nrow(Hitters), rep = TRUE) test = (!train) # 5. 在训练集上训练所有可能的子集模型(最多19个预测变量) regfit.best = regsubsets(Salary ~., data = Hitters[train,], nvmax= 19) # 6. 构造测试集的模型矩阵,用于后续预测计算 test.mat = model.matrix(Salary~., data = Hitters[test,]) # 7. 循环计算每个变量数模型的验证集MSE val.errors = rep(NA, 19) for (i in 1:19) { # 提取包含i个变量的最优模型系数 coefi = coef(regfit.best, id = i) # 计算测试集预测值(匹配系数对应的特征列) pred = test.mat[, names(coefi)] %*% coefi # 计算该模型的验证集均方误差 val.errors[i] = mean((Hitters$Salary[test] - pred)^2) } # 8. 找到MSE最小的模型对应的变量数 best_model_size = which.min(val.errors) cat("最优模型的变量数:", best_model_size, "\n") # 9. 查看最优模型的系数 coef(regfit.best, id = best_model_size)
常见问题解决
- 缺失值问题:如果跳过
na.omit(Hitters),Hitters数据集中的缺失Salary值会导致regsubsets无法正常运行,或者得到错误结果 - 循环中系数提取错误:必须用
coef(regfit.best, id = i)指定提取包含i个变量的最优模型,否则默认提取所有变量的模型 - 预测值计算错误:
test.mat[, names(coefi)]确保只选取系数对应的特征列,避免维度不匹配的报错
内容的提问来源于stack exchange,提问作者Ardyn
相关产品推荐
相关产品推荐

