ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RVM分类与预测实战:小样本场景下比SVM更省更稳的稀疏贝叶斯模型

RVM分类与预测实战:小样本场景下比SVM更省更稳的稀疏贝叶斯模型 简介RVM相关向量机是一种基于稀疏贝叶斯学习的核方法常用于分类与回归任务。这份资源围绕RVM分类与预测算法整理了MATLAB实现包面向机器学习初学者及需要快速落地算法对比的研究者压缩包内共7个文件其中5个为MATLAB源程序2个为PDF理论文档总体积仅1.61MB目前已有151人学习。源程序涵盖环境初始化、核函数定义、模型训练、后验参数估计与预测输出等关键环节能够完整复现RVM从训练到预测的流程PDF文档则包括原始论文的稀疏贝叶斯学习讲解以及算法综述正好弥补了纯代码缺乏原理说明的短板。通过对照文档阅读代码读者可以直观理解相关向量的选取过程、模型稀疏性来源以及核函数选择的影响进而掌握RVM在分类与预测中的使用技巧。对于希望从SVM迁移到贝叶斯稀疏模型的用户来说这份小体积资源是一条不错的上手路径。1. RVM分类与预测小样本场景下为什么值得先试它做分类和预测的工程师手头样本只有几十到几百条时最先想到的往往是SVM或者随机森林。但真把SVM拿去跑会碰到一个绕不过去的问题支持向量数量随着样本增加几乎线性增长模型越来越大预测阶段越来越慢而且决策边界对惩罚系数C和核参数特别敏感。RVM相关向量机Relevance Vector Machine是Michael Tipping在2001年提出的模型它走的是另一条路——在贝叶斯框架下给每个权重配一个超参数训练完大部分权重被自动压到零只剩下少数“相关向量”保留下来。对小样本分类、消费预测这类特征维度不高但数据量紧张的场景RVM分类器往往比SVM更省模型、更稳还额外给出一个预测概率方便后续做风险判断和排序。这篇文章面向两类读者一类是刚接触RVM、想在MATLAB里跑通分类和预测的初学者另一类是用SVM或BP网络做到头、想换一个泛化更好模型的熟手。接下来我会从原理讲到MATLAB实现再落到参数调优和踩坑记录全程以可复现代码为主线。先立住一个结论RVM不是万能的但在小样本、低维、需要概率输出的场景下它值得你优先试一遍。2. RVM的工作机制稀疏贝叶斯框架与三个必懂概念2.1 相关向量和SVM支持向量的区别稀疏性的源头不一样SVM通过最大化间隔来确定少数支持向量间隔越宽泛化越好。但SVM对核函数是否满足Mercer条件有硬性要求比如sigmoid核在某些参数下不满足而且支持向量数量一般随着样本量增长而增长模型在线的预测时长会越来越难看。RVM的稀疏性不是靠几何间隔挤出来的而是在贝叶斯框架里用自动相关判定ARD机制压出来的。每个训练样本对应一个权重参数这些权重各自配一个独立的超参数alpha。训练过程里绝大部分alpha被迭代推到很大的值对应权重被压到接近零这些样本就从模型里“剪掉”只有少数alpha保持很小权重有实质数值这些样本就是相关向量Relevance Vector。这意味着RVM的稀疏性来自后验概率分布的形状而不是显式的损失函数。直观体验是同样一个二分类问题SVM可能留下50个支持向量RVM可能只留下8个相关向量预测一个点少做42次核函数计算。代价是训练过程复杂很多——迭代求解一个边际似然的最大化每一步都要做矩阵求逆。2.2 核函数与特征空间RVM分类选哪种核RVM对核函数的约束比SVM弱不要求核矩阵满足Mercer条件因为不需要解对偶问题。但实际用下来高斯RBF核仍是最省事的默认选择因为它的局部性足够强不容易把特征空间搞成均匀糊掉的状态。MATLAB里常见的RVM工具箱核函数一般写成类似kernel(gaussian, width)的形式这个width就是RBF核的宽度参数直接控制每个训练样本的影响半径。宽度太大所有样本的核值都接近相等决策边界退化成线性宽度太小每个样本只对自己附近一小片有影响相关向量数量上升过拟合风险增加。对分类任务还有一个容易忽略的点核矩阵是N×N的N是训练样本数。样本量到3000以上每次迭代的矩阵求逆就会让训练时间从秒级跳到分钟级。所以RVM分类更适合N在几百到一千多这个区间。特征维度高到上万时RVM也会吃力这时候更推荐先用线性核或降维再上RVM。2.3 超参数自动估计为什么不用网格搜索调C和gammaSVM最让人头痛的是两个超参数惩罚系数C和核宽度。通常的做法是grid search加交叉验证一组参数跑几十次样本量小的时候还容易选到过拟合的组合。RVM把这个问题有一部分转移到模型内部权重后验分布的超参数alpha和噪声方差sigma_squared都通过最大化边际似然自动估计训练结束时alpha已经收敛不需要额外去调一个“C”。唯一需要人工指定的主要是核宽度外加迭代次数上限。有一个细节值得注意虽然不用网格搜C核宽度依然要用验证集或内部交叉验证来选。很多工具箱支持在训练代码里传入一个核宽度向量做自动选择本质上也是多跑几次迭代但比SVM的二维网格搜索便宜得多因为只有一个参数。实际经验是核宽度的搜索范围从0.1到10按对数网格取五六档就够了搜得太密边际收益很小。3. 用MATLAB跑通RVM分类从数据准备到输出概率3.1 数据格式与归一化训练集/测试集怎么切RVM分类在MATLAB里跑通之前数据格式要先统一。常见工具箱的输入是两个变量X是N×d的样本矩阵每行一个样本每列一个特征t是N×1的标签向量取值一般是0/1二元分类。归一化这一步不能省原因在RVM的核函数计算上。高斯核的输入是两两样本的欧氏距离平方如果一个特征取值范围是0到100000另一个是0到1距离会被大数值特征完全主导核宽度怎么调都别扭。常见做法是用z-score也就是每个特征减去均值除以标准差也可以把数据压到0到1区间两者差别不大。数据切分上我一般的做法是样本量两三百时用留出法70%训练、30%测试然后重复几组随机切分看稳定性样本量只有五六十时直接做留一法交叉验证评估但要注意这个评估结果会偏乐观第5章里会展开讲。% 数据准备与归一化 % X_raw: Nxd 特征矩阵, Y_raw: Nx1 标签(0/1) [X_norm, X_mu, X_sigma] zscore(X_raw); % 按列标准化 rng(42); idx randperm(size(X_norm, 1)); train_n round(size(X_norm, 1) * 0.7); % 70%做训练 X_train X_norm(idx(1:train_n), :); t_train Y_raw(idx(1:train_n), :); X_test X_norm(idx(train_n1:end), :); t_test Y_raw(idx(train_n1:end), :);这里的技巧在于zscore返回的X_mu和X_sigma要保存下来测试集预测时用训练集的均值和标准差去标准化而不是对测试集重新算。否则测试集的分布信息泄进了训练流程评估结果会虚高。标签不用归一化保持0/1就行RVM内部做sigmoid变换会处理。3.2 最小可运行代码训练、预测、评估一条龙MATLAB里RVM的实现没有统一官方工具箱最常见的两种风格是Tipping的Sparse BayesianSB2系列和后续社区改写的MATLAB版本。核心API大同小异一个函数做训练返回权重和相关向量下标一个函数做预测返回决策值和概率。下面的代码以这类API为主具体函数名以你手里的工具箱为准逻辑是一致的。% 训练RVM二分类模型 % 假设工具箱提供 rvm_train 和 rvm_predict 两个函数 kernel_type gaussian; kernel_width 1.5; max_iter 500; model rvm_train(X_train, t_train, ... kernel, kernel_type, ... width, kernel_width, ... max_iter, max_iter); % 查看相关向量数量验证稀疏性 fprintf(训练样本数: %d, 相关向量数: %d\n, ... size(X_train, 1), length(model.relevant)); % 测试集预测: y_prob 是P(类别1)的概率, y_pred 是0/1硬分类 [y_prob, y_pred] rvm_predict(model, X_test); % 评估: 准确率与AUC acc mean(y_pred t_test); fprintf(测试集准确率: %.4f\n, acc);训练函数内部的收敛条件一般是“边际似然增量小于阈值”或“迭代次数到上限”。kernel_width就是2.2节里说的核心参数先用1.0到2.0之间的值起步再用验证集微调。max_iter设500对几百个样本通常够用如果看到迭代到上限还没收敛说明核宽度可能设置不当或者数据没归一化。预测返回的y_prob有两个用途直接做硬分类取0.5为界或者作为排序分数用在金融风控、消费预测这类场景比如把概率最高的30%样本标记为高潜力。这也是RVM比SVM舒服的地方——SVM的决策值到概率的映射要做额外校准RVM天然带概率输出。3.3 多分类怎么处理一对多还是用稀疏多分类RVM原生是二元分类器多分类问题常见的做法是“一对多”策略。假设有K个类别训练K个RVM模型第k个模型把“属于类别k”的样本当正类其余全部当负类。预测时对每个样本得到K个概率取最大的那个作为最终类别。这个做法在类别数少K≤5时工作良好类别数多了会出问题每个二分类模型的正负样本比例失衡尤其类别多而样本总量小的时候负类把正类淹没概率输出会偏向多数类。解决方式有两个方向第一个是采样层面对负类做欠采样只取与正类数量相近的负样本参与训练第二个是决策层面不用原始概率比大小而是把每个二分类模型的概率减去该模型在训练集上的平均概率得到一个“超额概率”再做比较这样能抵消类别不平衡带来的偏移。% 一对多RVM多分类: 训练K个二分类器 K max(Y_raw); models cell(K, 1); for k 1:K % 当前类别记为正类, 其余记为负类 t_binary double(Y_raw k); models{k} rvm_train(X_norm, t_binary, ... kernel, gaussian, width, 1.5); end % 预测: 每个样本得到K个概率, 取最大 probs zeros(size(X_test, 1), K); for k 1:K [probs(:, k)] rvm_predict(models{k}, X_test); end [~, y_multi] max(probs, [], 2); acc_multi mean(y_multi t_test);这里注意每个二分类器都要单独归一化吗不需要所有类别共用同一套X_norm就行因为特征空间是一致的。但每个分类器要各自保存自己的相关向量集合和权重因为不同类别在特征空间里的关键样本不同。多分类时如果总样本500个以下三个类别的模型训练时间通常在几十秒内可以接受。4. RVM预测回归落地单步预测与滚动多步预测4.1 把时间序列转换成回归样本滑窗参数怎么定RVM做预测大多数情况指的不是分类而是回归——对连续值做预测典型场景包括用户消费金额预测、金融时序预测、房价预测这类结构化数据预测。RVM回归与RVM分类共享同一套稀疏贝叶斯框架差别只在似然函数分类用伯努利分布回归用高斯分布输出从概率变成连续值加噪声方差。时间序列预测的第一步是构造训练样本。假设原始序列是y(1), y(2), ..., y(T)用前p个点预测第p1个点就把y(i:ip-1)作为输入行y(ip)作为输出值。滑窗宽度p是这里唯一的关键参数太小模型学不到长期趋势太大输入维度上升、训练变慢而且容易过拟合。% 构造滑窗样本: 用前p个点预测下一点 p 5; T length(series); X zeros(T-p, p); t zeros(T-p, 1); for i 1:(T-p) X(i, :) series(i:ip-1); t(i) series(ip); endp值怎么定一个可复用的办法是跑几个候选值做对比比如p3, 5, 10分别训练RVM回归模型比较它们在验证集上的均方误差。注意p不是越大越好很多实际序列里过去10个点的信息已经衰减得很厉害了p过大反而把噪声当特征学了进去。4.2 RVM回归最小代码训练、预测、误差评估回归的训练接口与分类几乎一样只是内部切换分布假设预测函数返回连续值。% RVM回归训练与预测 model_reg rvm_train(X_train, t_train, ... kernel, gaussian, ... width, 2.0, ... max_iter, 500); y_pred_reg rvm_predict(model_reg, X_test); rmse sqrt(mean((y_pred_reg - t_test).^2)); mae mean(abs(y_pred_reg - t_test)); fprintf(RVM回归 RMSE: %.4f, MAE: %.4f\n, rmse, mae); % 如果训练时做了归一化, 这里要反归一化 % y_pred_real y_pred_reg * sigma_y mu_y;RVM回归的输出除了预测均值有些工具箱还会返回预测方差这是高斯似然里的噪声方差项。这个方差在滚动预测里很有用——方差突然变大说明当前输入区域落在训练数据稀疏的地方预测结果的置信度低。第6章讲预测区间时会用到它。误差评估不要只看RMSE一个数字把预测值和真实值画在一张图里看趋势拐点附近的表现。RVM回归对插值区间比较自信对外推区间超出训练值范围的部分预测方差会迅速膨胀这是贝叶斯模型的正常行为不是bug。4.3 滚动预测的误差累积什么时候该重训多步预测如果用“递归法”——拿第一步预测结果当输入预测第二步第二步预测结果再当输入预测第三步——误差会逐步累积越往后越不可靠。这是所有自回归类预测的通病RVM也不例外。要缓解这个问题有几个实操手段第一预测步数超过5步时评估指标要对每个步长分别统计不要只报第一步的RMSE。很多时候第一步RMSE很好看第五步已经烂掉了混在一起会给老板一个错误的预期。第二设定一个重训周期。对日粒度数据可以每天或每周用最新数据重训一次模型对分钟粒度数据每几百个新样本触发一次重训。重训不等于重头训练可以把旧的模型参数alpha和权重当作新训练迭代的初值收敛快很多。第三如果序列有明显的周期成分比如周周期性、季节性要把周期特征显式加进滑窗输入里而不是只堆历史数值。常见做法是把“一周前同一时刻的值”作为一个额外输入列能让滚动预测的误差累积速度明显变慢。5. RVM分类与预测的五个常见坑现象、原因、解决5.1 核宽度设置不当导致预测全是一个值现象分类准确率接近负类占比回归预测值几乎恒定在训练集均值附近模型看起来完全没学到东西。原因核宽度设得太大所有样本两两之间的核函数值都趋近于同一个常数核矩阵近似退化决策函数失去局部区分能力或者设得太小核矩阵对角占优而非对角项接近零优化过程陷入数值不稳定相关向量数量虚高但泛化失败。解决先做一个快速实验——把核宽度设成0.5、1、2、4、8五个值分别用验证集评估画出“核宽度 vs 准确率或RMSE”曲线找到明显拐点。特征都归一化过的情况下宽度从1起步通常是一个安全的经验值。5.2 数据不归一化训练直接发散或迭代不收敛现象训练过程迭代次数用满日志里边际似然值乱跳或者NaN预测结果全是极端值。原因RVM的迭代公式里包含核矩阵的逆核矩阵的每个元素都由样本距离决定。特征尺度差异大时核矩阵条件数爆炸数值上不可逆贝叶斯更新直接崩掉。这个现象在被某几个大数值特征主导的数据集上尤其常见。解决所有连续特征一律z-score归一化且只用训练集计算均值和标准差。这个步骤放任何RVM实现之前不要省不要抱着“模型应该能自己适应”的侥幸心理。分类标签和回归目标如果是大数值连续值比如消费金额对目标做归一化也能提高回归的数值稳定性。5.3 样本量太小交叉验证的评估结果虚高现象留一法交叉验证的准确率90%以上但换一批新数据表现只有70%落差很大一开始会怀疑数据泄漏实际上不是。原因RVM的稀疏性来自后验概率样本量只有四五十个时留一法每次只拿走一个样本剩余样本和完整训练集差别太小得到的评估结果天然偏乐观。样本量越小这个偏差越明显。解决样本量低于100时用5折交叉验证并重复5次随机划分取均值同时记录标准差。标准差超过5个百分点说明评估结果不稳不要基于单次结果下结论。样本量真的只有几十另一个更实际的做法是承认模型上限用RVM输出概率做排序而不是做绝对分类。5.4 分类概率输出是近似值不能直接当真实概率现象二分类任务里模型输出的正类概率普遍偏高比如0.8-0.9区间集中阈值设0.5时误报很多。原因RVM分类的概率来自变分贝叶斯近似然后在隐函数上加logistic变换它不是一个严格校准过的条件概率。近似误差导致概率分布偏移尤其在类别不平衡和样本量小的时候。解决对RVM的原始概率输出做一次Platt缩放校准——在验证集上训练一个单变量logistic映射把原始概率映射到校准概率。做法很简单把原始概率作为特征真实标签作为目标用MATLAB的fitglm拟合即可校准后再设阈值会更可信。5.5 对比算法时只比精度忽略稀疏性和预测效率现象RVM测试集准确率和SVM几乎一样甚至略低于是判定RVM不好用换回SVM。原因对比口径不完整。RVM的核心优势不在精度在于达到相近精度时模型更小、泛化更稳、自带不确定性输出。只比准确率是拿RVM的短处比SVM的长处。解决对比实验至少记录四个维度测试集准确率/RMSE、相关向量数量vs支持向量数量、单条测试样本的预测耗时、训练耗时。你会发现RVM在预测阶段通常比SVM快好几倍这个优势在需要把模型部署到实时计算场景时非常关键。训练慢是RVM的短板但训练是一次性成本预测慢是每次请求的持续成本。6. 进阶核函数组合与预测区间把RVM用到生产前先验证这三件事6.1 混合核线性核加RBF核解决高维稀疏特征问题纯RBF核对所有特征一视同仁地计算距离但实际数据里常有“部分特征线性有效、部分特征非线性相关”的情况。混合核的做法是把线性核和RBF核加权求和线性部分负责全局趋势RBF部分负责局部修正。在MATLAB工具箱里可以直接在训练时关掉默认的单一核手动构造核矩阵传入。混合核的权重怎么定我的做法是先单独跑线性核和RBF核记录各自的训练误差然后从两个权重相等的起点出发做几次微调。注意混合核会让相关向量数量微妙变化如果发现相关向量数量反而增多、精度没有提升直接退回单一核混合核不是默认更优。6.2 预测区间把RVM的方差输出用起来回归预测只给一个点估计是不够的尤其做库存预测、消费预测这类需要留安全余量的场景。RVM回归自带噪声方差预测时可以算出区间假设预测均值是y_pred方差是sigma_pred_squared那么95%预测区间近似为y_pred加减1.96倍标准差。区间宽度会随输入点自动变化落在训练数据密集区域区间窄落在稀疏区域区间宽。一个实用技巧是实际业务里不用95%区间用80%区间因为这个区间宽度更敏感对异常区域的变化反应更快。这个行为是RVM相对于普通核回归的自然优势区间是模型自己表达的不用额外训练一个分位数回归模型。6.3 应用前验证三个最小实验清单最后给出一个我每次用RVM落地前都会跑的三件事。第一拿一个最简单的小样本公开数据集比如鸢尾花取两个类别或波士顿房价这种经典数据跑通全流程并确认相关向量数量明显小于训练样本数这一步验证工具箱本身没问题。第二用自己的数据跑一次RBF宽度敏感度曲线确定一个相对平稳的宽度区间而不是落在陡峭斜坡上。第三对比RVM和当前基线模型SVM或线性回归把稀疏性、训练耗时、预测耗时、区间质量一起算出来确认RVM不是在精度上赢而是在模型资源和不确定性表达上赢。这三件事做完RVM该不该上生产基本就清楚了。我自己的使用习惯是小样本分类优先RVM样本量冲到几千以上才考虑换成增量式SVM回归预测需要区间输出时首选RVM只需要点预测且样本量很大时选更便宜的普通回归。踩过几次只比精度的亏之后我现在更在意的是“这个模型的预测结果我能不能解释它的把握有多大”这一点上RVM的贝叶斯底子帮了大忙。希望这些记录能帮你少走弯路尤其是核宽度和归一化这两个最容易翻车的地方先跑通再优化就顺了。本文还有配套的精品资源点击获取
返回列表