第 22a 章 分类器:从 Bayes 规则到核方法
本章与第 22b 章共同对应 Wasserman 原书第 22 章《Classification》。分类问题是用特征 \(X\) 预测离散标签 \(Y\):明天涨还是跌、这只债券会不会违约、当前是高波动还是低波动状态、这笔订单是不是异常交易。本章先确立分类的"理论最优解"——Bayes 规则,然后按三条路径介绍逼近它的方法:估计类条件密度(LDA、QDA、朴素 Bayes)、估计回归函数(logistic 回归)、直接在一族分类器中最小化经验误差(树、SVM),最后介绍核化和集成方法。第 22b 章讨论同样重要的另一半:怎样诚实地评估分类器的错误率。
学习目标
- 理解 0-1 损失下 Bayes 规则 \(h^*(x)=\arg\max_k\pi_kf_k(x)\) 的最优性,并会证明。
- 会从高斯类条件密度推导 QDA 与 LDA,理解 Fisher 线性判别及其与 LDA 的关系。
- 理解 LDA 与 logistic 回归"模型形式相同、估计方式不同"的本质区别。
- 掌握朴素 Bayes、分类树(Gini 不纯度)、kNN、bagging、boosting 的原理和适用场景。
- 理解 SVM 的最大间隔原理、对偶问题和软间隔,理解核技巧为什么可行。
- 能在模拟的涨跌预测问题上比较各分类器,并知道低信噪比环境下哪些分类器容易过拟合。
读前导读
这一章在解决什么问题
结论:分类问题有一个理论上的最优答案(Bayes 规则),本章介绍的所有方法——LDA、logistic、树、SVM、boosting——都只是在用不同方式逼近它。
你在 CFA 里见过 logistic 回归(例如用财务比率预测违约)和信用评分模型(Altman Z-score 本质上就是一个线性判别函数)。本章把这些放进一个统一框架:给定特征 \(x\),算出"属于第 \(k\) 类"的后验概率,选最大的那个。难点只在后验概率未知,于是有三条路:估计每一类的特征分布(LDA、QDA、朴素 Bayes),直接估计后验概率(logistic),或者干脆不管概率、直接找错误最少的分界线(树、SVM)。
对量化最重要的两点:第一,金融数据的类别高度重叠,Bayes 错误率本身就很高(涨跌预测能做到 45% 已经很好),所以训练误差接近 0 的模型几乎一定是过拟合;第二,当误判上涨与误判下跌的代价不同时,判别阈值不应是 1/2。
需要先想起来的数学
1. Bayes 公式。 \(\mathbb P(Y=1\mid x)=\frac{\pi f_1(x)}{\pi f_1(x)+(1-\pi)f_0(x)}\)。例:10% 的债券会违约(\(\pi=0.1\)),某个预警信号在违约债券中出现的概率 0.8、在正常债券中 0.2,则看到信号后违约概率 \(=\frac{0.08}{0.08+0.18}\approx0.31\)。
2. 多元正态密度、马氏距离与行列式。 \(f(x)=\frac{1}{(2\pi)^{d/2}|\Sigma|^{1/2}}\exp\big(-\frac12(x-\mu)^T\Sigma^{-1}(x-\mu)\big)\)。\(|\Sigma|\) 是行列式,可以理解为分布"体积"的大小;\((x-\mu)^T\Sigma^{-1}(x-\mu)\) 是马氏距离的平方,即"按波动率和相关性标准化后的距离",一维时就是 \(z^2=\big(\frac{x-\mu}{\sigma}\big)^2\)。参见 第 00 册第 06 章 线性代数速成。
3. 梯度与拉格朗日乘子。 求多元函数的极值,令各方向偏导数(梯度)为零;有约束时引入乘子,把约束并入目标函数。你在均值–方差优化里见过的"在预算约束下最小化方差"就是这种问题。参见 第 00 册第 05 章 多元微积分与优化。
4. 记号 \(\arg\max\)、\(\text{sign}\)、\(\langle\cdot,\cdot\rangle\)。 \(\arg\max_kg(k)\) 是"使 \(g\) 最大的那个 \(k\)",而不是最大值本身;\(\text{sign}(z)\) 在 \(z>0\) 时为 \(+1\)、\(z<0\) 时为 \(-1\);\(\langle x,\tilde x\rangle=\sum_jx_j\tilde x_j\) 是内积。见 第 00 册第 08 章 读懂数学证明与符号。
怎么读这一章
核心必读:22a.2(Bayes 规则及其最优性、非对称阈值)、22a.3.2 LDA、22a.4.1(LDA 与 logistic 的关系)、22a.6 分类树、22a.9 的 bagging 与 boosting、22a.10 实战解读。22a.3.1 QDA 与 22a.3.3 Fisher 判别值得一读,Fisher 判别与 Sharpe 比的联系对金融读者很有启发。22a.7 SVM 的对偶问题和 22a.8 核化的 Mercer 定理、核化 Fisher 判别第一次可以只看结论:记住"对偶问题只依赖内积,所以可以换成核"这一句即可。建议顺序:22a.1–22a.2 → 22a.4 → 22a.3 → 22a.6 → 22a.9 → 22a.10,然后再读 SVM 与核化。
22a.1 问题与术语
数据 \((X_1,Y_1),\dots,(X_n,Y_n)\) IID,\(X_i=(X_{i1},\dots,X_{id})\in\mathcal X\subset\mathbb R^d\),\(Y_i\) 取值于有限集 \(\mathcal Y\)。分类规则(classification rule)是映射 \(h:\mathcal X\to\mathcal Y\),新观测 \(X\) 被预测为 \(h(X)\)。这个问题也叫监督学习(supervised learning)、判别(discrimination)或模式识别(pattern recognition)。
统计学和计算机科学对同一件事用不同的词,原书给了一张对照表:
| 统计学 | 机器学习 | 含义 |
|---|---|---|
| classification | supervised learning | 由 \(X\) 预测离散 \(Y\) |
| data | training sample | \((X_1,Y_1),\dots,(X_n,Y_n)\) |
| covariates | features | \(X_i\) |
| classifier | hypothesis | 映射 \(h\) |
| estimation | learning | 找一个好的分类器 |
例 22.1 / 22.2。 模拟数据中两组点可以被一条直线完全分开,但真实数据很少如此。CORIS 心脏病数据(462 人)用收缩压和烟草两个变量做线性判别,有 141 人被误分——两组大量重叠。这更接近金融数据的常态:类别高度重叠,最好的分类器也只比瞎猜好一点。
22a.2 错误率与 Bayes 分类器
定义 22.3。 真实错误率 \(L(h)=\mathbb P(h(X)\ne Y)\);经验(训练)错误率 \(\hat L_n(h)=\frac1n\sum_{i=1}^nI(h(X_i)\ne Y_i)\)。
先看二分类 \(\mathcal Y=\{0,1\}\)。回归函数 \(r(x)=\mathbb E(Y\mid X=x)=\mathbb P(Y=1\mid X=x)\),由 Bayes 定理
定义 22.4(Bayes 分类规则)。
定理 22.5(Bayes 规则最优)。 对任意分类规则 \(h\),\(L(h^*)\le L(h)\)。
证明。 固定 \(x\)。对任意 \(h\),
推导拆解:第一个式子:\(h(x)\) 只取 0 或 1。若 \(h(x)=1\),猜对的概率是 \(\mathbb P(Y=1\mid x)=r(x)\);若 \(h(x)=0\),猜对的概率是 \(1-r(x)\)。方括号把两种情况合写成一个式子(\(h=1\) 时第二项为 0,\(h=0\) 时第一项为 0),错分概率 = 1 − 猜对概率。
第二个式子:两式相减,\(1\) 抵消,得 \([h^*r+(1-h^*)(1-r)]-[hr+(1-h)(1-r)]=(h^*-h)r-(h^*-h)(1-r)=(h^*-h)(2r-1)\)。
数值例子:某天 \(r(x)=0.7\)(上涨概率 70%)。判"涨"的错误率 0.3,判"跌"的错误率 0.7,差 \(=0.4=|2\times0.7-1|\)。若 \(r(x)=0.52\),判错的额外代价只有 0.04——这正是低信噪比金融预测的常态:即使判断方向正确,也只比瞎猜好一点点。
最后"对 \(x\) 积分":每个 \(x\) 处都不比 \(h\) 差,按 \(x\) 的分布加权平均之后自然也不差。
这个证明还给出一个有用的式子:错分概率的差 = \(|2r(x)-1|\) × 两个规则是否不同。\(r(x)\) 接近 1/2 的地方,判错代价很小;\(r(x)\) 接近 0 或 1 的地方,判错代价很大。
多类情形(定理 22.6)。 \(\mathcal Y=\{1,\dots,K\}\) 时最优规则为
Bayes 规则依赖未知的 \(r\) 或 \((\pi_k,f_k)\)。原书概括了三条逼近路径:
- 经验风险最小化(ERM):选一族分类器 \(\mathcal H\),在其中找使错误率估计最小的 \(h\)(树、SVM);
- 回归:估计 \(\hat r\),令 \(\hat h(x)=I(\hat r(x)>\frac12)\)(logistic 回归、线性回归);
- 密度估计:分别估计 \(\hat f_0,\hat f_1\) 和 \(\hat\pi\),代入 (22.1)(LDA、QDA、朴素 Bayes)。
补充:阈值不必是 1/2。 0-1 损失对两类错误一视同仁。若把真实 0 判为 1 的代价是 \(c_{01}\)、反之为 \(c_{10}\),同样的证明给出最优规则 \(h(x)=I\big(r(x)>\frac{c_{01}}{c_{01}+c_{10}}\big)\)。交易中"误判上涨"和"误判下跌"的损失往往不对称(交易成本、赔率不同),阈值应据此调整。
金融直觉:推导只需一行。判 1 的期望损失是 \((1-r)c_{01}\)(真实为 0 时才错),判 0 的期望损失是 \(rc_{10}\);判 1 当且仅当前者更小,整理得 \(r>\frac{c_{01}}{c_{01}+c_{10}}\)。信用审批是典型例子:放贷给会违约的客户(损失本金约 60%)远比拒绝好客户(损失利差约 5%)代价大。设 \(Y=1\) 表示好客户(不违约)、判 1 即批准,误批代价 \(c_{01}=60\),误拒代价 \(c_{10}=5\),则只有当"不违约概率"超过 \(60/65\approx92\%\) 时才批准,而不是 50%。
22a.3 高斯类条件密度:QDA、LDA 与 Fisher 判别
22a.3.1 QDA
设 \(X\mid Y=k\sim N(\mu_k,\Sigma_k)\)。取对数,\(\log\pi_kf_k(x)\) 去掉与 \(k\) 无关的常数后为
推导拆解:(22.12) 从哪来?对多元正态密度取对数:\(\log f_k(x)=-\frac d2\log(2\pi)-\frac12\log|\Sigma_k|-\frac12(x-\mu_k)^T\Sigma_k^{-1}(x-\mu_k)\)(\(\log\) 把乘积变和,把 \(\exp\) 去掉,\(|\Sigma|^{-1/2}\) 变成 \(-\frac12\log|\Sigma|\))。第一项对所有类相同,比较大小时可以扔掉;再加上 \(\log\pi_k\) 即得 \(\delta_k\)。因为 \(\log\) 是单调递增的,比较 \(\pi_kf_k(x)\) 和比较它们的对数结论相同。
二分类规则 (22.10):\(\delta_1>\delta_0\),两边乘 \(-2\)(不等号反向)并移项,就是 \(r_1^2<r_0^2+2\log\frac{\pi_1}{\pi_0}+\log\frac{|\Sigma_0|}{|\Sigma_1|}\)。
白话解释:最后一项 \(\log\frac{|\Sigma_0|}{|\Sigma_1|}\) 的意思是:若第 1 类分布更"紧"(\(|\Sigma_1|\) 小),它的密度在中心附近更高,所以靠近它中心的点更应判给它;但同样距离下离开中心时它的密度掉得更快。例如"危机状态"的收益分布比"平稳状态"宽得多,一个 −4% 的日收益即使离平稳状态均值和危机状态均值的欧氏距离差不多,也会因为平稳状态太"窄"而被判为危机。
22a.3.2 LDA
若各类协方差相同 \(\Sigma_k=\Sigma\),\(\delta_k\) 中的 \(-\frac12x^T\Sigma^{-1}x\) 和 \(\log|\Sigma|\) 对所有 \(k\) 相同,可以删去,剩下
推导拆解:把二次型展开:\((x-\mu_k)^T\Sigma^{-1}(x-\mu_k)=x^T\Sigma^{-1}x-2x^T\Sigma^{-1}\mu_k+\mu_k^T\Sigma^{-1}\mu_k\)(类似 \((a-b)^2=a^2-2ab+b^2\);中间两项 \(x^T\Sigma^{-1}\mu_k\) 与 \(\mu_k^T\Sigma^{-1}x\) 相等,因为 \(\Sigma^{-1}\) 对称、结果是标量)。乘以 \(-\frac12\) 后,\(-\frac12x^T\Sigma^{-1}x\) 对每一类都一样,比较时抵消,剩下的就是 (22.13),只含 \(x\) 的一次项。
这是 \(x\) 的线性函数,决策边界 \(\{\delta_0=\delta_1\}\) 是超平面,称为线性判别分析(LDA)。\(\Sigma\) 的 MLE 是合并估计 \(S=\frac{n_0S_0+n_1S_1}{n_0+n_1}\)。\(\hat\delta_k\) 称为判别函数(discriminant function)。
例 22.8(CORIS)。 两个协变量时,LDA 错误率 \(141/462=0.31\),用全部协变量降到 0.27;QDA 分别为 0.31 和 0.26。本例中 QDA 相对 LDA 几乎没有优势——QDA 要为每一类估计一个完整协方差矩阵,参数多了,方差也大了。
22a.3.3 Fisher 线性判别
Fisher 的思路不同:先把 \(X\) 投影到一条直线 \(U=w^TX\) 上降为一维,选择"最能分开两组"的方向 \(w\)。分开得好意味着投影后组均值相距远、组内离散小,即最大化Rayleigh 系数
定理 22.10。 最优方向为 \(w=S_W^{-1}(\bar X_0-\bar X_1)\)。 证明。 令梯度为零:\(S_Bw\,(w^TS_Ww)=S_Ww\,(w^TS_Bw)\)。而 \(S_Bw=(\bar X_0-\bar X_1)\cdot[(\bar X_0-\bar X_1)^Tw]\) 总是与 \(\bar X_0-\bar X_1\) 同向,所以 \(S_Ww\propto\bar X_0-\bar X_1\)。比例常数不影响 \(J\)。\(\square\)
推导拆解:梯度那一步用的是商的求导法则。记分子 \(N(w)=w^TS_Bw\)、分母 \(D(w)=w^TS_Ww\),二次型的梯度是 \(\nabla(w^TAw)=2Aw\)(\(A\) 对称;一维时就是 \((aw^2)'=2aw\))。\(\nabla(N/D)=\frac{2S_Bw\cdot D-N\cdot2S_Ww}{D^2}\),令其为零即得证明中的等式。由于 \(D\)、\(N\) 都是标量,等式说的是"\(S_Ww\) 与 \(S_Bw\) 方向相同",而 \(S_Bw\) 永远指向 \(\bar X_0-\bar X_1\),所以 \(w\propto S_W^{-1}(\bar X_0-\bar X_1)\)(两边左乘 \(S_W^{-1}\))。
直观上,\(S_W^{-1}\) 的作用是"去相关、去波动":两个特征高度相关时,它们的信息有重叠,\(S_W^{-1}\) 会压低重复计算的部分,和马科维茨组合里 \(\Sigma^{-1}\) 压低相关资产的合计权重是同一机制。
Fisher 规则:令 \(m=\frac12(\bar X_0-\bar X_1)^TS_W^{-1}(\bar X_0+\bar X_1)\) 为两组投影均值的中点,\(w^Tx\ge m\) 判 0,否则判 1。当 \(\hat\pi=\frac12\) 时它与 LDA 完全相同。Fisher 判别不需要正态假设也能定义,这是它的优点。
Fisher 判别与信息比率。 \(w\propto\Sigma^{-1}(\mu_0-\mu_1)\) 与马科维茨最优组合权重 \(w\propto\Sigma^{-1}\mu\) 的形式完全相同,而 Rayleigh 系数的最大值 \((\mu_0-\mu_1)^T\Sigma^{-1}(\mu_0-\mu_1)\) 就是"平方 Sharpe 比"的形式。这不是巧合:两者都在"信号除以噪声"的意义下寻找最优线性组合(第 04 册、第 11 册会再次遇到)。
22a.4 回归路径:线性回归与 logistic 回归
直接估计 \(r(x)=\mathbb P(Y=1\mid X=x)\),令 \(\hat h(x)=I(\hat r(x)>\frac12)\)。
- 线性回归:\(Y=\beta_0+\sum_j\beta_jX_j+\epsilon\)。模型显然不对(不保证 \(\hat r\in[0,1]\)),但作为分类器有时并不差。
- logistic 回归:\(r(x)=\frac{e^{\beta_0+\beta^Tx}}{1+e^{\beta_0+\beta^Tx}}\),MLE 数值求解(第 13b 章)。
例 22.11 / 22.12(CORIS)。 logistic 回归错误率 0.27,线性回归 0.26;加入全部二次项和交互项后 logistic 错误率降至 0.22。加入更高阶项时拟合更好,但要面对偏差–方差权衡,第 22b 章会看到训练误差和交叉验证误差此时如何分道扬镳。
22a.4.1 logistic 回归与 LDA 的关系
等协方差高斯假设下,对数优势比为
- LDA 最大化完整的联合似然 \(\prod_if(X_i\mid Y_i)\prod_if(Y_i)\),其中 \(f(x\mid y)\) 是高斯,\(f(y)\) 是 Bernoulli;
- logistic 回归只最大化条件似然 \(\prod_if(Y_i\mid X_i)\),完全不管 \(f(X_i)\)。
分类只需要 \(f(y\mid x)\),不必为整个联合分布建模。logistic 回归不对 \(X\) 的分布做任何假设,所以更稳健;若高斯假设确实成立,LDA 利用了更多信息,估计更有效。金融特征很少是多元正态的(厚尾、偏斜、离散化),因此 logistic 回归通常是更安全的默认选择。
22a.5 朴素 Bayes
Bayes 规则 \(\arg\max_k\pi_kf_k(x)\) 中,若用核密度估计 \(f_k\),\(d\) 维时会撞上维数灾难(第 20 章)。**朴素 Bayes(naive Bayes)**假设在每一类内部各特征相互独立:
独立假设几乎总是错的,但分类器仍然可能很准:分类只需要 \(\arg\max\) 正确,不需要概率本身准确。朴素 Bayes 在高维离散特征(例如文本中的词频,\(\hat f_{kj}\) 就是频率)时最流行;在量化中可用于新闻、公告文本的情绪分类。
22a.6 分类树
树把特征空间递归地划分成矩形块,每块内按多数类分类,结果可以画成一棵树。例:若年龄 ≥ 50 判 \(Y=1\);若年龄 < 50,再看血压,收缩压 < 100 判 1,否则判 0。
构造。 先看单个特征、二分类。选分割点 \(t\),把数据分为 \(A_1=(-\infty,t]\) 与 \(A_2=(t,\infty)\),块内类别比例为 \(\hat p_s(j)\)。定义块的 Gini 指数 \(\gamma_s=1-\sum_j\hat p_s(j)^2\),分割的不纯度(impurity)为
白话解释:Gini 指数 \(1-\sum_j\hat p_s(j)^2\) 等于"从块里随机抽两个样本,它们类别不同的概率"。数值例子:一个块里涨 50%、跌 50%,\(\gamma=1-0.25-0.25=0.5\)(最混杂);涨 90%、跌 10%,\(\gamma=1-0.81-0.01=0.18\);全涨,\(\gamma=0\)。
再看未加权与加权的区别:设按动量把 100 天分成两块,左块 10 天全跌(\(\gamma=0\)),右块 90 天中 50 涨 40 跌(\(\gamma\approx0.494\))。未加权不纯度 \(0.494\);加权不纯度 \(10\times0+90\times0.494\approx44.4\)。未加权版本会偏爱"切出一小块纯样本"的分割,这在小样本的极端值上很容易过拟合,所以实务中用加权版本。
例 22.13 / 22.15(CORIS)。 完整的分类树训练误分率 0.21;只用烟草和年龄的树为 0.29。用 10 折交叉验证选树的大小,6 个叶最优,得到的树可以直接读成规则:年龄 < 31.5 判健康;31.5 到 50.5 之间看 A 型性格评分;年龄 ≥ 50.5 时看家族史和烟草量。
一直分到每片叶子只剩很少样本会严重过拟合。树的大小必须用估计的真实错误率来选,这是第 22b 章的内容。树容易解释、能自动处理交互和非线性、对特征的单调变换不敏感,但单棵树的方差很大,数据稍有变化,树的结构就可能完全不同。
22a.7 支持向量机
标签记为 \(\{-1,+1\}\),线性分类器 \(h(x)=\text{sign}(H(x))\),\(H(x)=a_0+\sum_{i=1}^da_ix_i\)。
22a.7.1 可分情形:最大间隔
引理 22.27。 数据可以被超平面分开,当且仅当存在 \(H\) 使
可分时分离超平面有无穷多个。直观上应选离两组数据"最远"的那个,即最大间隔超平面(maximum margin hyperplane)。点 \(x\) 到超平面 \(H=0\) 的距离是 \(|H(x)|/\|a\|\);在约束 (22.39) 下,最近点满足 \(|H|=1\),所以间隔(margin)等于 \(1/\|a\|\)。落在间隔边界上的点称为支持向量(support vectors)。
定理 22.28。 最大间隔超平面由下列问题给出:
定理 22.29(对偶问题)。 引入 Lagrange 乘子 \(\alpha_i\ge0\),最优解为 \(\hat a=\sum_i\hat\alpha_iY_iX_i\),其中 \(\hat\alpha\) 最大化
白话解释:为什么间隔是 \(1/\|a\|\)?\(H(x)=a_0+a^Tx\) 中,\(a\) 是超平面的法向量;把 \(H\) 除以 \(\|a\|\) 才是真正的几何距离(就像把收益除以波动率才得到标准化的 z 值)。约束把最近的点"钉"在 \(|H|=1\),所以它们的几何距离是 \(1/\|a\|\)。最大化 \(1/\|a\|\) 等价于最小化 \(\|a\|^2\),后者更容易求解(二次函数,光滑)。
对偶问题可以这样理解:每个样本点 \(i\) 有一个"影子价格" \(\alpha_i\),表示它的约束有多紧。离分界线很远的点约束不紧,影子价格为 0,对结果毫无影响;只有贴在间隔边界上的点(支持向量)\(\alpha_i>0\),它们决定了分界线。这和组合优化中"只有触及上下限的权重约束才有非零乘子"是同一个道理。因此 SVM 的解只取决于少数边界样本,这既是它的稳健之处,也意味着它对边界附近的噪声样本敏感。
22a.7.2 不可分情形:软间隔
数据重叠时允许违反约束:\(Y_iH(X_i)\ge1-\xi_i\),\(\xi_i\ge0\) 称为松弛变量(slack variables)。对偶问题形式不变,只是约束变为 \(0\le\alpha_i\le c\)。常数 \(c\) 控制允许的重叠量:\(c\) 大时几乎不容忍误分,间隔窄、方差大;\(c\) 小时间隔宽、偏差大。它是 SVM 的平滑参数,用交叉验证选择。
22a.8 核化
思想。 把特征 \(X\) 映射到更高维的空间 \(\mathcal Z\),在 \(\mathcal Z\) 里用简单的线性分类器。高维空间中的线性分类器,对应原空间中的非线性分类器——就像用多项式项扩充线性回归。
标准例。 \(x=(x_1,x_2)\),两组可以用一个椭圆分开但不能用直线分开。映射 \(\phi(x)=(x_1^2,\sqrt2x_1x_2,x_2^2)\) 到 \(\mathbb R^3\) 后,椭圆变成了平面,两组线性可分。
问题与解决。 维数膨胀很快:\(d=256\) 时若用全部四阶项,\(z\) 的维数达到 \(\binom{259}4=183{,}181{,}376\)。幸运的是两件事让我们免于计算 \(\phi\):(1) SVM 等许多分类器只需要内积;(2) 内积可以在原空间直接算:
核化的步骤:找映射 \(\phi\) 与分类器,使 (1) \(\mathcal Z\) 维数更高、分类器更丰富;(2) 分类器只需要内积;(3) 存在核函数 \(K\) 使 \(\langle\phi(x),\phi(\tilde x)\rangle=K(x,\tilde x)\);(4) 把算法中所有 \(\langle x,\tilde x\rangle\) 换成 \(K(x,\tilde x)\)。实践中根本不构造 \(\phi\),只需指定一个合法的核。Mercer 定理(粗略地)说:若 \(K\) 正定,即对平方可积的 \(f\) 有 \(\iint K(x,y)f(x)f(y)dxdy\ge0\),则存在相应的 \(\phi\)。常用核:
- 多项式核 \(K(x,\tilde x)=(\langle x,\tilde x\rangle+a)^r\);
- sigmoid 核 \(K=\tanh(a\langle x,\tilde x\rangle+b)\);
- 高斯(RBF)核 \(K=\exp\big(-\|x-\tilde x\|^2/(2\sigma^2)\big)\),对应无穷维的 \(\phi\)。
白话解释:核 \(K(x,\tilde x)\) 可以理解为"两个样本有多相似"。RBF 核在两点重合时为 1,距离越远越接近 0。核化 SVM 的分类器 \(\hat H(x)=\hat a_0+\sum_i\hat\alpha_iY_iK(x,X_i)\) 于是读作:"新样本和每个支持向量比相似度,相似的支持向量投票权大,按标签 \(Y_i\) 加权投票"。这和 kNN、第 20 章核回归的思路相近,只是权重 \(\hat\alpha_i\) 由优化选出。\(\sigma\) 小时只有很近的点才算相似,边界弯曲、容易过拟合;\(\sigma\) 大时边界接近线性。
"正定"在这里的意思是:任取 \(n\) 个点,矩阵 \([K(X_i,X_k)]\) 像协方差矩阵一样半正定(任何组合的"方差"非负)。这保证它确实是某个空间里的内积。
核化 SVM:把 (22.40) 中的内积换成核,即最大化 \(\sum_i\alpha_i-\frac12\sum_{i,k}\alpha_i\alpha_kY_iY_kK(X_i,X_k)\),分类器为 \(\hat H(x)=\hat a_0+\sum_i\hat\alpha_iY_iK(x,X_i)\)。
核化 Fisher 判别(简述)。 在 \(\mathcal Z\) 中最大化 Rayleigh 系数。可以证明最优 \(w\) 是 \(Z_i=\phi(X_i)\) 的线性组合 \(w=\sum_i\alpha_iZ_i\),于是 \(w^TS_Bw=\alpha^TM\alpha\),\(w^TS_Ww=\alpha^TN\alpha\),其中 \(M\)、\(N\) 只由核矩阵 \(K(X_i,X_s)\) 构成。最优 \(\hat\alpha=N^{-1}(M_0-M_1)\)(\(N\) 奇异时用 \(N+bI\)),投影为 \(u=\sum_i\hat\alpha_iK(X_i,x)\)。
核方法的计算代价是 \(n\times n\) 核矩阵:存储 \(O(n^2)\),求解通常 \(O(n^2)\) 到 \(O(n^3)\)。几十万样本的日频横截面数据或高频数据上,这会成为瓶颈。
22a.9 其他分类器
-
\(k\) 近邻(kNN):找离 \(x\) 最近的 \(k\) 个训练点,多数投票(平局随机打破)。\(k\) 是平滑参数:\(k\) 小方差大,\(k\) 大偏差大,用交叉验证选。它是第 20 章核回归在分类中的对应物,同样受维数灾难影响。
-
Bagging:抽 \(B\) 个 bootstrap 样本(第 08 章),每个样本训练一个分类器 \(\hat h_b\),多数投票:\(\hat h(x)=I\big(\frac1B\sum_b\hat h_b(x)\ge\frac12\big)\)。它是方差缩减技术,对树这类高度不稳定的分类器最有用。随机森林是 bagging 加上"每次分裂只在随机子集的特征中选"。
-
Boosting:从简单的弱分类器(例如只分一次的树,称为树桩 stump)出发,逐步加大被误分样本的权重。AdaBoost 算法(\(Y_i\in\{-1,1\}\)):
- 权重 \(w_i=1/n\);
- 对 \(j=1,\dots,J\):(a) 用当前权重拟合分类器 \(h_j\);(b) 加权错误率 \(\hat L_j=\frac{\sum_iw_iI(Y_i\ne h_j(X_i))}{\sum_iw_i}\);(c) \(\alpha_j=\log\frac{1-\hat L_j}{\hat L_j}\);(d) \(w_i\leftarrow w_ie^{\alpha_jI(Y_i\ne h_j(X_i))}\);
- 最终分类器 \(\hat h(x)=\text{sign}\big(\sum_j\alpha_jh_j(x)\big)\)。
白话解释:\(\alpha_j\) 既是第 \(j\) 个分类器的投票权,也是误分样本权重放大的倍数(取指数后)。数值例子:\(\hat L_j=0.3\) 时 \(\alpha_j=\log(0.7/0.3)\approx0.85\),误分样本权重乘 \(e^{0.85}\approx2.33\);\(\hat L_j=0.45\)(只比瞎猜好一点)时 \(\alpha_j\approx0.20\),投票权很小;\(\hat L_j=0.5\) 时 \(\alpha_j=0\),完全没用。在金融这种单个弱分类器只有 0.48 左右错误率的场景,每一轮的改进都很小,而权重会不断集中到"最难分"的样本上——它们常常就是噪声或异常点,这是 boosting 在低信噪比数据上容易过拟合的原因。
boosting 可以看作偏差缩减技术:从高偏差的简单分类器出发逐步降低偏差。缺点是最终分类器很复杂、难以解释。现代梯度提升树(GBDT、XGBoost、LightGBM)是它的直接后代,也是当前量化中最常用的非线性 alpha 模型之一。
-
神经网络:最简单的形式 \(Y=\beta_0+\sum_{j=1}^p\beta_j\sigma(\alpha_0+\alpha^TX)\),\(\sigma\) 常取 logistic 函数,本质是非线性回归。原书(2004 年)认为它计算困难、有多个局部极小、项数 \(p\) 是需要权衡的平滑参数。此后深度学习的发展改变了这一评价,详见第 10 册。
22a.10 量化实战:涨跌分类器的比较
场景。 两部分实验。第一部分验证 22a.4.1 节的结论:等协方差高斯数据上,LDA 和 logistic 估计的是同一个对数优势比斜率 \(\Sigma^{-1}(\mu_1-\mu_0)\)。第二部分模拟一个"次日涨跌"分类问题:5 个特征中只有"动量" \(x_0\) 和"波动率" \(x_1\) 有用,真实对数优势比含二次项和交互项(\(0.6x_0-0.5(x_1^2-1)+0.4x_0x_1\)),其余 3 个特征是噪声。信噪比很低,Bayes 错误率约 35%。用 3000 个样本训练,在 10 万个新样本上测试。
import numpy as np, warnings
warnings.filterwarnings("ignore")
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA, QuadraticDiscriminantAnalysis as QDA
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import BaggingClassifier, AdaBoostClassifier
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.pipeline import make_pipeline
rng = np.random.default_rng(22)
# ---------- (1) 等协方差高斯:LDA 与 logistic 估计同一个线性对数优势比 ----------
n = 4000
mu0, mu1 = np.array([0.0, 0.0]), np.array([0.3, -0.2])
S = np.array([[1.0, 0.5], [0.5, 1.0]])
y = rng.binomial(1, 0.5, n)
X = np.where(y[:, None] == 1, mu1, mu0) + rng.multivariate_normal([0, 0], S, n)
alpha_true = np.linalg.solve(S, mu1 - mu0)
lda = LDA().fit(X, y); lr = LogisticRegression(C=1e6).fit(X, y)
print("理论 Σ^{-1}(μ1-μ0) =", alpha_true.round(3))
print("LDA 系数 =", lda.coef_[0].round(3))
print("logistic 系数 =", lr.coef_[0].round(3))
# ---------- (2) 非线性边界的“涨跌”分类:各分类器比较 ----------
def make(n):
X = rng.standard_normal((n, 5)) # x0=动量, x1=波动率, x2..x4 为无关特征
logit = 0.6 * X[:, 0] - 0.5 * (X[:, 1] ** 2 - 1) + 0.4 * X[:, 0] * X[:, 1]
p = 1 / (1 + np.exp(-logit))
return X, rng.binomial(1, p), p
Xtr, ytr, _ = make(3000)
Xte, yte, pte = make(100000)
bayes_err = np.mean(np.minimum(pte, 1 - pte))
print("Bayes 错误率(已知真实 r(x))= %.3f" % bayes_err)
models = {
"LDA": LDA(), "QDA": QDA(),
"logistic(线性)": LogisticRegression(),
"logistic(二次项)": make_pipeline(PolynomialFeatures(2), StandardScaler(), LogisticRegression(max_iter=2000)),
"朴素Bayes": GaussianNB(),
"树(深度不限)": DecisionTreeClassifier(random_state=0),
"树(深度4)": DecisionTreeClassifier(max_depth=4, random_state=0),
"Bagging(树)": BaggingClassifier(DecisionTreeClassifier(), n_estimators=200, random_state=0),
"AdaBoost(树桩)": AdaBoostClassifier(n_estimators=200, random_state=0),
"SVM(RBF核)": make_pipeline(StandardScaler(), SVC(C=1.0, gamma="scale")),
"kNN(k=50)": KNeighborsClassifier(50),
}
print("%-16s %8s %8s" % ("分类器", "训练误差", "测试误差"))
for name, m in models.items():
m.fit(Xtr, ytr)
print("%-16s %8.3f %8.3f" % (name, 1 - m.score(Xtr, ytr), 1 - m.score(Xte, yte)))
关键输出:
理论 Σ^{-1}(μ1-μ0) = [ 0.533 -0.467]
LDA 系数 = [ 0.544 -0.418]
logistic 系数 = [ 0.544 -0.418]
Bayes 错误率(已知真实 r(x))= 0.347
分类器 训练误差 测试误差
LDA 0.396 0.398
QDA 0.338 0.350
logistic(线性) 0.396 0.398
logistic(二次项) 0.338 0.349
朴素Bayes 0.350 0.355
树(深度不限) 0.000 0.427
树(深度4) 0.336 0.362
Bagging(树) 0.000 0.378
AdaBoost(树桩) 0.338 0.356
SVM(RBF核) 0.324 0.355
kNN(k=50) 0.343 0.363
解读。
- LDA 与 logistic 一致。 两者给出相同的斜率(差异在小数第四位之后),都在抽样误差范围内接近理论值。高斯假设成立时,两种估计方式殊途同归。
- 模型结构对上了,简单方法最好。 真实对数优势比是二次的,所以含二次项的 logistic(0.349)和 QDA(0.350)几乎达到 Bayes 错误率(0.347)。线性方法(0.398)缺了二次结构,偏差大。在量化中这意味着:先想清楚信号可能的函数形式(例如波动率的 U 形效应、动量与波动率的交互),再用低容量模型去拟合,往往胜过把特征丢给高容量模型。
- 高容量模型在低信噪比下过拟合。 不限深度的树训练误差为 0,测试误差 0.427,比线性模型还差;bagging 把它降到 0.378,正是方差缩减的效果,但仍然不如限制深度的单棵树(0.362)。训练误差和测试误差之间的巨大缺口,就是第 22b 章要讨论的问题。
- 无关特征的代价。 三个噪声特征对 kNN 和不限深度的树伤害最大,因为它们在距离计算或分裂选择中引入了随机性。金融数据中特征往往成百上千,其中多数没有信息,特征筛选和正则化必不可少。
本章小结
0-1 损失下 Bayes 规则 \(\arg\max_k\pi_kf_k(x)\) 是最优分类器,所有实际方法都在逼近它,路径有三条:估计类条件密度、估计回归函数、在一族分类器中最小化经验误差。高斯类条件密度导出 QDA,等协方差时导出 LDA;Fisher 判别 \(w=S_W^{-1}(\bar X_0-\bar X_1)\) 不依赖正态假设,在 \(\hat\pi=1/2\) 时与 LDA 相同。LDA 与 logistic 回归的模型形式相同,LDA 用联合似然,logistic 只用条件似然,因而更稳健。朴素 Bayes 用类内独立假设绕开高维密度估计;树用 Gini 不纯度递归划分,必须控制大小。SVM 最大化间隔,对偶问题只依赖内积,因此可以核化;核技巧让高维线性分类器在原空间表现为非线性分类器,而无需显式计算映射。bagging 降方差,boosting 降偏差。
| 概念 | 公式 / 要点 |
|---|---|
| Bayes 规则 | \(h^*(x)=\arg\max_k\pi_kf_k(x)\);二分类 \(I(r(x)>1/2)\) |
| 最优性证明核心 | \(\mathbb P(h\ne Y\mid x)-\mathbb P(h^*\ne Y\mid x)=(2r-1)(h^*-h)\ge0\) |
| 非对称损失阈值 | \(I\big(r(x)>c_{01}/(c_{01}+c_{10})\big)\) |
| QDA | \(\delta_k=-\frac12\log\vert \Sigma_k\vert -\frac12(x-\mu_k)^T\Sigma_k^{-1}(x-\mu_k)+\log\pi_k\) |
| LDA | \(\delta_k=x^T\Sigma^{-1}\mu_k-\frac12\mu_k^T\Sigma^{-1}\mu_k+\log\pi_k\) |
| Fisher 判别 | \(w=S_W^{-1}(\bar X_0-\bar X_1)\),最大化 \(\frac{w^TS_Bw}{w^TS_Ww}\) |
| LDA vs logistic | 同为 \(\log\frac{P(1\mid x)}{P(0\mid x)}=\alpha_0+\alpha^Tx\);联合似然 vs 条件似然 |
| 朴素 Bayes | \(f_k(x)=\prod_jf_{kj}(x_j)\) |
| Gini 不纯度 | \(\gamma_s=1-\sum_j\hat p_s(j)^2\) |
| SVM | \(\min\frac12|a|^2\) s.t. \(Y_iH(X_i)\ge1\);间隔 \(1/|a|\) |
| SVM 对偶 | \(\max\sum\alpha_i-\frac12\sum\alpha_i\alpha_kY_iY_kK(X_i,X_k)\),\(0\le\alpha_i\le c\) |
| 核技巧 | \(\langle\phi(x),\phi(\tilde x)\rangle=K(x,\tilde x)\);Mercer:正定核 |
| AdaBoost 权重 | \(\alpha_j=\log\frac{1-\hat L_j}{\hat L_j}\),误分样本权重乘 \(e^{\alpha_j}\) |
练习
基础
- 证明 Bayes 规则最优(定理 22.5,原书习题 1),并推广到非对称损失,导出阈值 \(c_{01}/(c_{01}+c_{10})\)。
- 证明定理 22.7(原书习题 2):高斯类条件密度下 Bayes 规则为 (22.10)。
- 从 (22.12) 出发,在 \(\Sigma_0=\Sigma_1\) 时推导 LDA 判别函数 (22.13),并写出两类 LDA 决策边界的方程。
- 原书习题 7:\(X_i\in\mathbb R\),\(|X_i|\le1\) 时 \(Y_i=1\),否则 \(Y_i=0\)。证明没有线性分类器能完美分类,而映射 \(Z_i=(X_i,X_i^2)\) 后可以线性分开。
- 验证 \(\phi(x)=(x_1^2,\sqrt2x_1x_2,x_2^2)\) 满足 \(\langle\phi(x),\phi(\tilde x)\rangle=\langle x,\tilde x\rangle^2\);写出与核 \((\langle x,\tilde x\rangle+1)^2\) 对应的 \(\phi\)(\(d=2\))。
- 两类各占一半,\(X\mid Y=0\sim N(0,1)\),\(X\mid Y=1\sim N(1,1)\)。求 Bayes 规则与 Bayes 错误率。(答案:\(x>1/2\) 判 1;错误率 \(\Phi(-1/2)\approx0.309\)。这说明一个"均值差半个标准差"的特征只能把错误率从 50% 降到 31%。)
进阶
- 原书习题 3(改写):用 22a.10 节的模拟数据(或你自己的股票特征数据),比较 LDA、QDA、logistic、分类树,报告训练误差和 2×2 混淆矩阵,再用 5 折交叉验证估计 LDA 与 logistic 的准确率。
- 证明 Fisher 判别的最优方向(定理 22.10),并说明 Rayleigh 系数的最大值为 \((\bar X_0-\bar X_1)^TS_W^{-1}(\bar X_0-\bar X_1)\)。把它与 \(N\) 个资产的最大平方 Sharpe 比 \(\mu^T\Sigma^{-1}\mu\) 对照,解释两者的共同结构。
- 原书习题 11、12:对一个数据集先拟合分类树,再用 bagging;然后用树桩做 AdaBoost。随 \(B\) 或 \(J\) 增加,训练误差和测试误差如何变化?
- 在 22a.10 节代码中把训练样本从 3000 增加到 30000,哪些分类器的测试误差改善最多?用偏差–方差的语言解释。
原书推荐习题:第 22 章习题 1、2、3、7、11、12。
原书对照
| 本章内容 | 原书章节 | PDF 页码 |
|---|---|---|
| 分类问题、术语对照,例 22.1–22.2 | 22.1 | p.353–354 |
| 错误率、Bayes 分类器,定理 22.5–22.6 | 22.2 | p.354–356 |
| QDA、LDA、Fisher 判别,例 22.8,定理 22.7–22.10 | 22.3 | p.357–360 |
| 线性回归与 logistic 回归,例 22.11–22.12 | 22.4 | p.360–362 |
| logistic 回归与 LDA 的关系 | 22.5 | p.362–363 |
| 密度估计与朴素 Bayes | 22.6 | p.363–364 |
| 分类树,例 22.13 | 22.7 | p.364–366 |
| 支持向量机,引理 22.27,定理 22.28–22.29 | 22.9 | p.372–375 |
| 核化、Mercer 定理、核化 Fisher 判别与 SVM | 22.10 | p.375–379 |
| kNN、bagging、boosting、神经网络 | 22.11 | p.379–380 |
| 文献注(Hastie et al. 2001;Devroye et al. 1996;Vapnik 1998) | 22.12 | p.381 |
| 非对称损失阈值、Fisher 判别与 Sharpe 比的对照(本教材补充) | — | — |