You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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)

代码说明

  1. 修正管道符:将所有%>替换为正确的%>%管道操作符
  2. 初始化结果存储:创建final_errors空数据框,用于累积所有阈值的误差结果
  3. 关联阈值信息:为每个模型的误差结果添加Threshold列,明确对应阈值
  4. 避免修改原训练数据:为决策树单独创建train_tree数据框,修改目标变量类型,不影响原data_train
  5. 累积结果:每次循环将当前阈值的误差结果通过bind_rows合并到总结果中,最终得到所有阈值的完整误差表

内容的提问来源于stack exchange,提问作者Ethan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:20:34