Jikipedia
第 37 篇

朴素贝叶斯入门

量化课堂第 37 篇(postId=1727,作者 yongpeng.r,编辑宏观经济算命师,难度进阶上、理解深度 level-0,2016-07 上线)。机器学习组第 2 篇。作者先用「年轻人检查阳性」一个例子讲完朴素贝叶斯的三块:特征条件独立假设、贝叶斯定理、后验概率最大化——顺便给了一个反直觉结论(阳性 ≠ 确诊);再用 sklearn 演示怎么拿它预测次日涨跌。素材见 raw/collections/jq-quant-classroom/37-37-朴素贝叶斯入门md.md。

量化朴素贝叶斯贝叶斯定理条件独立后验概率分类

这是什么

一篇「一个例子说清楚」的概率分类入门。它解决一类日常问题:根据观测现象(特征数据)推测背后的原因——草地湿了是不是下雨、交易量涨了是有新资金还是存量资金、体检阳性是真得病还是误诊。朴素贝叶斯的卖点:用历史数据的分布,给你「最有可能的结果」,让你的错误概率最小化。正文先破掉一句绕口定义(贝叶斯定理 + 特征条件独立假设 + 后验概率最大化的分类方法),然后用医学例子把它拆开讲,最后给 sklearn 用法。

核心要点

一个例子:年轻人检查阳性,真得病概率比没病还低

  • 人群 20000 人:没病 18000、有病 2000(年轻人得病概率远小于年长)。
  • 有病者中:年轻人占 5%,检查阳性率 99%。
  • 没病者中:年轻人占 95%,误诊(假阳性)率 1%。
  • 「年轻且阳性且真得病」= 2000×5%×99% = 99 人;「年轻且阳性且没病」= 18000×95%×1% = 171 人
  • 所以:已知「年轻且阳性」时,P(真得病)=99/(99+171)=36.7%,P(没病)=171/(99+171)=63.3%
  • 反直觉结论:确诊率 99% 看着吓人,但年轻人得病的基础率太低,阳性样本里多数是误诊——所以现实里医生会让你复诊。这告诉我们:看「检测有多准」之前,先看「得病的人本来就多不多」(先验主导后验)。

特征的条件独立假设

  • 特征 = 用来判断未知结果的已知数据(例子里是「是否年轻」「检查是否阳性」)。
  • 关键假设:给定类别时特征之间独立 → 「年轻且阳性」的概率 = P(年轻)×P(阳性),概率可以相乘。
  • 不独立就不能乘:天空有云概率 0.5、下雨概率 0.33,但两者不独立,不能推出「又有云又下雨」=0.5×0.33。

贝叶斯定理

  • 公式(X=x 是特征、Y=c_k 是类别):P(Y=c_k|X=x) = P(X=x|Y=c_k)·P(Y=c_k) / Σ_k P(X=x|Y=c_k)·P(Y=c_k)。
  • 例子里 A/B = 99/(99+171) 正是这个公式:A 是「真得病的人里年轻且阳性」的数目,B 是「人群里所有年轻且阳性」的数目。

后验概率最大化

  • 把每个类别的后验概率都算出来,选最大的一个作答——这就是朴素贝叶斯「给你最可能结果」的方式。
  • 阳性例子里没病概率(63.3%)更大 → 结论:阳性不意味着确诊,为了安全起见需要复诊。

sklearn 的具体使用

  • 特征:由收盘价数据计算的 SMA、WMA、MOM 指标。
  • 训练样本:2007-1-4 到 2016-6-2 中截止前一天的三个指标;类别标签 = 这些天里每天的涨跌(涨 True、跌 False)。
  • 测试样本:2016-6-3 的三个指标与当天真实涨跌。判断对 → 输出 True,错 → 输出 False。
  • 作用与「SVM 那一篇」的例子一样,只展示如何使用,不对预测的准确性做担保(原文原话)。

机制 / 论证

  • 为什么叫「朴素」:加了「特征条件独立」这个省事假设,联合概率就能拆成各特征概率的乘积,计算量与样本需求骤降;代价是特征真相关时(云和雨)估计会失真。
  • 为什么反直觉结果成立:类先验(年轻人得病率极低)在公式里压过了「检测很准」的似然。贝叶斯定理把「先验 P(Y) + 似然 P(X|Y)」合成「后验 P(Y|X)」——先验低 + 假阳性样本量大,阳性者里没病的人反而多。
  • 为什么选后验最大的类:在「模型假设正确」的前提下,后验最大化 ≈ 让分类错误率最小(导语所说「使你犯错误的概率最小化」)。
  • 为什么能用于涨跌:把「次日涨/跌」当类别、把技术指标当特征,历史数据给出似然与先验,就能对今天算「明天更可能涨还是跌」。注意这只是用法演示——原文明说准确性没担保。

可操作

  • 用 sklearn 做朴素贝叶斯涨跌二分类的流程(Python 环境,代码在文末 notebook):
    1. 由收盘价算 SMA/WMA/MOM 指标。
    2. 训练样本特征 = 截止前一日的三指标;标签 = 每天涨跌(涨 True / 跌 False)。
    3. 测试样本 = 当日三指标。
    4. 分类器判断结果与当天实际涨跌比对,输出 True/False。
  • 具体库/类名、参数与数据拼装代码在 notebook(notebookCloneCount=387),raw 未含 [需要验证]。
  • 医学例子的核心数字(99、171、36.7%、63.3%)可当模板手算一遍:先定人群 → 分有病/没病 → 各自乘「占比×检测率」→ 归一化。

术语

  • 先验概率 P(Y):看到特征之前,某类出现的概率(年轻人得病率)。
  • 似然 P(X|Y):已知某类时,观察到这些特征的概率(有病者阳性率 99%)。
  • 后验概率 P(Y|X):看到特征之后,属于某类的概率(阳性者真得病率 36.7%)。
  • 条件独立假设:给定类别时各特征互不影响,概率可相乘。
  • 朴素贝叶斯:贝叶斯定理 + 条件独立假设 + 后验概率最大化的分类器。

不确定 / 待验证

  • 医学例子的概率树画在两幅图里(raw 只有图链);正文文字给出的数字(年轻人 5% vs 95%、阳性率 99% vs 1%)与图一致,但两处占比的出处看图才直观 [需要验证]。
  • sklearn 具体用的是哪个朴素贝叶斯实现(GaussianNB 等)与代码细节在 notebook,raw 只给了文字流程 [需要验证]。
  • 训练窗口 2007-1-4~2016-6-2、测试只有 2016-6-3 单日——是「跑通代码」的演示,不是有效性检验。
  • 原文提到的「SVM 那一篇」(postId=1510)与 43 篇说的随机森林原理篇(postId=1571)均未收录本库。
  • 朴素贝叶斯对连续特征通常要做分布假设(高斯等),本文未展开。

相关

更新 2026-09-06

检索知识库

按标题、类型或正文检索