ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

从判别到生成:概率生成模型在二分类问题中的原理与实践

从判别到生成:概率生成模型在二分类问题中的原理与实践 1. 从“硬分”到“软判”为什么我们需要概率生成模型在数据科学和机器学习的日常里二分类问题就像家常便饭。我们习惯了拿起逻辑回归、支持向量机SVM或者决策树输入特征然后得到一个“是”或“否”的硬判决。模型告诉你这张图片有90%的概率是猫或者这个客户有70%的可能性会流失。但不知道你有没有想过这个“概率”是怎么来的它真的反映了数据内在的分布规律吗大多数判别式模型比如逻辑回归直接学习从特征X到类别标签Y的映射关系P(Y|X)。它们很高效目标明确就是找到那个最佳的分类边界。然而它们有一个潜在的“盲区”对数据本身的生成机制缺乏深入的建模。换句话说我们知道了“给定这些特征它更可能是A类”但我们并不知道“A类本身的数据长什么样”。这就像一位法官只根据现有证据判案却从不研究罪犯的典型行为模式。这就引出了我们今天要深入探讨的主角基于概率生成模型的二分类。与判别模型不同生成模型的核心思想是先对每一类数据的分布进行建模即学习P(X|Y)。它试图理解“猫”这个类别的图片像素是如何分布的“非猫”的图片又是如何分布的。当来了一个新样本模型会计算它分别由“猫”的分布和“非猫”的分布生成的可能性似然再结合类别的先验概率比如数据集中猫和非猫的比例利用贝叶斯定理反推它属于每个类别的后验概率P(Y|X)。这个思路的转变带来了几个实实在在的好处对数据缺失更鲁棒生成模型对数据的整体分布有估计因此在处理缺失特征或者遇到训练集中未出现过的特征组合时往往比判别模型更有依据进行推断。可生成新样本既然模型学会了数据的分布理论上就可以从这个分布中采样生成新的、类似的数据。这在数据增强、异常检测等场景非常有用。提供更丰富的解释模型不仅给出分类结果还揭示了数据的内在结构。例如通过高斯混合模型我们可能发现某个类别内部还存在不同的子群体。处理非平衡数据更自然先验概率P(Y)可以自然地融入模型这在类别样本量差异巨大时尤为重要。在数学建模竞赛无论是国赛、美赛还是亚太杯中面对一个复杂的二分类问题直接套用黑箱模型虽然快但论文深度往往不够。如果你能清晰地阐述为何选用生成模型并完整地展示从数据分布探索、模型假设、参数估计到分类决策的全过程无疑会让你的解决方案在理论深度和完整性上脱颖而出。接下来我们就抛开那些直接调sklearn的简单操作深入原理和代码看看如何亲手搭建一个概率生成分类器。2. 理论基石从贝叶斯定理到生成式分类器要理解概率生成模型贝叶斯定理是绕不开的起点。它为我们提供了一套将“生成概率”转化为“分类决策”的严谨数学框架。2.1 贝叶斯决策论的核心公式对于二分类问题我们有两个类别记为 $C_1$ 和 $C_2$。给定一个观测数据点 $\mathbf{x}$一个特征向量我们想知道它最可能属于哪个类别。贝叶斯定理告诉我们 $$P(C_k | \mathbf{x}) \frac{P(\mathbf{x} | C_k) P(C_k)}{P(\mathbf{x})}$$其中$P(C_k | \mathbf{x})$ 是后验概率即我们最终想要得到的、在观察到数据 $\mathbf{x}$ 后它属于类别 $C_k$ 的概率。这是我们做决策的依据。$P(\mathbf{x} | C_k)$ 是类条件概率或称为似然。它表示在类别 $C_k$ 的条件下观测到数据 $\mathbf{x}$ 的可能性。这正是生成模型需要学习和建模的核心部分。它回答了“这个类别的数据通常长什么样”。$P(C_k)$ 是先验概率表示在没有任何数据观测时一个样本属于类别 $C_k$ 的初始信念。通常可以用训练集中各类别的样本比例来估计。$P(\mathbf{x})$ 是证据因子是一个归一化常数确保所有类别的后验概率之和为1。对于分类决策我们可以忽略它因为它在比较不同 $C_k$ 时是相同的。因此为了最大化后验概率我们只需比较分子部分 $$\text{决策规则选择 } C_k \text{ 如果 } P(\mathbf{x} | C_k) P(C_k) \text{ 最大}$$这个规则被称为最大后验概率决策。如果先验概率相等即 $P(C_1) P(C_2)$则简化为最大似然决策。2.2 生成式 vs. 判别式一个直观类比让我们用一个简单的例子来区分这两种思路。假设我们要根据“身高”和“体重”区分篮球运动员和体操运动员。判别式模型如逻辑回归它会直接寻找一条直线或曲线尽可能好地将两类运动员在“身高-体重”坐标系中分开。它关心的是边界。来了一个新运动员180cm 75kg模型直接计算这个点落在边界哪一侧的概率。生成式模型如高斯判别分析它会分别研究篮球运动员群体的“身高-体重”联合分布可能是一个椭圆形的分布以及体操运动员群体的分布另一个椭圆形。它关心的是每个群体本身的特征。来了一个新运动员模型分别计算他的体征数据由“篮球运动员分布”生成的可能性以及由“体操运动员分布”生成的可能性再结合两类运动员的普遍程度先验判断他更可能来自哪个群体。生成式模型的优势在于即使这个新运动员的身高体重组合在训练集中从未出现过比如一个特别高但很轻的人模型也能根据学到的分布给出一个基于“距离分布中心远近”的、合理的概率估计。而判别式模型在远离决策边界的陌生区域其预测可能会非常不确定或不合理。2.3 关键一步为似然 $P(\mathbf{x} | C_k)$ 假设一个参数化形式理论很完美但现实是 $P(\mathbf{x} | C_k)$ 这个分布是未知的。我们无法知道真实世界中“猫”的图片像素分布的确切数学形式。因此我们必须对其进行建模即假设它服从某个已知的参数化概率分布族。最常用、也是最基础的假设是每个类别的特征向量 $\mathbf{x}$ 服从多元高斯正态分布。即 $$P(\mathbf{x} | C_k) \mathcal{N}(\mathbf{x} | \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)$$其中 $\boldsymbol{\mu}_k$ 是类别 $C_k$ 的均值向量$\boldsymbol{\Sigma}_k$ 是其协方差矩阵。这个假设意味着在特征空间中属于同一类别的数据点大致围绕一个中心点均值呈椭球状分布其形状和朝向由协方差矩阵决定。选择高斯分布作为基础模型有几个原因1) 数学性质优良便于推导和计算2) 中心极限定理为其提供了一定的理论支撑3) 很多实际数据在经过适当变换后可以近似用高斯分布描述。当然这个假设可能过于强。如果真实数据分布明显不是高斯的例如多模态分布模型性能就会下降。这时就需要更复杂的生成模型如混合模型、朴素贝叶斯假设特征独立或深度生成模型如变分自编码器。但在许多实际问题中特别是当特征经过精心设计和筛选后高斯假设是一个强大而实用的起点也是许多高级模型的理论基础。3. 高斯判别分析理论与极大似然估计实战当我们假设每个类别的数据都来自一个多元高斯分布并且用这个模型来做分类时这个方法就叫做高斯判别分析。GDA是生成式分类中最经典、最直观的模型之一理解它等于掌握了生成式分类的“标准流程”。3.1 模型定义与假设对于二分类问题我们有类别标签 $y \in {0, 1}$其先验分布为伯努利分布$y \sim \text{Bernoulli}(\phi)$即 $P(y1) \phi$ $P(y0) 1 - \phi$。给定类别 $yk$特征 $\mathbf{x}$ 的条件分布为多元高斯 $$P(\mathbf{x} | yk) \frac{1}{(2\pi)^{d/2} |\boldsymbol{\Sigma}_k|^{1/2}} \exp\left(-\frac{1}{2}(\mathbf{x} - \boldsymbol{\mu}_k)^T \boldsymbol{\Sigma}_k^{-1} (\mathbf{x} - \boldsymbol{\mu}_k)\right)$$ 这里 $d$ 是特征维度。GDA模型包含一组待学习的参数$\theta {\phi, \boldsymbol{\mu}_0, \boldsymbol{\mu}_1, \boldsymbol{\Sigma}_0, \boldsymbol{\Sigma}_1}$。这里有一个重要的建模选择协方差矩阵 $\boldsymbol{\Sigma}_k$ 是否在不同类别间共享不同协方差QDA假设 $\boldsymbol{\Sigma}_0 \neq \boldsymbol{\Sigma}_1$。这意味着两个类别的数据不仅中心点不同其分布的“形状”方差和特征间的相关性也可能完全不同。这更灵活但需要估计的参数更多两个 $d \times d$ 的矩阵需要更多数据来避免过拟合。相同协方差LDA假设 $\boldsymbol{\Sigma}_0 \boldsymbol{\Sigma}_1 \boldsymbol{\Sigma}$。这意味着两个类别的数据分布形状相同只是中心点不同。这个假设更强但极大地减少了参数量只需估计一个协方差矩阵模型更简单在数据量较少或特征维度较高时更稳定。此时后验概率 $P(y1|\mathbf{x})$ 的决策边界会是一个线性函数这也是“线性判别分析”名称的由来而QDA的决策边界是二次的。在数学建模中选择LDA还是QDA是一个需要根据数据和问题背景来论证的决策点。通常可以先从LDA开始如果发现分类效果不佳再尝试更灵活的QDA并通过交叉验证来比较。3.2 参数估计极大似然估计的推导与应用有了模型假设下一步就是从训练数据 ${(\mathbf{x}^{(i)}, y^{(i)})}_{i1}^m$ 中估计出参数 $\theta$。最常用的方法是极大似然估计。似然函数是所有训练样本的联合概率假设样本独立同分布 $$\mathcal{L}(\theta) \prod_{i1}^{m} P(\mathbf{x}^{(i)}, y^{(i)}; \theta) \prod_{i1}^{m} P(\mathbf{x}^{(i)} | y^{(i)}; \boldsymbol{\mu}, \boldsymbol{\Sigma}) P(y^{(i)}; \phi)$$为了方便求解我们通常最大化其对数似然函数 $\ell(\theta) \log \mathcal{L}(\theta)$。通过令对数似然函数对各个参数的偏导数为零我们可以得到MLE的闭合解以LDA为例即共享协方差矩阵 $\boldsymbol{\Sigma}$先验概率 $\phi$ 的估计 $$\hat{\phi} \frac{1}{m} \sum_{i1}^{m} \mathbb{I}{y^{(i)}1}$$ 这非常直观就是训练集中正例样本的比例。类别均值 $\boldsymbol{\mu}_k$ 的估计 $$\hat{\boldsymbol{\mu}}k \frac{\sum{i1}^{m} \mathbb{I}{y^{(i)}k} \mathbf{x}^{(i)}}{\sum_{i1}^{m} \mathbb{I}{y^{(i)}k}}$$ 即属于类别 $k$ 的所有样本特征向量的平均值。共享协方差矩阵 $\boldsymbol{\Sigma}$ 的估计 $$\hat{\boldsymbol{\Sigma}} \frac{1}{m} \sum_{i1}^{m} (\mathbf{x}^{(i)} - \hat{\boldsymbol{\mu}}{y^{(i)}})(\mathbf{x}^{(i)} - \hat{\boldsymbol{\mu}}{y^{(i)}})^T$$ 这是对总体协方差矩阵的估计计算了每个样本与其所属类别均值的偏差外积然后对所有样本取平均。注意在实际计算中特别是当样本量 $m$ 不大于特征维度 $d$ 时直接计算出的 $\hat{\boldsymbol{\Sigma}}$ 可能是奇异的不可逆这在高维数据中非常常见。为了解决这个问题我们通常采用正则化或收缩估计例如使用 $\hat{\boldsymbol{\Sigma}}_{\text{reg}} \lambda \hat{\boldsymbol{\Sigma}} (1-\lambda) \text{diag}(\hat{\boldsymbol{\Sigma}})$其中 $\lambda$ 是一个介于0和1之间的超参数用于在原始协方差矩阵和对角协方差矩阵即假设特征间独立之间做权衡。在scikit-learn的LinearDiscriminantAnalysis中可以通过shrinkage参数来实现。3.3 Python代码实现从零搭建一个GDA分类器理解了数学原理动手实现一遍是加深理解的最好方式。我们不直接调用sklearn而是用NumPy从头实现一个LDA分类器。import numpy as np class GaussianDiscriminantAnalysis: 线性判别分析LDA实现假设两类共享协方差矩阵。 def __init__(self): self.phi None # P(y1) self.mu0 None # 类别0的均值向量 self.mu1 None # 类别1的均值向量 self.sigma None # 共享的协方差矩阵 self.sigma_inv None # 协方差矩阵的逆预计算以提高预测速度 def fit(self, X, y): 使用极大似然估计拟合模型参数。 参数: X: 训练特征形状 (m, n_features) y: 训练标签形状 (m,)取值为0或1 m, n X.shape # 1. 估计先验概率 phi self.phi np.mean(y) # 2. 估计类别均值 self.mu0 X[y 0].mean(axis0) self.mu1 X[y 1].mean(axis0) # 3. 估计共享协方差矩阵 (使用无偏估计分母为 m-2) # 计算每个类别的中心化数据 X_centered0 X[y 0] - self.mu0 X_centered1 X[y 1] - self.mu1 # 合并协方差 # 公式: Sigma (1/(m-2)) * (X0_centered.T X0_centered X1_centered.T X1_centered) self.sigma (X_centered0.T X_centered0 X_centered1.T X_centered1) / (m - 2) # 为了避免数值问题加入一个很小的正则项沿对角线加一个小的常数 reg 1e-6 self.sigma reg * np.eye(n) # 预计算协方差矩阵的逆后续预测会多次用到 self.sigma_inv np.linalg.inv(self.sigma) def _multivariate_gaussian_pdf(self, x, mu): 计算多元高斯分布的概率密度函数未归一化的对数形式 # 计算二次型: (x - mu)^T Sigma^{-1} (x - mu) diff x - mu # 使用预计算的逆矩阵避免重复求逆 exponent -0.5 * diff.T self.sigma_inv diff # 忽略常数项因为在比较时会被抵消 return exponent def predict_proba(self, X): 预测属于类别1的后验概率 P(y1|X)。 参数: X: 待预测特征形状 (m_test, n_features) 返回: probas: 属于类别1的概率形状 (m_test,) # 计算对数似然忽略常数项和证据因子 log_likelihood1 np.array([self._multivariate_gaussian_pdf(x, self.mu1) for x in X]) log_likelihood0 np.array([self._multivariate_gaussian_pdf(x, self.mu0) for x in X]) # 加上先验的对数 log_joint1 log_likelihood1 np.log(self.phi) log_joint0 log_likelihood0 np.log(1 - self.phi) # 计算后验概率 P(y1|X) exp(log_joint1) / (exp(log_joint0) exp(log_joint1)) # 使用log-sum-exp技巧避免数值下溢 max_log np.maximum(log_joint0, log_joint1) log_sum_exp max_log np.log(np.exp(log_joint0 - max_log) np.exp(log_joint1 - max_log)) probas np.exp(log_joint1 - log_sum_exp) return probas def predict(self, X, threshold0.5): 根据阈值进行类别预测。 参数: X: 待预测特征 threshold: 决策阈值默认0.5 返回: y_pred: 预测的类别标签 (0或1) probas self.predict_proba(X) return (probas threshold).astype(int) # 示例使用鸢尾花数据集二分类只取两类 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report # 加载数据只取前两类Setosa和Versicolor做二分类 iris load_iris() X iris.data[:100] y iris.target[:100] # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state42) # 训练我们的LDA模型 gda GaussianDiscriminantAnalysis() gda.fit(X_train, y_train) # 预测 y_pred gda.predict(X_test) y_pred_proba gda.predict_proba(X_test) print(测试集准确率:, accuracy_score(y_test, y_pred)) print(\n分类报告:) print(classification_report(y_test, y_pred, target_namesiris.target_names[:2])) print(\n前5个样本的预测概率:, y_pred_proba[:5])这段代码清晰地展示了LDA的整个流程参数估计、似然计算、贝叶斯决策。运行它你会得到一个不错的分类准确率。更重要的是你拥有了一个完全透明、可控制的模型。你可以修改_multivariate_gaussian_pdf函数来尝试不同的协方差假设实现QDA或者加入更复杂的正则化策略。4. 超越高斯其他生成模型与实战场景选择高斯判别分析是生成式分类的“入门款”但现实世界的数据分布千奇百怪。当高斯假设明显不成立时我们需要更强大的工具。4.1 朴素贝叶斯当特征维度爆炸时的救星朴素贝叶斯是生成模型家族中另一个极其重要的成员。它的核心假设是在给定类别的情况下所有特征都是条件独立的。即 $$P(\mathbf{x} | C_k) P(x_1 | C_k) P(x_2 | C_k) ... P(x_d | C_k)$$这个“朴素”的假设在现实中几乎从不成立比如“身高”和“体重”显然是相关的但它却带来了巨大的计算优势参数量急剧减少不需要估计完整的 $d \times d$ 协方差矩阵只需要估计每个特征在每个类别下的边缘分布参数。这使其特别适合超高维特征的场景例如文本分类词袋模型特征维度动辄上万。训练速度极快参数估计可以并行进行且通常有闭合解。对缺失数据不敏感每个特征独立估计缺失某个特征不影响其他特征的似然计算。根据对特征 $x_j$ 分布的不同假设朴素贝叶斯有以下常见变体高斯朴素贝叶斯假设连续特征服从高斯分布。适用于像鸢尾花数据集这样的数值型特征。多项式朴素贝叶斯假设特征服从多项式分布。这是文本分类的经典模型特征通常是词频或TF-IDF值。伯努利朴素贝叶斯假设特征是二元的出现/不出现。也常用于文本分类特别是短文本或侧重于“是否出现”的场景。实战心得文本分类的利器在数学建模竞赛中如果遇到涉及文本情感分析、新闻分类、垃圾邮件识别等问题多项式朴素贝叶斯通常是你的第一道“基线模型”。它的实现简单效果稳定能快速提供一个可比较的基准。在scikit-learn中使用MultinomialNB配合TfidfVectorizer几行代码就能搭建一个强大的文本分类器。虽然它的独立性假设很强但在词袋模型这种高维稀疏表示下往往能取得出乎意料的好效果。4.2 混合模型与期望最大化算法捕捉数据的内部结构很多时候一个类别内部并不是同质的。例如“客户”这个类别里可能包含“高价值活跃客户”、“低价值沉默客户”、“即将流失客户”等多个子群体。用一个单一的高斯分布去拟合这样一个多模态的分布显然会力不从心。高斯混合模型GMM就是为了解决这个问题而生。它假设数据是由多个高斯分布以一定权重混合而成的 $$P(\mathbf{x}) \sum_{k1}^{K} \pi_k \mathcal{N}(\mathbf{x} | \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)$$ 其中 $\pi_k$ 是混合权重满足 $\sum_k \pi_k 1$。GMM本身是一个无监督聚类模型但它可以很自然地用于生成式分类方法一生成式分类对每个类别 $C_j$ 单独拟合一个GMM即 $P(\mathbf{x} | C_j) \sum_{k1}^{K_j} \pi_{jk} \mathcal{N}(\mathbf{x} | \boldsymbol{\mu}{jk}, \boldsymbol{\Sigma}{jk})$。这相当于用多个高斯分布的线性组合来更精细地描述每个类别的复杂分布。方法二两阶段法先用GMM对整个数据集不区分标签进行聚类得到K个成分。然后将每个样本的“软聚类”结果即属于各成分的后验概率作为新的特征再输入到一个标准的分类器如逻辑回归中。这种方法有时能挖掘出数据中潜在的子结构提升分类性能。GMM的参数估计无法像高斯分布那样直接通过MLE得到闭合解需要使用期望最大化算法EM算法进行迭代优化。EM算法通过引入“隐变量”即每个样本属于哪个混合成分来简化问题交替进行E步计算隐变量的后验期望和M步基于期望更新模型参数。实战心得EM算法的陷阱与调优EM算法对初始值敏感容易陷入局部最优。在实际应用中通常需要多次随机初始化运行多次EM算法选择似然函数值最大的那次结果。利用先验知识初始化如果对数据子结构有大致了解可以用K-Means聚类的结果来初始化GMM的均值和权重。约束协方差矩阵对于高维数据使用全协方差矩阵容易过拟合。可以约束为对角矩阵特征独立甚至球状矩阵各向同性这对应sklearn.mixture.GaussianMixture中的covariance_type参数full,tied,diag,spherical。4.3 如何为你的问题选择合适的生成模型面对一个具体的二分类建模任务如何在这些生成模型中做出选择下面是一个决策参考流程数据探索先行永远的第一步是可视化。绘制特征的分布直方图、散点图矩阵。如果单个类别内的特征分布看起来大致是单峰的、对称的那么高斯判别分析LDA/QDA是一个很好的起点。审视特征维度与样本量如果特征维度非常高$d 1000$样本量有限朴素贝叶斯特别是多项式或伯努利变体是你的首选它的计算效率和防过拟合能力很强。如果样本量充足$m d$可以尝试更复杂的模型。检查类别内结构如果怀疑一个类别内部存在明显的子群体例如在散点图上看到多个簇考虑使用高斯混合模型来为每个类别建模。可以用无监督聚类方法如K-Means先对每个类别的数据分别进行聚类如果轮廓系数较高则提示可能需要混合模型。特征类型连续特征GDA GMM。离散/计数特征多项式/伯努利朴素贝叶斯。混合类型特征这比较棘手。一种方法是分别对连续和离散部分建模或者使用能够处理混合数据的专用模型在某些软件包中提供。最终验证没有理论能保证哪个模型一定最好。始终使用交叉验证来比较不同生成模型以及判别模型在验证集上的性能。在数学建模论文中这个模型对比和选择的过程本身就是重要的分析内容。5. 从模型到评价生成式分类的完整工作流与陷阱规避构建一个模型只是开始如何评价它、优化它并在实际中可靠地使用它才是更见功力的部分。对于生成式分类有一些独特的评价要点和常见陷阱。5.1 评价指标不止于准确率对于二分类问题生成模型输出的是概率 $P(y1|\mathbf{x})$。我们需要一个阈值通常为0.5将其转化为类别标签。但仅仅看准确率是远远不够的。精确率、召回率与F1分数当类别不平衡时例如欺诈检测中正例极少准确率会严重失真。此时精确率查准率和召回率查全率以及它们的调和平均F1分数更能反映模型在稀有类别上的性能。生成模型通过调整决策阈值可以在精确率和召回率之间做出权衡绘制P-R曲线。ROC曲线与AUCROC曲线描绘了在不同阈值下模型的真正例率TPR和假正例率FPR的变化情况。其下的面积AUC值衡量的是模型整体的排序能力将正例样本排在负例样本前面的能力。AUC的一个巨大优势是它不依赖于具体的分类阈值这对于评估概率输出本身的质量非常有用。一个完美的生成模型其输出的概率应该能够完美区分正负例AUC接近1。对数损失也称为交叉熵损失。它直接衡量模型输出的概率分布与真实标签分布的差异。公式为 $$\text{Log Loss} -\frac{1}{m} \sum_{i1}^{m} [y^{(i)} \log(p^{(i)}) (1-y^{(i)}) \log(1-p^{(i)})]$$ 其中 $p^{(i)} P(y^{(i)}1|\mathbf{x}^{(i)})$。对数损失对预测概率的“校准度”非常敏感。一个被预测为0.9概率为正的样本如果它实际是负的将对损失产生很大的惩罚。因此对数损失是评估概率生成模型预测“质量”的金标准。一个好的生成模型不仅要有高的AUC还应该有低的Log Loss。注意在数学建模竞赛中清晰地展示这些评价指标并解释为什么选择它们例如“由于本问题中正例样本仅占10%我们更关注模型在正例上的识别能力因此主要采用F1分数和AUC作为评价标准”能显著提升论文的专业性。5.2 概率校准让你的模型输出“真概率”生成模型从理论上给出了后验概率但在实践中由于模型假设不完美、参数估计有偏等原因其输出的概率值可能并不“准”。例如在100个被模型预测为“正例概率0.7”的样本中实际只有60个是正例这说明模型过于自信了。概率校准的目的就是修正这种偏差使得模型输出的概率值与实际发生的频率相一致。校准后的概率在需要依赖概率进行后续决策如风险定价、资源分配的场景中至关重要。常用的校准方法有Platt Scaling将原始模型输出如决策函数值或概率通过一个逻辑回归函数进行映射。适用于像SVM这样输出非概率分数的模型对生成模型也有一定效果。Isotonic Regression一种非参数方法可以学习任意单调的校准映射比Platt Scaling更灵活但需要更多数据容易过拟合。在sklearn中可以使用CalibratedClassifierCV来方便地进行概率校准。它会自动在交叉验证的每一折上用验证集学习一个校准器然后应用到测试集上。实操建议对于严肃的应用尤其是金融、医疗等领域对生成模型或其他任何概率模型进行概率校准是一个推荐步骤。你可以通过绘制可靠性曲线来检查校准效果将预测概率分桶如[0,0.1), [0.1,0.2), ...计算每个桶内样本的平均预测概率和实际正例比例。如果点都落在对角线附近说明校准得很好。5.3 常见陷阱与解决方案协方差矩阵奇异或病态这是高维小样本数据使用GDA/QDA时最常见的问题。症状是计算似然时出现数值溢出或得到荒谬的结果。解决方案特征选择/降维使用PCA、LDA这里的LDA是线性判别分析一种有监督降维方法注意区分或基于模型的特征选择减少特征维度。正则化收缩如前所述在估计的协方差矩阵上加入一个正则项如 $\hat{\boldsymbol{\Sigma}}_{\text{reg}} (1-\lambda)\hat{\boldsymbol{\Sigma}} \lambda \text{diag}(\hat{\boldsymbol{\Sigma}})$。sklearn的LinearDiscriminantAnalysis(solverlsqr, shrinkageauto)会自动选择最优的$\lambda$。使用朴素贝叶斯直接规避了全协方差矩阵的估计。类别先验概率的误用在训练集中各类别的样本比例可能无法代表真实世界中的分布。例如在疾病筛查中训练数据可能包含大量病例但真实人群中患病率很低。解决方案fit方法中估计的phi是基于训练集的。如果你知道真实的先验分布 $P_{\text{真实}}(C_k)$在预测时应该使用它来修正后验概率 $$P_{\text{修正}}(C_k|\mathbf{x}) \propto P(\mathbf{x}|C_k) \times P_{\text{真实}}(C_k)$$ 在sklearn的LDA和朴素贝叶斯中可以通过设置priors参数来指定。模型假设严重违背例如数据明显是非高斯的、多模态的或者特征间存在复杂的非线性依赖关系。解决方案数据变换尝试对特征进行变换如对数变换、Box-Cox变换使其更接近高斯分布。使用更灵活的模型切换到混合模型GMM或者考虑判别式模型如核SVM、梯度提升树它们对数据分布的假设更弱。生成模型并非万能当其主要优势如处理缺失值、提供数据分布不是当前任务的核心需求时一个强大的判别模型可能是更简单有效的选择。计算复杂度QDA需要为每个类别估计并存储一个 $d \times d$ 的协方差矩阵及其逆预测时需要计算二次型当 $d$ 很大时计算和存储开销都很大。解决方案对于高维数据优先考虑LDA或朴素贝叶斯。如果必须使用QDA考虑使用对角QDA假设各类别的协方差矩阵都是对角矩阵这大大减少了参数量。生成式分类为我们打开了一扇从数据生成视角理解分类问题的大门。它不仅仅是给出一个预测标签更是提供了一套描述数据、量化不确定性的完整概率框架。在数学建模和实际应用中当你需要的不只是一个黑箱预测而是对问题更深刻的理解、对预测结果更可靠的信心评估时概率生成模型无疑是一个极具价值的工具。从扎实的高斯判别分析基础出发逐步扩展到更复杂的模型并时刻警惕数据与模型假设之间的差距你就能让生成式思维在解决实际分类问题时大放异彩。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表