资讯动态

基展开与核方法:从显式特征改造到隐式内积计算的非线性建模指南

发布时间:2026/10/20 17:41:15 来源:尧图企业网站定制
很多做机器学习的朋友在早期都踩过同一个坑拿线性模型去拟合明显带曲线、有周期、有突变结构的数据拟合完一看残差基本全是被模型丢掉的模式。我当时也有很长一段时间处在换更复杂的模型这种思路里直到认真把基展开和核方法这套东西补上才真正理解了为什么有些模型能学会这种非线性以及这个学会背后的代价是什么。这篇文章算是一个迟到的补充笔记把基展开和核方法放在一起讲因为它俩本质上是同一件事的两面——一个显式地改造特征一个隐式地改造相似度理解了这层关系后面看核主成分分析、支持向量机、高斯过程这些东西都会顺很多。1. 先搞清楚要补什么线性模型输在表达空间不在于算法本身1.1 线性模型的本质是只有一条直线可以选线性回归、线性分类器这一类模型形式上写出来其实是同一件事对输入 (x) 做加权求和再加一个偏置然后看这个值落在哪里。对于回归任务就是直接预测数值对于分类任务就是把结果丢进逻辑斯蒂或符号函数里做决策。很多初学者觉得线性模型简单弱其实不是它笨而是它的假设空间限制得太死了——它假设目标值在原始特征空间里服从一个线性关系。比如说你手里只有一个特征 (x)数据本身是抛物线形状线性回归永远只能给出一条直线。无论你把损失函数优化得多彻底无论迭代多少轮最优解就是那根直线。问题出在表达空间不在优化算法。这句话值得记下来线性模型好不好不看算法看输入特征空间够不够用。如果模型输在特征表达上你往模型里加多少层、调多少参数都无济于事。这里的出路不是换一个更复杂的模型而是把数据换一种描述方式——这正是基展开要做的事情。1.2 一个朴素但关键的跳跃把单特征扩展成特征组合我最早接触到基展开是在统计学习里看样条回归。当时觉得非常震撼的一个点在于你完全不需要改变模型的结构只需要在原来自变量 (x) 边上再造出几个新的列比如 (x^2)、(x^3)然后把 (x) 和这些新列一起扔进线性回归里就能拟合抛物线、立方曲线了。这个操作的本质是把每一个原始特征表示成一组基函数的线性组合。数学上写出来就是[ f(x) \sum_{j1}^{m} \beta_j h_j(x) ]其中 (h_j(x)) 是你选定的一组基函数比如多项式、样条、高斯函数(\beta_j) 是待学习的权重。你看着像换了一个模型其实全靠的还是线性回归的那套最小二乘推导只是输入从 (x) 变成了由 ({h_1(x), h_2(x), \dots, h_m(x)}) 构成的新向量。我当时才意识到所谓非线性模型很多时候就是做了非线性特征变换后的线性模型。深度学习里的很多套路也可以用这个视角去理解只是变换函数由网络自己学而基展开里的变换函数是人工指定的。1.3 那这个补充和核方法有什么关系基展开讲到一个点就会卡住如果你把特征映射到非常高维的空间比如阶数很大的多项式甚至无限维的径向基函数展开那直接把这些新特征一一算出来的代价就变得不可接受。这时候就要换一种思路不直接构造特征而是通过核函数去计算两个样本在特征空间里的内积。核方法的核心观察在于很多线性算法的求解过程只依赖样本两两之间的内积并不依赖样本单独的特征向量。也就是说如果你能把内积有效地算出来就相当于隐式地在特征空间里做了计算。一句话总结这两者的关系基展开是显式地造新特征核方法是隐式地做同样的事但只通过内积发生。后面第二、三部分会分别讲透这两条路径。2. 基展开的显式路径自己动手造新特征你看得见每一步2.1 最常见的三类基函数及其适用场景先介绍直接使用的三类基函数各有各的道理别再看到展开就只知道多项式。多项式基(h_j(x) x^j)。适合全局平滑的曲线但阶数稍微高一点就会在边界震荡得很厉害这是它的老毛病。样条基把输入分段每一段用一个低阶多项式去拟合段与段连接处平滑。适合带有转折、分段特征的数据。回归样条和光滑样条的区别在于对节点位置和惩罚的处理实际使用中节点位置选择对效果有一定影响。径向基函数对每个中心位置 (c_j) 构造一个距离函数 (h_j(x)\exp(-|x-c_j|^2 / (2\sigma^2)))。适合局部结构比较复杂的数据它只关心离中心点近不远。从局部拟合开始逐步叠加出全局结构。工作中我比较推荐的做法是第一优先级看数据有没有明显的全局趋势比如单调、抛物线有就先用低次多项式数据有明显波动或分段行为直接考虑样条如果只想快速验证一个非线性建模思路不要纠结直接用高斯径向基然后配合正则化。2.2 一个可以照抄的最小演示多项式展开拟合我用一个非常简单的例子说明这套流程的质感。假设你拿到一列数据 (x) 和目标 (y)粗略画出来是一个先降后升的U型。这个形状在区间内用二次函数描述已经足够。代码可以这样写import numpy as np from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression x np.linspace(-2, 2, 100).reshape(-1, 1) y 0.5 * x.ravel()**2 - 0.8 * x.ravel() 1 0.05 * np.random.randn(100) # 构造二次基展开把 [x] 变成 [1, x, x^2] poly PolynomialFeatures(degree2, include_biasTrue) X_poly poly.fit_transform(x) model LinearRegression().fit(X_poly, y)这里X_poly就三列常数列、(x)、(x^2)。拟合出来的系数可以直接读出来解释性很强。你要是改成degree9就会发现训练集上拟合得很漂亮可一旦预测区间稍微超出样本范围曲线尾巴就开始剧烈波动。这个现象背后就是全局基的问题多项式基的每一项都对整个区间有影响局部一点的数据变动会牵动高阶项的系数大跳。解决办法大家都知道——加正则化把系数压住。但更本质的解法是换用局部支撑的基也就是样条或径向基那一类。2.3 显式基展开的边界成本维度是怎么膨胀的单变量做多项式展开还很轻松但特征一多起来就不对劲了。两个特征 (x_1, x_2) 做一次二次展开出来的组合包括 (x_1, x_2, x_1^2, x_1x_2, x_2^2)一共五个衍生特征。特征维度是 (p) 时二次展开的完整维度是 (O(p^2))三次展开直接到 (O(p^3))。如果你的原始特征有几十上百维显式算出新特征的开销和存储压力会很大。而且这还不止是多算了几列的问题。维度一高样本在高维空间里变得稀疏任何距离和相似度度量都会受到所谓判别困难的影响。此时如果不加正则化或者不控制基函数的数量过拟合几乎是必然事件。正是这些现实限制才把核方法推到了台前。核方法让我可以享受高维甚至无限维特征展开的拟合能力又不用真正去生成这些高维列——它跟我玩了一个巧妙的替换。3. 核方法的隐式路径不造特征只算内积3.1 从对偶问题看核技巧为什么能成立先回头看线性回归。它的解有闭式形式但很多求解过程里模型对样本的依赖形式其实是样本间的内积。拿支持向量机这类对偶问题来说决策函数的表达式最后长这样[ f(x) \sum_{i1}^{n} \alpha_i y_i \langle x_i, x \rangle b ]新样本 (x) 的预测值依赖的是它和每个训练样本 (x_i) 的内积。于是自然产生一个想法如果把 (x) 先映射成 (\phi(x))那就只需要能算 (\langle \phi(x_i), \phi(x)\rangle) 就够了。核函数干的就是这件事[ k(x_i, x) \langle \phi(x_i), \phi(x)\rangle ]你不需要知道 (\phi) 具体是什么——当然前提是你要确认这个 (k) 确实对应某个特征空间的内积。经典判据是核矩阵半正定通常作者会直接告诉你满足Mercer条件意思是这个函数可以被某些特征空间的内积表示。这里有个典型例子高斯径向基核[ k(x_i, x) \exp\left(-\frac{|x_i - x|^2}{2\sigma^2}\right) ]它对应的 (\phi(x)) 其实是无限维的。你在原始空间里看只有一维距离但在隐式特征空间里样本被铺开到一个无限维的空间。直接手工基展开根本写不出这种矩阵核方法却能轻松计算它。3.2 常用核的挑选逻辑列的这几个核不是随便选的它们对应的是不同的隐式几何。线性核(k(x_i, x) \langle x_i, x\rangle)。等于没做特征变换给一个基准参照。多项式核(k(x_i, x) (\langle x_i, x\rangle c)^d)。对应有限维的多项式型特征配合 (c) 可以控制高阶项和低阶项的相对权重。高斯径向基核前面写过是最常用的默认选项局部刻画能力强几乎适配任何平滑连续数据。拉普拉斯核它用L1距离而不是L2对异常值更不敏感但平滑度略差适合特征带有尖峰信号的数据。选核的基本原则我个人的总结是没有先验知识时优先高斯径向基它覆盖绝大多数连续值场景想要模型保留一点全局趋势解释能力可以试试多项式核想知道问题是否本质上线性可分先把线性核结果当作底线再拿非线性核和它对比提升幅度。3.3 高斯径向基核背后的宽度到底在控制什么高斯径向基核里的 (\sigma) 或者它的另一种写法 (\gamma1/(2\sigma^2)) 是最需要调的东西。你可以从函数图像的形状去理解(\gamma) 很小核函数随着距离增加衰减得很慢每个样本的影响力能传导到很远决策边界趋于平滑极端情况下接近线性模型。(\gamma) 很大衰减极快每个样本几乎只影响自己附近的一小片区域决策边界可以变得非常复杂能画出各种奇怪的孤岛但也特别容易过拟合。实际操作中我习惯把 (\gamma) 放在一个对数网格上做交叉验证比如从 (10^{-3}) 到 (10^{2})配合正则化参数 (C) 一起搜。注意先把特征标准化否则不同特征取值范围差异会被高斯核的距离项放大(\gamma) 就算调得再好效果也差一口气。4. 显式与隐式怎么选我的一套复现判断流程4.1 一张对比表看清两条路径的取舍对比维度显式基展开核方法特征构造可见、可控、可解释不可见通过核函数隐式定义典型开销特征数随阶数爆炸增长主要是核矩阵的 (O(n^2)) 存储与计算可解释性高能直接看到每个基的系数低决策依赖全体样本的内积适合样本量中小样本特征维度可控样本量适中太大后需要近似技术对数据类型的适配容易处理表格型数据天然处理结构化的向量数据也用于图、序列的相似度定义正则化方式系数惩罚直接加在显式项上通过核的缩放、宽度和算法内置惩罚项间接控制这里的样本量适中是核方法一个没法忽略的门槛。核方法要算任意两个样本的内积核矩阵是 (n \times n) 的。(n1000) 的时候很轻松(n10000) 就得考虑内存了(n100000) 以上直接上近似方法或者显式随机特征映射不然训练过程会很痛苦。4.2 我实际做项目时的决策顺序第一步永远先问这个需求到底需不需要非线性先用线性模型跑个基准如果测试误差已经可以接受别给自己找事。很多人一上来就上高斯核看似高级实际调参成本和解释成本都上去了。第二步问可解释性优先还是预测精度优先业务方要求能讲清楚每个特征怎么影响结果那就走显式基展开选低阶多项式或样条系数直接可读。如果只是要一个黑盒预测器核方法反而省事因为它把很多特征工程细节吸收掉了。第三步问数据规模在什么量级几百到几千样本核方法很舒服上万样本先尝试随机傅里叶特征近似再大就考虑显式基展开结合正则化或者直接换带核近似能力的梯度提升类模型。第三步里提到的随机特征近似值得多说两句。它的思路是把高斯核的内积改写成特定随机特征的期望然后采一组随机方向把样本投影成有限维特征。这样你可以继续用线性模型近似享受高斯核的表达能力。代码层面很多库都有现成实现试验的时候别自己从头写随机数生成先验证效果更重要。4.3 参数调起来的心法先粗后细少走两步弯路以高斯核配合逻辑回归或者支持向量机为例需要盯住的核心参数就两个正则化权重和核宽度。我的固定流程是先把数据标准化到零均值、单位方差。用一个较宽的网格粗搜核宽度从 (10^{-1}) 到 (10^{2})正则化强度从 (10^{-3}) 到 (10^{2})。观察误差热力图确定大致最优区域。在最优区域周围再做一次细化搜索。不要迷信单次交叉验证的数值尤其是样本少的时候折数一变结果浮动很大。最好把粗搜索和细搜索各做两遍确认最优区域稳定。5. 踩过的坑和现在固定下来的验证流程5.1 坑一核矩阵直接爆内存没有逃生计划有一回我处理文本TF-IDF特征维度很高但样本只有两万多想着高斯核肯定好使就训练的时候直接构建了全量核矩阵。结果内存一路飙升训练几乎无法继续。后来改成先降维再算核矩阵或者用随机特征近似才把这个问题绕过去。这个教训是先估算核矩阵的内存占用量再决定要不要走核方法。一个双精度浮点数占8字节两万样本的核矩阵就是 (20000^2 \times 8 3.2)GB还没算两份拷贝光是这个就能把普通的分析环境打爆。应对思路也简单降采样到合适规模、选用分块计算、或者换显式特征映射。5.2 坑二忘了特征缩放就调径向基核这是一个特别容易犯的低级错误。原始特征里年龄是0到80收入是几万到几十万两者直接混进高斯核的距离公式里收入项几乎垄断了整个距离年龄信息被彻底稀释。核宽度怎么调都救不回来因为你距离度量本身就已经失效了。所以任何用到依赖样本间距离的核包括高斯核、拉普拉斯核第一步必须做标准化。我自己现在已经把这步写进了固定的预处理模板不再靠临场记忆。5.3 坑三把能拟合训练集当成学到了结构有段时间我用带高斯核的模型在小样本上训练训练准确率几乎是满分心里挺高兴结果测试集一测直接崩了。原因很典型样本量太小核宽度设得太窄每个训练样本周围都成了一个独立的小领地。模型根本没有学全局结构只是把训练集背下来了。从那以后我的验证流程多了一条训练误差基本为零但测试误差很高的时候先怀疑模型太灵活再怀疑数据泄露。对核方法来说先放宽核宽度也就是减小 (\gamma)同时增强正则化再跑一轮交叉验证对比基本就能判断是过拟合还是真有数据问题。5.4 我现在的固定验证流程整理一下目前比较固定的流程可以当作一个操作清单参考标准化所有数值特征。跑线性模型得到基准线。若需要非线性同时准备显式基展开和径向基核两种方案。粗搜核参数和正则化参数记录误差与最优区域。检查训练误差与交叉验证误差的差距差距过大就缩小核宽度或加重正则化。用独立测试集做最终确认同时检查系数或支持向量的分布确认模型不是在边缘样本上跳舞。这套流程不一定最优但至少能让我每次在显式特征工程和隐式核技巧之间摇摆时有个稳定的落点。最后再分享一个经验层面的东西如果你刚从线性模型转过来别急着把核方法当成默认答案。先用一两个星期把显式基展开玩熟你会对特征工程产生完全不同的感觉。等你被高维特征的计算量逼到墙角再倒过来学核方法会发现书里那些抽象的公式突然全部落到地上——内积省算力的点核矩阵要内存的点过拟合要用正则化压住的点每一处都对应着你能真实摸到的问题。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑