如何使用scikit-learn实现多元多项式回归并提取对应多项式表达式
基于scikit-learn的任意阶多项式回归实现方案
核心逻辑
你不需要理解复杂的统计推导,多项式回归本质就是先对原始自变量做阶数扩展生成多项式特征,再代入线性回归模型拟合即可,和你已经实现的多元线性回归流程差异很小。
具体操作步骤
1. 导入依赖包
你之前做线性回归已经用到的包无需改动,只需要补充多项式特征转换的工具即可:
import numpy as np from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.model_selection import train_test_split from sklearn.metrics import r2_score, mean_squared_error
2. 生成指定阶数的多项式特征
建议先从2阶、3阶开始尝试,阶数过高极容易出现过拟合问题
# X为你的N个自变量数据集,y为对应的因变量 # 先拆分训练集、测试集,必须在特征转换前拆分,避免数据泄露 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义多项式转换器,degree参数填你需要的阶数,比如2就是二阶多项式 poly_converter = PolynomialFeatures(degree=2, include_bias=False) # 仅用训练集拟合转换器,同时生成训练集的多项式特征 X_train_poly = poly_converter.fit_transform(X_train) # 转换测试集特征,不要调用fit_transform,避免泄露测试集信息 X_test_poly = poly_converter.transform(X_test)
3. 拟合模型并评估效果
拟合逻辑和你之前用的线性回归完全一致:
# 初始化模型 poly_model = LinearRegression() # 拟合训练集 poly_model.fit(X_train_poly, y_train) # 效果评估 y_train_pred = poly_model.predict(X_train_poly) y_test_pred = poly_model.predict(X_test_poly) print(f"训练集R²:{r2_score(y_train, y_train_pred):.3f}") print(f"测试集R²:{r2_score(y_test, y_test_pred):.3f}")
如果测试集R²比你之前的纯线性回归更高,说明多项式拟合有效;如果训练集R²很高但测试集R²明显下降,说明已经过拟合,需要降低阶数。
更优的落地实现方案
方案1:带正则化的多项式回归(解决过拟合问题)
如果尝试更高阶数时出现过拟合,直接把LinearRegression替换为岭回归(Ridge)即可,自带正则化效果,只需调整alpha参数控制正则化强度,alpha越大越不容易过拟合,建议从0.1、1、10几个值尝试:
from sklearn.linear_model import Ridge poly_model = Ridge(alpha=1) # 后续拟合、预测逻辑和之前完全一致
方案2:用管道封装全流程(避免手动操作出错)
可以把特征转换、模型拟合两步封装成管道,不用手动处理特征转换的逻辑,减少出错概率:
from sklearn.pipeline import Pipeline # 定义管道,可直接替换degree、regressor的参数 poly_pipeline = Pipeline([ ('poly_feature', PolynomialFeatures(degree=2, include_bias=False)), ('regressor', Ridge(alpha=1)) ]) # 直接传入原始特征即可,无需手动转换 poly_pipeline.fit(X_train, y_train) y_test_pred = poly_pipeline.predict(X_test)
方案3:自动搜索最优参数
如果不想手动调试阶数、alpha参数,可以用网格搜索自动匹配最优组合:
from sklearn.model_selection import GridSearchCV # 定义要搜索的参数范围 params = { "poly_feature__degree": [2,3,4], "regressor__alpha": [0.1,1,10] } # 初始化搜索器 grid = GridSearchCV(poly_pipeline, params, cv=5, scoring='r2') grid.fit(X_train, y_train) # 输出最优参数和最优得分 print("最优参数:", grid.best_params_) print("交叉验证最优R²:", grid.best_score_) # 直接用最优模型预测 best_model = grid.best_estimator_ y_test_pred = best_model.predict(X_test)
内容的提问来源于stack exchange,提问作者scikitnoob
相关产品推荐
相关产品推荐

