朴素贝叶斯分类
这个方法是做什么的
直接按贝叶斯定理算“后验概率”的分类器:给定一条记录的各项自变量取值,它算出这条记录属于每个类别的概率,取最大的那个作为预测。之所以叫“朴素”,是因为它把 P(全部自变量|类别) 拆成了各自变量概率的连乘——等于假设“在同一个类别内部,各自变量之间互不相关”。本模块用的是高斯版本:每个定量自变量在每个类别内被当作正态分布,模型要估计的只是各类各变量的均值与方差,所以它训练极快、样本量小也能跑,常被当作分类任务的基线。方差平滑(var_smoothing) 是它唯一的建模超参数,作用是给方差加一个下限以免除零。
报告共五张卡:卡① 建模设置与八项体检,卡② 分层 5 折交叉验证主结果与无信息率检验,卡③ 混淆矩阵与 ROC/PR/逐类别指标四张图,卡④ 效应量区间与置换重要性,卡⑤ 论文表述。这一族八个模块共用同一套报告骨架,但卡① 表3 的“定量特征共线性”那一行在别的模块里只关系到重要性排序好不好读,在本模块里却直接对着它的核心假设:连乘式成立的前提就是各自变量条件独立,相关系数越高,那个连乘就把同一份信息重复计算越多次。报告里能就这条假设提前预警的,就只有这一行(见下)。
需要准备什么数据
- 放入因变量Y:不限
- 放入自变量X:至少 1 个
数据要求
- 数据表至少 30 行。
- 单列缺失率不超过 20%。
- 不接受取值全都一样的列(零方差列没有可分析的变异)。
- 「放入因变量Y」的类别数需在 2~20 之间。
- 「放入因变量Y」的每一组至少 5 个样本。
以上条目由系统从该方法的校验规则直接生成,与上传数据时的实际拦截规则一致。
什么时候用它
- 需要一个几秒钟就能出结果的基线,用来判断更复杂的模型有没有真的带来提升
- 样本量偏小、自变量却不少,参数更多的模型估不稳
- 自变量之间基本各管各的(来自不同的测量渠道、彼此没有共同来源)
- 需要的是各类别的相对可能性排序,而不是可解释的效应量
前提:因变量是定类列,2~20 个类别、每类至少 5 例;整表至少 30 行,含缺失的整行剔除。本模块还有两条模型自带的前提:各定量自变量在每个类别内近似正态、且给定类别后条件独立。后者有卡① 表3 的最大相关系数可以旁证(演示数据是 0.282,判“可接受”),前者在报告里没有对应的检验项(见下)。
什么时候不要用它
- 因变量是连续数值:本模块只做分类;要可解释系数用「线性回归 (最小二乘法)」,只要预测精度用「随机森林回归」。
- 自变量之间明显相关(同一量表的多个维度、同一来源派生的多个指标):条件独立假设被违背,分类可能照样准,但概率会失真(见下)。同为“先给每类建一个分布模型”的思路、却显式估计变量间协方差的方法是「线性判别分析」。
- 要报告每个自变量的效应方向、大小与显著性:本模块给不出;二分类结局用「逻辑回归」,结局有序用「有序逻辑回归」。
- 自变量以定类变量为主:它们独热成 0/1 列后仍按正态分布建模,与实际分布相去甚远;这类数据用能直接按类别分组的「CHAID决策树」,或做了哑变量的「逻辑回归」。
- 要把后验概率当风险数值直接报出去:先用「校准曲线」验一验它和实际发生率对不对得上。
- 观测之间不独立(同一受试者多次测量、同一科室内的病例):条件独立假设本来就已经很强,再叠一层个体内相关会让后验概率更加失真;用「混合模型」或「面板模型」。
容易误读的地方
- 条件独立被违背时,先坏掉的是概率,不是准确率——而准确率那几个指标看不出任何异常。 实测:在演示数据的 3 个自变量之外,再加 3 列与“广告投入(万元)”几乎完全相同的副本(相关系数 1.000),交叉验证 Accuracy 只从 0.7542 降到 0.7417、ROC-AUC 从 0.8482 降到 0.8298,肉眼看不出问题;但折外后验概率彻底极化——最大类概率的中位数从 0.8036 涨到 0.9845,超过 0.99 的样本从 12 例暴涨到 113 例,还有 39 例超过 0.9999。同一份信息被连乘了四次,模型于是“无比确信”。 而报告里发出警告的只有两处:卡① 表3 把共线性从“可接受”改判为“高度共线”,以及随之翻转的卡⑤ 综合判定“模型尚不满足全部可用性判据”。
- 卡① 的八项体检里没有一项在查正态性。 高斯朴素贝叶斯假设每个定量自变量在每个类别内近似正态,而卡① 查的是样本量、类别不平衡、折数可行性、尺度差异、共线性、重复记录、标签泄漏与高基数定类特征——没有一项对应这条假设。想看这条前提是否成立,需要另外按类别分组做分布检验;本模块的报告里,八项全“通过”不代表分布假设成立。
- 定类自变量被独热成 0/1 列之后,仍然按正态分布建模。 管线对定类列只做众数填补和独热编码,不做标准化,随后 GaussianNB 会为每一列估计各类别下的均值与方差——对一个只取 0 和 1 的哑变量来说,这个“正态分布”是个很粗的近似。类别水平越多、每个哑变量里 1 的占比越低,近似越差,而 var_smoothing 恰恰在这时开始起作用(它给方差加下限,防止某个类别下某个哑变量恒为 0 时除零)。
- 它是基线,不是终点。 卡① 的方法学说明写着它“常用作分类任务的基线模型”。演示数据上它的交叉验证 Accuracy=0.7542、Macro-F1=0.7529、κ=0.5085。正确的用法是在同一份数据上把它和树集成各跑一遍再比表4:复杂模型如果赢不过这个几秒钟就出结果的基线,说明数据里没有多少它能额外利用的结构;跨模块拿各自演示数据上的数字对照则没有意义。
- 表4 里 PR-AUC 比 ROC-AUC 高,不是矛盾。 本次 PR-AUC=0.8595、ROC-AUC=0.8482。两者的基线不同:ROC 的随机基线恒为 0.5,PR 的基线是正类占比,卡④ 表7 那一行写着本次是 0.4958。两个数各自和自己的基线比才有意义,直接比大小得不出任何结论。
报告里有什么
- 输出结果一:数据概览与前提检验
- 输出结果二:交叉验证性能主结果表
- 输出结果三:分类效果可视化
- 输出结果四:效应量与事后分析
- 输出结果五:结论与学术表述
卡③ 全部基于交叉验证折外预测绘制:混淆矩阵与曲线所用的预测都来自模型未见过该样本的那一折,不是训练集回代结果。