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
相关产品推荐
相关产品推荐

