使用5阶PolynomialFeatures拟合模型后首预测值远大于真实值如何解决
这个问题本质是高阶多项式拟合的龙格现象,以及普通线性回归无正则约束导致的过拟合问题:5阶多项式在数据区间的边界位置会出现无意义的剧烈震荡,刚好你预测的第一个点落在X取值的左边界,就出现了预测值远大于真实值的情况。
可以通过以下几种方法解决:
- 降低多项式阶数
绝大多数场景下2~3阶的多项式就足够拟合数据的非线性趋势,不会出现边界剧烈震荡的问题,直接把degree参数调整为2或3即可,修改后重新拟合就能看到明显改善。 - 更换为带正则约束的线性回归模型
普通LinearRegression没有对特征系数做约束,高阶多项式的系数很容易被拟合到过大的数值,进而导致曲线震荡。可以选择带L2正则的Ridge、带L1正则的Lasso或者混合正则的ElasticNet,通过正则项限制系数的大小,示例代码如下:from sklearn.linear_model import Ridge degree = 3 X_poly = PolynomialFeatures(degree=degree).fit_transform(X.reshape(-1, 1)) # alpha为正则强度,数值越大约束越强,可根据拟合效果调整 ridge_reg = Ridge(alpha=1.0) ridge_reg.fit(X_poly, y) - 对多项式特征做标准化
不同阶数的多项式特征数值范围差异极大,比如X取值为010时,5阶特征的数值范围可以达到01e5,会大幅干扰线性回归的系数估计。生成多项式特征后先做标准化再拟合,也能有效缓解偏差问题,示例代码如下:from sklearn.preprocessing import StandardScaler scaler = StandardScaler() # 生成多项式特征后做标准化 X_poly = PolynomialFeatures(degree=5).fit_transform(X.reshape(-1, 1)) X_poly_scaled = scaler.fit_transform(X_poly) lin_reg = LinearRegression() lin_reg.fit(X_poly_scaled, y) # 预测时需要对新样本的多项式特征做同样的标准化处理 - 补充样本量或者排查异常值
如果你的训练样本量太少,或者X边界附近的样本存在异常值,也会放大过拟合的影响,补充边界位置的有效样本、剔除异常值也能提升拟合效果。
内容的提问来源于stack exchange,提问作者Tùng Dương Quang
相关产品推荐
相关产品推荐

