在机器学习中,经常需要处理非线性关系的数据。为了使用线性模型来拟合这些数据,可以引入多项式或样条变换来增加特征的非线性。本文将介绍如何使用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方法显示了图表。