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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:09:29