Sklearn多项式回归实现异常,请求问题排查指导
问题排查与修正
你的代码生成混乱折线图的核心原因是绘图时使用的X未按升序排列,plt.plot会严格按照输入数据的顺序连接点,而原始数据集里的X值是无序的,导致线条交叉错乱。另外degree=6的多项式容易出现过拟合问题,也需要注意。
修正步骤与代码
- 对X进行排序,确保绘图时按x轴递增顺序生成拟合线
- 调整多项式阶数,避免过拟合(可根据效果调整)
修正后的代码:
import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures # 导入数据集 df = pd.read_csv('data.csv') X = df.values[:, 0:1] y = df.values[:, 1:2] # 多项式特征转换(先尝试degree=2,可按需调整) poly_reg = PolynomialFeatures(degree=2) X_poly = poly_reg.fit_transform(X) lin_reg_poly = LinearRegression().fit(X_poly, y) # 生成有序X值用于绘制平滑拟合线 X_sorted = np.sort(X, axis=0) # 用已拟合的多项式特征转换器生成特征并预测 y_pred = lin_reg_poly.predict(poly_reg.transform(X_sorted)) plt.scatter(X, y, color='blue') plt.plot(X_sorted, y_pred, color='r') plt.show()
关键说明
- X排序的必要性:原始数据集的X值不是从小到大排列的,直接用原X绘图会导致折线在x轴上来回跳跃,排序后才能得到连续平滑的拟合曲线。
- 多项式阶数选择:degree=6的模型复杂度太高,很容易在训练数据上过度拟合,导致模型泛化能力差。建议从低阶(2-3)开始尝试,通过拆分训练/测试集、查看均方误差等方式评估拟合效果。
- 避免重复拟合:绘图时只需用
poly_reg.transform()转换排序后的X即可,不需要再次fit_transform(),因为转换器已经在训练数据上完成拟合。
内容的提问来源于stack exchange,提问作者Tkanos
相关产品推荐
相关产品推荐

