Sklearn为LinearRegression添加PolynomialFeatures的实现是否正确?
多项式回归预测课程申请量的实现修正
现有代码的核心问题
- 存在冗余调用:
PolynomialFeatures是无监督特征预处理工具,仅需对输入特征做变换,不需要传入标签y拟合,代码中poly_reg.fit(X_poly,y)属于完全多余的操作。 - 存在数据泄露风险:你当前的流程是先对全量特征做多项式变换,再拆分训练集和测试集,会导致测试集的信息提前进入预处理流程,最终得到的准确率分数虚高,无法反映模型真实泛化能力。
- 预测阶段逻辑完全错误:
- 训练时线性模型的输入是经过多项式变换后的高维特征,你预测时直接传入原始未变换的特征,会出现维度不匹配报错,输出结果完全无效
- 训练时输入特征是剔除了目标列
0的剩余天数数据,预测时直接传入全量df转成的数组,包含了目标列位置的数值,特征本身和训练时的输入格式不匹配 - 用pickle保存模型时没有同步保存多项式特征转换器,加载模型后无法对新输入数据做和训练阶段一致的特征变换。
修正后的可运行代码
训练阶段
import numpy as np import sklearn.model_selection from sklearn import linear_model from sklearn.preprocessing import PolynomialFeatures import pickle # 定义原始特征和标签 X = np.array(df.drop(columns='0')) y = np.array(df['0']) # 优先拆分训练集、测试集,从根源避免数据泄露,固定random_state保证结果可复现 x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split( X, y, test_size=0.2, random_state=42 ) # 仅用训练集数据拟合多项式特征转换器 poly_reg = PolynomialFeatures(degree=2) x_train_poly = poly_reg.fit_transform(x_train) # 测试集仅做变换,不能重复fit x_test_poly = poly_reg.transform(x_test) # 训练线性回归模型 linear = linear_model.LinearRegression() linear.fit(x_train_poly, y_train) # 用变换后的测试集计算准确率 accuracy = linear.score(x_test_poly, y_test) # 同时保存多项式转换器和线性模型,二者缺一不可 with open('poly_transformer.pkl', 'wb') as f: pickle.dump(poly_reg, f) with open('course_apply_linear_model.pkl', 'wb') as f: pickle.dump(linear, f)
预测阶段
# 加载保存好的转换器和模型 with open('poly_transformer.pkl', 'rb') as f: loaded_poly = pickle.load(f) with open('course_apply_linear_model.pkl', 'rb') as f: loaded_linear = pickle.load(f) # 待预测数据格式和训练时保持一致:剔除目标列'0',仅保留剩余天数相关特征 X_pred_raw = np.array(df.drop(columns='0')) # 先做和训练阶段一致的多项式特征变换,再传入模型预测 X_pred_poly = loaded_poly.transform(X_pred_raw) prediction = loaded_linear.predict(X_pred_poly)
优化建议
- 你选择2阶多项式的思路完全贴合业务逻辑:越临近开课申请量增速下降,本质是剩余天数和总申请量之间存在二次项形式的非线性关系,比纯线性拟合更贴近实际规律。负数值的剩余天数特征不会影响多项式变换效果,不需要额外做符号转换。如果后续2阶效果仍有提升空间,可以尝试
degree=3,但阶数不要设置过高,否则会出现严重过拟合。 - 你的原始特征维度较高(覆盖从-300到-1共300个时间节点的申请量数据),做2阶多项式变换后特征维度会快速膨胀,建议可以先做特征筛选(比如剔除方差极低的特征、和目标相关性极低的特征),或者用带正则项的线性模型(如Ridge岭回归、Lasso回归)替代普通线性回归,降低过拟合风险。
内容的提问来源于stack exchange,提问作者cwfmoore
相关产品推荐
相关产品推荐

