趋近智
线性模型,如线性回归或逻辑回归,功能强大且易于理解,但它们天生假定特征与目标变量之间存在线性关系。当这种关系不是直线时会发生什么?一种扩展这些模型以捕捉非线性模式的方法是创建多项式特征。
本质上,多项式特征是通过将现有数值特征提升到一定幂次(如 , )或将特征相乘(交互项,如 )而得到的新特征。通过将这些非线性项添加到数据集中,线性模型可以学习曲线关系。
考虑一个包含一个特征 的简单数据集。如果与目标 的真实关系是二次的,例如 ,那么拟合 的标准线性模型将表现不佳。然而,如果我创建一个新特征 并使用 和 拟合一个线性模型,则模型变为 。就系数 () 而言,这仍然是一个线性模型,但它现在可以对原始特征 与目标 之间的二次关系进行建模。
Scikit-learn 在其 preprocessing 模块中提供了一个便捷的转换器 PolynomialFeatures,可以自动生成这些特征。
让我们看看它的实际运用。假设我们有一个包含两个特征 f1 和 f2 的简单数据集:
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
# 样本数据:3个样本,2个特征
X = np.array([[2, 3],
[4, 1],
[0, 5]])
# 初始化用于2次多项式的PolynomialFeatures转换器
# include_bias=False 移除常数项(由1组成的列)
poly = PolynomialFeatures(degree=2, include_bias=False)
# 拟合并转换数据
X_poly = poly.fit_transform(X)
print("原始特征:\n", X)
print("\n多项式特征(degree=2):\n", X_poly)
print("\n特征名称:", poly.get_feature_names_out(['f1', 'f2']))
输出将是:
Original features:
[[2 3]
[4 1]
[0 5]]
Polynomial features (degree=2):
[[ 2. 3. 4. 6. 9.] # f1, f2, f1^2, f1*f2, f2^2
[ 4. 1. 16. 4. 1.]
[ 0. 5. 0. 0. 25.]]
Feature names: ['f1' 'f2' 'f1^2' 'f1 f2' 'f2^2']
正如所见,PolynomialFeatures(degree=2) 生成了原始特征 (f1, f2)、平方项 (f1^2, f2^2) 和交互项 (f1*f2)。
PolynomialFeatures 的主要参数 (parameter)有:
degree: 最大多项式特征的次数。次数为2会生成高达 , 的项;次数为3会生成高达 , , 等的项。interaction_only: 如果设置为 True,则只生成交互特征(不同特征的乘积,如 ),而不生成单个特征的高次项(如 )。默认为 False。include_bias: 如果设置为 True(默认值),它会包含一个偏置 (bias)列(只包含1的特征)。这对于线性模型通常很有用,但如果后续的估计器处理截距,有时可能会冗余。我们在示例中将其设置为 False 以求清晰。让我们可视化添加多项式特征如何使线性模型拟合非线性数据。我们将创建合成数据,其中 大约是 的二次函数,并带有一些噪声。
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
# 假设 plotly 已导入为 px,graph_objects 已导入为 go
# 生成合成非线性数据
np.random.seed(42)
n_samples = 100
X = np.random.rand(n_samples, 1) * 10 - 5 # 特征值在 -5 到 5 之间
y = 0.8 * X**2 + 0.5 * X + 2 + np.random.randn(n_samples, 1) * 4 # 二次关系 + 噪声
# 1. 拟合标准线性回归
linear_reg = LinearRegression()
linear_reg.fit(X, y)
y_pred_linear = linear_reg.predict(X)
# 2. 创建多项式特征(2次)并拟合线性回归
poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.fit_transform(X)
poly_reg = LinearRegression()
poly_reg.fit(X_poly, y)
# 在网格上创建预测以获得平滑的线
X_grid = np.arange(-5, 5, 0.1).reshape(-1, 1)
X_grid_poly = poly_features.transform(X_grid)
y_pred_poly = poly_reg.predict(X_grid_poly)
y_pred_linear_grid = linear_reg.predict(X_grid) # 网格上的线性模型预测
# 创建 Plotly 图表
import plotly.graph_objects as go
fig = go.Figure()
# 添加原始数据的散点图
fig.add_trace(go.Scatter(x=X.flatten(), y=y.flatten(), mode='markers', name='原始数据',
marker=dict(color='#228be6', opacity=0.7)))
# 添加标准线性回归拟合的线
fig.add_trace(go.Scatter(x=X_grid.flatten(), y=y_pred_linear_grid.flatten(), mode='lines', name='线性拟合',
line=dict(color='#fa5252', width=2)))
# 添加多项式回归拟合的线
fig.add_trace(go.Scatter(x=X_grid.flatten(), y=y_pred_poly.flatten(), mode='lines', name='多项式拟合(2次)',
line=dict(color='#51cf66', width=2)))
fig.update_layout(
title="线性回归与多项式回归拟合对比",
xaxis_title="特征 (x)",
yaxis_title="目标 (y)",
legend_title="模型",
template="plotly_white",
width=700,
height=400,
margin=dict(l=20, r=20, t=50, b=20) # 减少边距
)
# fig.show() # 在实际环境中,这将显示图表
# 图表 JSON (单行用于嵌入)
chart_json = fig.to_json(pretty=False)
print(f"```plotly\n{chart_json}\n```")
标准线性拟合(红线)未能捕捉数据的曲线。多项式拟合(绿线),使用2次特征( 和 ),更好地对潜在的二次关系进行建模。
虽然功能强大,但多项式特征需要仔细考量:
PolynomialFeatures 之前,通常重要对特征进行缩放(例如,使用 StandardScaler 或 MinMaxScaler)。这是因为高次多项式项可能会导致非常大或非常小的值,可能引起数值不稳定,或者使模型对具有自然较大范围的特征敏感。缩放可确保所有特征更均匀地贡献。以下是您如何使用 Scikit-learn 管道集成缩放、多项式特征生成和正则化线性模型的方法:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
# 假设前述示例中的 X 和 y 可用
# 创建一个管道
poly_pipeline = Pipeline([
('scaler', StandardScaler()), # 首先缩放特征
('poly', PolynomialFeatures(degree=2, include_bias=False)), # 生成多项式特征
('ridge_reg', Ridge(alpha=1.0)) # 使用 Ridge 回归进行正则化
])
# 拟合管道
poly_pipeline.fit(X, y)
# 进行预测(管道处理缩放和转换)
# y_pred_pipeline = poly_pipeline.predict(X)
print("管道拟合成功。")
# print("前5个预测:", y_pred_pipeline[:5].flatten())
总而言之,多项式特征提供了一种直接的方法,为本质上是线性的模型增加非线性能力。通过生成平方项、立方项和交互项,您赋予这些模型学习更复杂模式的能力。然而,这种能力也伴随着管理增大的特征空间和过拟合的可能性的责任,通常需要仔细选择次数、特征缩放和正则化。
这部分内容有帮助吗?
PolynomialFeatures 转换器的官方文档,详细介绍了其参数、用法以及生成多项式和交互项的示例。© 2026 ApX Machine LearningAI伦理与透明度•