Skip to content

数据构成

本章目标

  1. 明确 SVR 数据的来源——loadSvrDataset() 使用 make_friedman1 生成非线性合成数据。
  2. 理解 Friedman1 的数据特性——前 5 维有效特征 + 后 5 维噪声特征 + 非线性目标函数。
  3. 理解标准化在 SVR 中的必要性——RBF 核基于欧氏距离,对特征尺度敏感。

重点方法与概念速览

名称类型作用
loadSvrDataset()方法调用 make_friedman1 生成 200 样本 × 10 特征的非线性回归数据
make_friedman1(...)函数scikit-learn 提供的 Friedman1 合成数据——目标函数高度非线性
x1~x10列名特征列——x1~x5 为有效特征,x6~x10 为噪声特征
price列名回归目标列——由 Friedman1 目标函数 + 噪声生成
StandardScaler预处理Z-score 标准化——SVR(RBF 核)的强制前置步骤

1. 数据入口:loadSvrDataset()

参数速览

适用函数:loadSvrDataset()

参数名类型说明示例取值
nSamplesint样本总数——来自 RegressionDatasetFactory 默认属性200
n_featuresint特征数——源码中固定为 1010
noisefloat标签噪声标准差1.0
randomStateint随机种子——保证数据可复现42
返回值DataFrame形状 (200, 11)——10 特征列 + 1 标签列

示例代码

python
def loadSvrDataset(self) -> DataFrame:
    X, y = make_friedman1(
        n_samples=self.nSamples,
        n_features=10,
        noise=1.0,
        random_state=self.randomState,
    )
    columns = [f"x{i + 1}" for i in range(X.shape[1])]
    data = DataFrame(X, columns=columns)
    data["price"] = y
    return data

理解重点

  • Friedman1 的目标函数是 y=10sin(πx1x2)+20(x30.5)2+10x4+5x5+ε——高度非线性,包含乘积项、平方项和正弦项。
  • 前 5 个特征(x1~x5)参与目标函数的生成——是真正的信号特征。
  • 后 5 个特征(x6~x10)是独立均匀随机变量——不参与目标函数,属于噪声特征。
  • 这种"有效特征 + 噪声特征"的数据结构,使得 SVR 的 RBF 核价值得以体现——线性模型无法捕捉非线性信号。

2. Friedman1 数据特性

参数速览

特性说明
样本数200小规模——适合 SVR 训练(SMO 复杂度 O(N2)~O(N3)
特征数10中等维度——5 个有效 + 5 个噪声
有效特征x1~x5参与目标函数的非线性组合
噪声特征x6~x10独立均匀分布——不含信号
目标函数10sin(πx1x2)+20(x30.5)2+10x4+5x5含乘积、平方、正弦——高度非线性
标签噪声N(0,12)叠加在目标函数上的高斯噪声

理解重点

  • 目标函数中 x1x2 以乘积形式出现——特征交互效应,线性模型无法捕捉。
  • sin(πx1x2) 是非线性的周期性分量——RBF 核的局部性天然适合拟合这种结构。
  • 200 样本是刻意的小规模设计——SVR 的 SMO 训练复杂度随样本量平方增长,小样本保证训练瞬时完成。
  • 与线性回归的合成数据(3 特征 × 纯线性公式)形成鲜明对比——SVR 的数据是故意非线性的。

3. 特征切分与标准化

参数速览

参数名类型说明示例取值
test_sizefloat测试集占比0.2
random_stateint切分随机种子42
训练集形状X_train: (160, 10), y_train: (160,)
测试集形状X_test: (40, 10), y_test: (40,)
StandardScaler预处理将每列特征标准化为均值 0、标准差 1

示例代码

python
X = data.drop(columns=["price"])
y = data["price"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

理解重点

  • SVR 的 RBF 核基于欧氏距离 xixj2——如果某特征量级远大于其他,会主导距离计算。
  • 标准化使所有特征在核计算中拥有平等权重——这是 SVR 强制 "standardScaler" 的根本原因。
  • 标准化在切分之后执行——fit_transform 仅用于训练集,transform 用于测试集。
  • 与线性回归和决策树回归不同——它们不需要标准化(PipelineSpec 中预处理为 None)。

4. 数据特征总览

参数速览

属性
样本总数200
特征总数10(5 有效 + 5 噪声)
训练样本数160(80%)
测试样本数40(20%)
标签列名price
是否有缺失值否——合成数据自动完整
数据来源sklearn.datasets.make_friedman1
目标函数非线性程度高——乘积 + 平方 + 正弦

理解重点

  • 200 样本 × 10 特征——与线性回归的数据规模相同(200 × 3),但非线性结构完全不同。
  • 5 有效 + 5 噪声的特征结构——与正则化回归的三层结构(原始 + 共线 + 噪声)思路相近,但 SVR 不追求观察特征选择而是观察核函数的非线性拟合。
  • Friedman1 的目标函数已知——可以像线性回归一样通过对比真实公式评估模型(但非线性公式无法直接提取系数)。

5. 数据设计意图:与线性回归/决策树回归/正则化回归的对比

数据维度线性回归决策树回归正则化回归SVR
数据来源手工合成真实数据(California Housing)真实 + 人工干扰(diabetes + 共线 + 噪声)合成非线性(Friedman1)
样本量20020640442200
特征数3821(10+3+8)10(5 有效 + 5 噪声)
特征关系完全独立自然相关刻意构造共线前 5 维以乘积/平方/正弦耦合
标签生成纯线性 + 高斯噪声真实加州房价真实糖尿病 + 噪声非线性函数 + 高斯噪声
标准化
设计意图透明验证 OLS大数据量树结构演示观察稀疏化与收缩展示 RBF 核的非线性拟合能力

常见坑

  1. 忽略 Friedman1 的后 5 维是噪声——期待 SVR 对所有 10 个特征都学到"有意义"的权重。
  2. 忘记 SVR 必须标准化——直接将原始 X_train 传入 SVR.fit(),RBF 核距离计算被量级大的特征主导。
  3. 在切分之前标准化——StandardScaler 的均值和标准差包含了测试集信息,造成数据泄露。
  4. 期待从 SVR 的 coef_ 中读出特征重要性——RBF 核的 SVR 没有 coef_ 属性。

小结

  • SVR 数据来自 make_friedman1——200 样本 × 10 特征,目标函数高度非线性(乘积 + 平方 + 正弦)。
  • 前 5 维为有效信号特征(x1~x5),后 5 维为噪声特征(x6~x10)——数据结构为展示 RBF 核的价值而设计。
  • 标准化是 SVR 的强制前置步骤——RBF 核的欧氏距离对特征尺度敏感。
  • 与线性回归数据的关键差异:SVR 的数据是非线性的——透明公式存在但无法从模型参数中直接提取。