嵌套for循环生成多表求助:基于diamonds数据集的模型误分类误差对比
问题与代码修正
需求说明
使用diamonds数据集,基于不同阈值生成二元目标变量carat_dummy(当carat超过阈值时为1,否则为0),通过误分类误差对比线性回归与决策树模型的二元预测性能,最终输出每个阈值对应的两种模型的误差表。
原代码存在的问题
- 管道符书写错误:
%>应为%>%,会导致代码运行报错 - 循环迭代结果未保存:每次循环的误差结果仅覆盖临时变量,最终仅保留最后一个阈值的结果
- 未关联阈值信息:无法区分不同阈值对应的误差数据
修正后的完整代码
library(tidyverse) library(rpart) library(rpart.plot) # 加载数据集 data <- diamonds # 设定阈值列表 thresholds <- c(0.20, 0.70, 2.00) # 初始化空数据框用于存储所有结果 final_errors <- tibble() for (thresh in thresholds) { # 数据预处理:筛选特征、生成二元变量、删除缺失值 data_filtered <- data %>% select(-c(cut, color, clarity)) %>% mutate(carat_dummy = ifelse(carat > thresh, 1, 0)) %>% drop_na() # 划分训练集和测试集 set.seed(14643) data_filtered <- data_filtered %>% mutate(train_test = sample(c("train", "test"), n(), replace = TRUE, prob = c(0.75, 0.25))) data_train <- data_filtered %>% filter(train_test == "train") data_test <- data_filtered %>% filter(train_test == "test") # --- 线性回归模型 --- reg <- lm(carat_dummy ~ depth + table + price, data = data_train) reg_pred <- predict(reg, newdata = data_test, type = "response") # 计算线性回归误分类误差 error_reg <- data_test %>% mutate(prediction = ifelse(reg_pred >= 0.5, 1, 0)) %>% summarise(misclassification = mean(carat_dummy != prediction)) %>% add_column(Method = "线性回归", Threshold = thresh) %>% select(Threshold, Method, everything()) # --- 决策树模型 --- # 为决策树单独处理训练集的目标变量类型(避免修改原数据) train_tree <- data_train %>% mutate(carat_dummy = factor(carat_dummy)) tree_model <- rpart(carat_dummy ~ depth + table + price, data = train_tree) tree_pred <- predict(tree_model, newdata = data_test, type = "class") # 计算决策树误分类误差 error_tree <- data_test %>% mutate(prediction = as.numeric(as.character(tree_pred))) %>% summarise(misclassification = mean(carat_dummy != prediction)) %>% add_column(Method = "决策树", Threshold = thresh) %>% select(Threshold, Method, everything()) # 将当前阈值的两个模型误差合并,加入总结果 current_errors <- bind_rows(error_reg, error_tree) final_errors <- bind_rows(final_errors, current_errors) } # 查看最终结果 print(final_errors)
代码说明
- 修正管道符:将所有
%>替换为正确的%>%管道操作符 - 初始化结果存储:创建
final_errors空数据框,用于累积所有阈值的误差结果 - 关联阈值信息:为每个模型的误差结果添加
Threshold列,明确对应阈值 - 避免修改原训练数据:为决策树单独创建
train_tree数据框,修改目标变量类型,不影响原data_train - 累积结果:每次循环将当前阈值的误差结果通过
bind_rows合并到总结果中,最终得到所有阈值的完整误差表
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

