多项式和样条变换在回归分析中的应用

机器学习中,经常需要处理非线性关系的数据。为了使用线性模型来拟合这些数据,可以引入多项式或样条变换来增加特征的非线性。本文将介绍如何使用Python中的scikit-learn库来实现这一过程。

多项式特征生成

多项式特征生成是通过构造原始特征的高次幂来实现的。例如,如果原始特征是x,可以生成x的平方、立方等高次项作为新的特征。在scikit-learn中,可以使用PolynomialFeatures类来实现这一功能。

from sklearn.preprocessing import PolynomialFeatures # 假设有一组一维数据点 x_train = np.array([...]) # 训练数据 x_test = np.array([...]) # 测试数据 # 创建多项式特征生成器 poly = PolynomialFeatures(degree=3) # 转换训练和测试数据 X_train_poly = poly.fit_transform(x_train[:, np.newaxis]) X_test_poly = poly.transform(x_test[:, np.newaxis])

上述代码首先导入了PolynomialFeatures类,然后创建了一个多项式特征生成器实例,指定了最高次幂为3。接着,使用fit_transform方法来转换训练数据,并使用transform方法来转换测试数据。

样条变换

样条变换是另一种增加特征非线性的方法。它通过构造一组基函数来近似原始数据的非线性关系。在scikit-learn中,可以使用SplineTransformer类来实现这一功能。

from sklearn.preprocessing import SplineTransformer # 创建样条变换器 spline = SplineTransformer(n_knots=5, degree=3) # 转换训练和测试数据 X_train_spline = spline.fit_transform(x_train[:, np.newaxis]) X_test_spline = spline.transform(x_test[:, np.newaxis])

上述代码首先导入了SplineTransformer类,然后创建了一个样条变换器实例,指定了结点数为5,最高次幂为3。接着,使用fit_transform方法来转换训练数据,并使用transform方法来转换测试数据。

模型训练与预测

在生成了多项式或样条特征后,可以使用线性模型来训练这些特征。例如,可以使用Ridge回归模型来拟合数据。

from sklearn.linear_model import Ridge # 创建Ridge回归模型 ridge = Ridge(alpha=1e-3) # 训练模型 ridge.fit(X_train_poly, y_train) # 使用多项式特征 ridge.fit(X_train_spline, y_train) # 使用样条特征 # 进行预测 y_pred_poly = ridge.predict(X_test_poly) y_pred_spline = ridge.predict(X_test_spline)

上述代码首先导入了Ridge类,然后创建了一个Ridge回归模型实例,并指定了正则化参数alpha。接着,使用fit方法来训练模型,并使用predict方法来进行预测。

结果可视化

为了直观地比较多项式和样条变换的效果,可以将预测结果与真实数据进行可视化对比。

import matplotlib.pyplot as plt # 绘制真实数据 plt.scatter(x_train, y_train, label='训练数据') # 绘制多项式预测结果 plt.plot(x_test, y_pred_poly, label='多项式预测') # 绘制样条预测结果 plt.plot(x_test, y_pred_spline, label='样条预测') # 添加图例 plt.legend() # 显示图表 plt.show()

上述代码首先导入了matplotlib.pyplot模块,然后使用scatter方法绘制了训练数据点。接着,使用plot方法绘制了多项式和样条的预测结果,并添加了图例。最后,使用show方法显示了图表。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485