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

R语言线性建模中预测曲线呈现折线而非直线的问题咨询

R语言线性建模中预测曲线呈现折线而非直线的问题咨询

嗨,我来帮你分析一下这个问题~

你遇到的折线问题,核心原因其实很简单:你的测试集数据里的YearsExperience不是按从小到大的顺序排列的,而geom_line()默认是按照数据框里的行顺序来连接点的,不是按照x轴的数值顺序,所以就会出现这种“绕来绕去”的折线,而不是我们预期的直线。

咱们一步步拆解问题:

  • 你用sample()随机拆分训练集和测试集,这会导致测试集里的YearsExperience是打乱顺序的,不是递增状态。
  • 当你调用geom_line()时,ggplot会严格按照test数据框的行顺序,依次连接每个预测点,而不是按x轴从左到右的逻辑来连接,最终就形成了看起来杂乱的折线。

这里给你两个简单的解决方法:

方法一:先对测试集按YearsExperience排序再绘图

先把测试集的YearsExperience按升序排列,再用排序后的数据集绘图,这样连接出来的就是直线了:

# 对测试集按YearsExperience升序排序
test_sorted <- test %>% arrange(YearsExperience)

# 使用排序后的数据集绘图
ggplot() +
  geom_point(aes(x = test_sorted$YearsExperience, y = test_sorted$Salary),
             colour = 'red') +
  geom_line(aes(x = test_sorted$YearsExperience, y = predict.lm(model_train, test_sorted)),
             colour = 'blue') +
  ggtitle('Salary vs Experience (Test set)') +
  xlab('Years of experience') +
  ylab('Salary')

方法二:生成连续序列后再预测绘图(更推荐)

更规范的做法是先生成覆盖测试集YearsExperience范围的连续序列,用模型预测这个序列的结果,再绘图,这样不管原数据顺序如何,都能得到完美的直线:

# 生成覆盖测试集YearsExperience范围的连续序列
exp_seq <- seq(min(test$YearsExperience), max(test$YearsExperience), length.out = 100)
# 构造用于预测的数据框
pred_data <- data.frame(YearsExperience = exp_seq)
# 得到预测值
pred_values <- predict(model_train, newdata = pred_data)

# 绘图
ggplot() +
  geom_point(aes(x = test$YearsExperience, y = test$Salary), colour = 'red') +
  geom_line(aes(x = exp_seq, y = pred_values), colour = 'blue') +
  ggtitle('Salary vs Experience (Test set)') +
  xlab('Years of experience') +
  ylab('Salary')

另外还有个小细节提醒:你当前的模型是lm(YearsExperience~Salary),也就是用薪资预测工作年限,这和我们通常“用工作年限预测薪资”的逻辑反过来了,如果你的需求是预测薪资,记得把模型改成lm(Salary~YearsExperience, data=train)哦~

备注:内容来源于stack exchange,提问作者mig001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 15:27:35