如何用sklearn实现不同阶数的多特征多项式回归
实现针对X₁三阶、X₂一阶的多项式回归(sklearn)
步骤1:转换数据格式
sklearn的模型要求输入为二维数组格式,先把你的列表转换成符合要求的结构:
import numpy as np # 假设Y、X1、X2都是Python列表 Y = np.array(Y).reshape(-1, 1) # 转为(100,1)的标签数组 X = np.column_stack([X1, X2]) # 合并为(100,2)的特征矩阵,第0列是X1,第1列是X2
步骤2:分特征做多项式变换
用ColumnTransformer配合PolynomialFeatures,可以对不同特征列应用不同的变换规则:
from sklearn.preprocessing import PolynomialFeatures from sklearn.compose import ColumnTransformer # 定义预处理规则:对X1做3阶多项式变换,X2直接保留 preprocessor = ColumnTransformer( transformers=[ ('poly_x1', PolynomialFeatures(degree=3, include_bias=False), [0]), ('keep_x2', 'passthrough', [1]) ]) # 生成最终特征矩阵:包含X1、X1²、X1³、X2 X_transformed = preprocessor.fit_transform(X)
这里PolynomialFeatures(degree=3, include_bias=False)会生成X1的一次、二次、三次项;'passthrough'表示直接保留X2的原始值,最终得到的X_transformed是(100,4)的矩阵。
步骤3:训练回归模型
用线性回归模型完成训练和评估:
from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error # 初始化并训练模型 model = LinearRegression() model.fit(X_transformed, Y) # 查看模型参数 print("模型系数(对应X1、X1²、X1³、X2):", model.coef_[0]) print("截距:", model.intercept_[0]) # 预测与评估(可选) Y_pred = model.predict(X_transformed) print("均方误差:", mean_squared_error(Y, Y_pred))
替代方案:手动构造特征
如果不想用ColumnTransformer,也可以手动生成X1的多项式特征再合并:
# 手动生成X1的一、二、三次项 X1_poly = np.column_stack([X1, np.square(X1), np.power(X1, 3)]) # 合并X1多项式特征与X2 X_transformed = np.column_stack([X1_poly, X2]) # 后续训练步骤和上面一致
内容的提问来源于stack exchange,提问作者balbinka
相关产品推荐
相关产品推荐

