一、特征工程(Feature Engineering)
1. 定义
特征工程 是指:
通过对原始特征进行转换、组合或提取,生成新的、更能表达数据规律的特征,从而提升模型性能。
机器学习中有句话:
"数据和特征决定了机器学习的上限,模型只是逼近这个上限。"
2. 特征工程的核心思想
-
用已有的原始特征 x1,x2,...,xn 生成新的组合特征;
-
让模型能更好地捕捉非线性关系;
-
在保持模型简单的前提下,提高拟合能力。
3. 示例:房价预测中的特征构造
假设我们原本只有两个特征:
特征 | 含义 |
---|---|
x1 | 房屋长度(m) |
x2 | 房屋宽度(m) |
可以生成新的特征:

含义:房屋面积(平方米)
这样,新的特征 x3 捕捉了原始特征间的交互关系,模型就能更好地学习面积与房价之间的非线性映射。
4. 其他常见特征工程方法
方法 | 示例 | 含义 |
---|---|---|
交叉特征 | ![]() |
捕捉交互作用 |
多项式特征 | ![]() |
表达非线性关系 |
对数/平方根 | ![]() |
缩小数值范围 |
离散化 | 房价区间分类 | 简化连续变量 |
独热编码(One-hot) | 城市名称 → [0,1] 向量 | 表示类别型特征 |
二、多项式回归(Polynomial Regression)
1. 背景
线性回归假设输入与输出之间是线性关系:

但在很多真实问题中,关系往往是非线性的,比如:
"面积增加带来的房价提升不是恒定的,而是先快后慢。"
2. 思路
通过添加多项式特征,将原来的线性模型扩展为非线性模型:

虽然包含了平方、立方项,但模型本质上仍是线性的 ------因为它对参数 w1,w2,w3 是线性的。
3. 多项式特征示例
假设原始特征只有一个 x:
原特征 | 扩展特征 |
---|---|
x | ![]() |
模型变为:

这样,曲线就能更好地拟合复杂数据。
4. 代码实现(以房价为例)
python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
# 模拟数据
x = np.linspace(0, 10, 30).reshape(-1, 1)
y = 2 + 1.5*x - 0.3*(x**2) + np.random.randn(30,1)*2
# 生成二次多项式特征
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(x)
# 拟合模型
model = LinearRegression()
model.fit(X_poly, y)
# 预测
y_pred = model.predict(X_poly)
# 可视化
plt.scatter(x, y, color='blue', label='Data')
plt.plot(x, y_pred, color='red', label='Polynomial Fit')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
输出结果:红色曲线是一条平滑的二次曲线,比单纯的直线拟合效果更好。

5. 多项式回归的优缺点
优点 | 缺点 |
---|---|
能拟合非线性数据 | 容易过拟合 |
模型形式简单 | 高阶特征导致计算量上升 |
可用线性回归求解 | 需要进行特征缩放 |
6. 模型关系总结
模型 | 特征形式 | 是否线性 |
---|---|---|
线性回归 | x | 线性 |
多项式回归 | ![]() |
参数线性、输入非线性 |
特征交叉回归 | ![]() |
表达交互关系 |
三、例子:房价的多项式回归预测
1. 问题
假设房价 yyy 与房屋面积 x 的关系并非简单线性:
面积(㎡) | 房价(万元) |
---|---|
50 | 100 |
80 | 160 |
100 | 200 |
120 | 240 |
150 | 260 |
180 | 270 |
你会发现:当面积增大时,房价增长逐渐放缓 ,属于典型的非线性关系。
2. 一阶线性回归拟合
线性模型:

拟合后发现,高面积段误差较大(欠拟合)。
3. 二阶多项式回归拟合
扩展特征:

模型变为:

此时曲线能更好地贴合真实趋势,误差显著降低。
4. 可视化结果
python
# 房价数据
x = np.array([50, 80, 100, 120, 150, 180]).reshape(-1,1)
y = np.array([100, 160, 200, 240, 260, 270])
# 多项式拟合
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(x)
model = LinearRegression()
model.fit(X_poly, y)
y_pred = model.predict(X_poly)
plt.scatter(x, y, label='True data')
plt.plot(x, y_pred, color='r', label='Polynomial Regression (degree=2)')
plt.xlabel('Area (m²)')
plt.ylabel('Price (10k yuan)')
plt.legend()
plt.show()
输出结果:是一条弯曲的红线,在中高段能更好地拟合真实房价走势。

四、 总结
内容 | 含义 | 举例 |
---|---|---|
特征工程 | 构造新特征提高模型表现 | 面积 = 长 × 宽 |
多项式回归 | 增加高次项拟合非线性关系 | ![]() |
特征交互 | 表达特征之间的关系 | ![]() |