題中的原理與實(shí)踐)
1. 從“硬分”到“軟判”為什么我們需要概率生成模型在數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)的日常里二分類問(wèn)題就像家常便飯。我們習(xí)慣了拿起邏輯回歸、支持向量機(jī)SVM或者決策樹輸入特征然后得到一個(gè)“是”或“否”的硬判決。模型告訴你這張圖片有90%的概率是貓或者這個(gè)客戶有70%的可能性會(huì)流失。但不知道你有沒(méi)有想過(guò)這個(gè)“概率”是怎么來(lái)的它真的反映了數(shù)據(jù)內(nèi)在的分布規(guī)律嗎大多數(shù)判別式模型比如邏輯回歸直接學(xué)習(xí)從特征X到類別標(biāo)簽Y的映射關(guān)系P(Y|X)。它們很高效目標(biāo)明確就是找到那個(gè)最佳的分類邊界。然而它們有一個(gè)潛在的“盲區(qū)”對(duì)數(shù)據(jù)本身的生成機(jī)制缺乏深入的建模。換句話說(shuō)我們知道了“給定這些特征它更可能是A類”但我們并不知道“A類本身的數(shù)據(jù)長(zhǎng)什么樣”。這就像一位法官只根據(jù)現(xiàn)有證據(jù)判案卻從不研究罪犯的典型行為模式。這就引出了我們今天要深入探討的主角基于概率生成模型的二分類。與判別模型不同生成模型的核心思想是先對(duì)每一類數(shù)據(jù)的分布進(jìn)行建模即學(xué)習(xí)P(X|Y)。它試圖理解“貓”這個(gè)類別的圖片像素是如何分布的“非貓”的圖片又是如何分布的。當(dāng)來(lái)了一個(gè)新樣本模型會(huì)計(jì)算它分別由“貓”的分布和“非貓”的分布生成的可能性似然再結(jié)合類別的先驗(yàn)概率比如數(shù)據(jù)集中貓和非貓的比例利用貝葉斯定理反推它屬于每個(gè)類別的后驗(yàn)概率P(Y|X)。這個(gè)思路的轉(zhuǎn)變帶來(lái)了幾個(gè)實(shí)實(shí)在在的好處對(duì)數(shù)據(jù)缺失更魯棒生成模型對(duì)數(shù)據(jù)的整體分布有估計(jì)因此在處理缺失特征或者遇到訓(xùn)練集中未出現(xiàn)過(guò)的特征組合時(shí)往往比判別模型更有依據(jù)進(jìn)行推斷??缮尚聵颖炯热荒P蛯W(xué)會(huì)了數(shù)據(jù)的分布理論上就可以從這個(gè)分布中采樣生成新的、類似的數(shù)據(jù)。這在數(shù)據(jù)增強(qiáng)、異常檢測(cè)等場(chǎng)景非常有用。提供更豐富的解釋模型不僅給出分類結(jié)果還揭示了數(shù)據(jù)的內(nèi)在結(jié)構(gòu)。例如通過(guò)高斯混合模型我們可能發(fā)現(xiàn)某個(gè)類別內(nèi)部還存在不同的子群體。處理非平衡數(shù)據(jù)更自然先驗(yàn)概率P(Y)可以自然地融入模型這在類別樣本量差異巨大時(shí)尤為重要。在數(shù)學(xué)建模競(jìng)賽無(wú)論是國(guó)賽、美賽還是亞太杯中面對(duì)一個(gè)復(fù)雜的二分類問(wèn)題直接套用黑箱模型雖然快但論文深度往往不夠。如果你能清晰地闡述為何選用生成模型并完整地展示從數(shù)據(jù)分布探索、模型假設(shè)、參數(shù)估計(jì)到分類決策的全過(guò)程無(wú)疑會(huì)讓你的解決方案在理論深度和完整性上脫穎而出。接下來(lái)我們就拋開那些直接調(diào)sklearn的簡(jiǎn)單操作深入原理和代碼看看如何親手搭建一個(gè)概率生成分類器。2. 理論基石從貝葉斯定理到生成式分類器要理解概率生成模型貝葉斯定理是繞不開的起點(diǎn)。它為我們提供了一套將“生成概率”轉(zhuǎn)化為“分類決策”的嚴(yán)謹(jǐn)數(shù)學(xué)框架。2.1 貝葉斯決策論的核心公式對(duì)于二分類問(wèn)題我們有兩個(gè)類別記為 $C_1$ 和 $C_2$。給定一個(gè)觀測(cè)數(shù)據(jù)點(diǎn) $\mathbf{x}$一個(gè)特征向量我們想知道它最可能屬于哪個(gè)類別。貝葉斯定理告訴我們 $$P(C_k | \mathbf{x}) \frac{P(\mathbf{x} | C_k) P(C_k)}{P(\mathbf{x})}$$其中$P(C_k | \mathbf{x})$ 是后驗(yàn)概率即我們最終想要得到的、在觀察到數(shù)據(jù) $\mathbf{x}$ 后它屬于類別 $C_k$ 的概率。這是我們做決策的依據(jù)。$P(\mathbf{x} | C_k)$ 是類條件概率或稱為似然。它表示在類別 $C_k$ 的條件下觀測(cè)到數(shù)據(jù) $\mathbf{x}$ 的可能性。這正是生成模型需要學(xué)習(xí)和建模的核心部分。它回答了“這個(gè)類別的數(shù)據(jù)通常長(zhǎng)什么樣”。$P(C_k)$ 是先驗(yàn)概率表示在沒(méi)有任何數(shù)據(jù)觀測(cè)時(shí)一個(gè)樣本屬于類別 $C_k$ 的初始信念。通??梢杂糜?xùn)練集中各類別的樣本比例來(lái)估計(jì)。$P(\mathbf{x})$ 是證據(jù)因子是一個(gè)歸一化常數(shù)確保所有類別的后驗(yàn)概率之和為1。對(duì)于分類決策我們可以忽略它因?yàn)樗诒容^不同 $C_k$ 時(shí)是相同的。因此為了最大化后驗(yàn)概率我們只需比較分子部分 $$\text{決策規(guī)則選擇 } C_k \text{ 如果 } P(\mathbf{x} | C_k) P(C_k) \text{ 最大}$$這個(gè)規(guī)則被稱為最大后驗(yàn)概率決策。如果先驗(yàn)概率相等即 $P(C_1) P(C_2)$則簡(jiǎn)化為最大似然決策。2.2 生成式 vs. 判別式一個(gè)直觀類比讓我們用一個(gè)簡(jiǎn)單的例子來(lái)區(qū)分這兩種思路。假設(shè)我們要根據(jù)“身高”和“體重”區(qū)分籃球運(yùn)動(dòng)員和體操運(yùn)動(dòng)員。判別式模型如邏輯回歸它會(huì)直接尋找一條直線或曲線盡可能好地將兩類運(yùn)動(dòng)員在“身高-體重”坐標(biāo)系中分開。它關(guān)心的是邊界。來(lái)了一個(gè)新運(yùn)動(dòng)員180cm 75kg模型直接計(jì)算這個(gè)點(diǎn)落在邊界哪一側(cè)的概率。生成式模型如高斯判別分析它會(huì)分別研究籃球運(yùn)動(dòng)員群體的“身高-體重”聯(lián)合分布可能是一個(gè)橢圓形的分布以及體操運(yùn)動(dòng)員群體的分布另一個(gè)橢圓形。它關(guān)心的是每個(gè)群體本身的特征。來(lái)了一個(gè)新運(yùn)動(dòng)員模型分別計(jì)算他的體征數(shù)據(jù)由“籃球運(yùn)動(dòng)員分布”生成的可能性以及由“體操運(yùn)動(dòng)員分布”生成的可能性再結(jié)合兩類運(yùn)動(dòng)員的普遍程度先驗(yàn)判斷他更可能來(lái)自哪個(gè)群體。生成式模型的優(yōu)勢(shì)在于即使這個(gè)新運(yùn)動(dòng)員的身高體重組合在訓(xùn)練集中從未出現(xiàn)過(guò)比如一個(gè)特別高但很輕的人模型也能根據(jù)學(xué)到的分布給出一個(gè)基于“距離分布中心遠(yuǎn)近”的、合理的概率估計(jì)。而判別式模型在遠(yuǎn)離決策邊界的陌生區(qū)域其預(yù)測(cè)可能會(huì)非常不確定或不合理。2.3 關(guān)鍵一步為似然 $P(\mathbf{x} | C_k)$ 假設(shè)一個(gè)參數(shù)化形式理論很完美但現(xiàn)實(shí)是 $P(\mathbf{x} | C_k)$ 這個(gè)分布是未知的。我們無(wú)法知道真實(shí)世界中“貓”的圖片像素分布的確切數(shù)學(xué)形式。因此我們必須對(duì)其進(jìn)行建模即假設(shè)它服從某個(gè)已知的參數(shù)化概率分布族。最常用、也是最基礎(chǔ)的假設(shè)是每個(gè)類別的特征向量 $\mathbf{x}$ 服從多元高斯正態(tài)分布。即 $$P(\mathbf{x} | C_k) \mathcal{N}(\mathbf{x} | \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)$$其中 $\boldsymbol{\mu}_k$ 是類別 $C_k$ 的均值向量$\boldsymbol{\Sigma}_k$ 是其協(xié)方差矩陣。這個(gè)假設(shè)意味著在特征空間中屬于同一類別的數(shù)據(jù)點(diǎn)大致圍繞一個(gè)中心點(diǎn)均值呈橢球狀分布其形狀和朝向由協(xié)方差矩陣決定。選擇高斯分布作為基礎(chǔ)模型有幾個(gè)原因1) 數(shù)學(xué)性質(zhì)優(yōu)良便于推導(dǎo)和計(jì)算2) 中心極限定理為其提供了一定的理論支撐3) 很多實(shí)際數(shù)據(jù)在經(jīng)過(guò)適當(dāng)變換后可以近似用高斯分布描述。當(dāng)然這個(gè)假設(shè)可能過(guò)于強(qiáng)。如果真實(shí)數(shù)據(jù)分布明顯不是高斯的例如多模態(tài)分布模型性能就會(huì)下降。這時(shí)就需要更復(fù)雜的生成模型如混合模型、樸素貝葉斯假設(shè)特征獨(dú)立或深度生成模型如變分自編碼器。但在許多實(shí)際問(wèn)題中特別是當(dāng)特征經(jīng)過(guò)精心設(shè)計(jì)和篩選后高斯假設(shè)是一個(gè)強(qiáng)大而實(shí)用的起點(diǎn)也是許多高級(jí)模型的理論基礎(chǔ)。3. 高斯判別分析理論與極大似然估計(jì)實(shí)戰(zhàn)當(dāng)我們假設(shè)每個(gè)類別的數(shù)據(jù)都來(lái)自一個(gè)多元高斯分布并且用這個(gè)模型來(lái)做分類時(shí)這個(gè)方法就叫做高斯判別分析。GDA是生成式分類中最經(jīng)典、最直觀的模型之一理解它等于掌握了生成式分類的“標(biāo)準(zhǔn)流程”。3.1 模型定義與假設(shè)對(duì)于二分類問(wèn)題我們有類別標(biāo)簽 $y \in {0, 1}$其先驗(yàn)分布為伯努利分布$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模型包含一組待學(xué)習(xí)的參數(shù)$\theta {\phi, \boldsymbol{\mu}_0, \boldsymbol{\mu}_1, \boldsymbol{\Sigma}_0, \boldsymbol{\Sigma}_1}$。這里有一個(gè)重要的建模選擇協(xié)方差矩陣 $\boldsymbol{\Sigma}_k$ 是否在不同類別間共享不同協(xié)方差QDA假設(shè) $\boldsymbol{\Sigma}_0 \neq \boldsymbol{\Sigma}_1$。這意味著兩個(gè)類別的數(shù)據(jù)不僅中心點(diǎn)不同其分布的“形狀”方差和特征間的相關(guān)性也可能完全不同。這更靈活但需要估計(jì)的參數(shù)更多兩個(gè) $d \times d$ 的矩陣需要更多數(shù)據(jù)來(lái)避免過(guò)擬合。相同協(xié)方差LDA假設(shè) $\boldsymbol{\Sigma}_0 \boldsymbol{\Sigma}_1 \boldsymbol{\Sigma}$。這意味著兩個(gè)類別的數(shù)據(jù)分布形狀相同只是中心點(diǎn)不同。這個(gè)假設(shè)更強(qiáng)但極大地減少了參數(shù)量只需估計(jì)一個(gè)協(xié)方差矩陣模型更簡(jiǎn)單在數(shù)據(jù)量較少或特征維度較高時(shí)更穩(wěn)定。此時(shí)后驗(yàn)概率 $P(y1|\mathbf{x})$ 的決策邊界會(huì)是一個(gè)線性函數(shù)這也是“線性判別分析”名稱的由來(lái)而QDA的決策邊界是二次的。在數(shù)學(xué)建模中選擇LDA還是QDA是一個(gè)需要根據(jù)數(shù)據(jù)和問(wèn)題背景來(lái)論證的決策點(diǎn)。通??梢韵葟腖DA開始如果發(fā)現(xiàn)分類效果不佳再嘗試更靈活的QDA并通過(guò)交叉驗(yàn)證來(lái)比較。3.2 參數(shù)估計(jì)極大似然估計(jì)的推導(dǎo)與應(yīng)用有了模型假設(shè)下一步就是從訓(xùn)練數(shù)據(jù) ${(\mathbf{x}^{(i)}, y^{(i)})}_{i1}^m$ 中估計(jì)出參數(shù) $\theta$。最常用的方法是極大似然估計(jì)。似然函數(shù)是所有訓(xùn)練樣本的聯(lián)合概率假設(shè)樣本獨(dú)立同分布 $$\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)$$為了方便求解我們通常最大化其對(duì)數(shù)似然函數(shù) $\ell(\theta) \log \mathcal{L}(\theta)$。通過(guò)令對(duì)數(shù)似然函數(shù)對(duì)各個(gè)參數(shù)的偏導(dǎo)數(shù)為零我們可以得到MLE的閉合解以LDA為例即共享協(xié)方差矩陣 $\boldsymbol{\Sigma}$先驗(yàn)概率 $\phi$ 的估計(jì) $$\hat{\phi} \frac{1}{m} \sum_{i1}^{m} \mathbb{I}{y^{(i)}1}$$ 這非常直觀就是訓(xùn)練集中正例樣本的比例。類別均值 $\boldsymbol{\mu}_k$ 的估計(jì) $$\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$ 的所有樣本特征向量的平均值。共享協(xié)方差矩陣 $\boldsymbol{\Sigma}$ 的估計(jì) $$\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$$ 這是對(duì)總體協(xié)方差矩陣的估計(jì)計(jì)算了每個(gè)樣本與其所屬類別均值的偏差外積然后對(duì)所有樣本取平均。注意在實(shí)際計(jì)算中特別是當(dāng)樣本量 $m$ 不大于特征維度 $d$ 時(shí)直接計(jì)算出的 $\hat{\boldsymbol{\Sigma}}$ 可能是奇異的不可逆這在高維數(shù)據(jù)中非常常見。為了解決這個(gè)問(wèn)題我們通常采用正則化或收縮估計(jì)例如使用 $\hat{\boldsymbol{\Sigma}}_{\text{reg}} \lambda \hat{\boldsymbol{\Sigma}} (1-\lambda) \text{diag}(\hat{\boldsymbol{\Sigma}})$其中 $\lambda$ 是一個(gè)介于0和1之間的超參數(shù)用于在原始協(xié)方差矩陣和對(duì)角協(xié)方差矩陣即假設(shè)特征間獨(dú)立之間做權(quán)衡。在scikit-learn的LinearDiscriminantAnalysis中可以通過(guò)shrinkage參數(shù)來(lái)實(shí)現(xiàn)。3.3 Python代碼實(shí)現(xiàn)從零搭建一個(gè)GDA分類器理解了數(shù)學(xué)原理動(dòng)手實(shí)現(xiàn)一遍是加深理解的最好方式。我們不直接調(diào)用sklearn而是用NumPy從頭實(shí)現(xiàn)一個(gè)LDA分類器。import numpy as np class GaussianDiscriminantAnalysis: 線性判別分析LDA實(shí)現(xiàn)假設(shè)兩類共享協(xié)方差矩陣。 def __init__(self): self.phi None # P(y1) self.mu0 None # 類別0的均值向量 self.mu1 None # 類別1的均值向量 self.sigma None # 共享的協(xié)方差矩陣 self.sigma_inv None # 協(xié)方差矩陣的逆預(yù)計(jì)算以提高預(yù)測(cè)速度 def fit(self, X, y): 使用極大似然估計(jì)擬合模型參數(shù)。 參數(shù): X: 訓(xùn)練特征形狀 (m, n_features) y: 訓(xùn)練標(biāo)簽形狀 (m,)取值為0或1 m, n X.shape # 1. 估計(jì)先驗(yàn)概率 phi self.phi np.mean(y) # 2. 估計(jì)類別均值 self.mu0 X[y 0].mean(axis0) self.mu1 X[y 1].mean(axis0) # 3. 估計(jì)共享協(xié)方差矩陣 (使用無(wú)偏估計(jì)分母為 m-2) # 計(jì)算每個(gè)類別的中心化數(shù)據(jù) X_centered0 X[y 0] - self.mu0 X_centered1 X[y 1] - self.mu1 # 合并協(xié)方差 # 公式: 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) # 為了避免數(shù)值問(wèn)題加入一個(gè)很小的正則項(xiàng)沿對(duì)角線加一個(gè)小的常數(shù) reg 1e-6 self.sigma reg * np.eye(n) # 預(yù)計(jì)算協(xié)方差矩陣的逆后續(xù)預(yù)測(cè)會(huì)多次用到 self.sigma_inv np.linalg.inv(self.sigma) def _multivariate_gaussian_pdf(self, x, mu): 計(jì)算多元高斯分布的概率密度函數(shù)未歸一化的對(duì)數(shù)形式 # 計(jì)算二次型: (x - mu)^T Sigma^{-1} (x - mu) diff x - mu # 使用預(yù)計(jì)算的逆矩陣避免重復(fù)求逆 exponent -0.5 * diff.T self.sigma_inv diff # 忽略常數(shù)項(xiàng)因?yàn)樵诒容^時(shí)會(huì)被抵消 return exponent def predict_proba(self, X): 預(yù)測(cè)屬于類別1的后驗(yàn)概率 P(y1|X)。 參數(shù): X: 待預(yù)測(cè)特征形狀 (m_test, n_features) 返回: probas: 屬于類別1的概率形狀 (m_test,) # 計(jì)算對(duì)數(shù)似然忽略常數(shù)項(xiàng)和證據(jù)因子 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]) # 加上先驗(yàn)的對(duì)數(shù) log_joint1 log_likelihood1 np.log(self.phi) log_joint0 log_likelihood0 np.log(1 - self.phi) # 計(jì)算后驗(yàn)概率 P(y1|X) exp(log_joint1) / (exp(log_joint0) exp(log_joint1)) # 使用log-sum-exp技巧避免數(shù)值下溢 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): 根據(jù)閾值進(jìn)行類別預(yù)測(cè)。 參數(shù): X: 待預(yù)測(cè)特征 threshold: 決策閾值默認(rèn)0.5 返回: y_pred: 預(yù)測(cè)的類別標(biāo)簽 (0或1) probas self.predict_proba(X) return (probas threshold).astype(int) # 示例使用鳶尾花數(shù)據(jù)集二分類只取兩類 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report # 加載數(shù)據(jù)只取前兩類Setosa和Versicolor做二分類 iris load_iris() X iris.data[:100] y iris.target[:100] # 劃分訓(xùn)練集和測(cè)試集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state42) # 訓(xùn)練我們的LDA模型 gda GaussianDiscriminantAnalysis() gda.fit(X_train, y_train) # 預(yù)測(cè) y_pred gda.predict(X_test) y_pred_proba gda.predict_proba(X_test) print(測(cè)試集準(zhǔn)確率:, accuracy_score(y_test, y_pred)) print(\n分類報(bào)告:) print(classification_report(y_test, y_pred, target_namesiris.target_names[:2])) print(\n前5個(gè)樣本的預(yù)測(cè)概率:, y_pred_proba[:5])這段代碼清晰地展示了LDA的整個(gè)流程參數(shù)估計(jì)、似然計(jì)算、貝葉斯決策。運(yùn)行它你會(huì)得到一個(gè)不錯(cuò)的分類準(zhǔn)確率。更重要的是你擁有了一個(gè)完全透明、可控制的模型。你可以修改_multivariate_gaussian_pdf函數(shù)來(lái)嘗試不同的協(xié)方差假設(shè)實(shí)現(xiàn)QDA或者加入更復(fù)雜的正則化策略。4. 超越高斯其他生成模型與實(shí)戰(zhàn)場(chǎng)景選擇高斯判別分析是生成式分類的“入門款”但現(xiàn)實(shí)世界的數(shù)據(jù)分布千奇百怪。當(dāng)高斯假設(shè)明顯不成立時(shí)我們需要更強(qiáng)大的工具。4.1 樸素貝葉斯當(dāng)特征維度爆炸時(shí)的救星樸素貝葉斯是生成模型家族中另一個(gè)極其重要的成員。它的核心假設(shè)是在給定類別的情況下所有特征都是條件獨(dú)立的。即 $$P(\mathbf{x} | C_k) P(x_1 | C_k) P(x_2 | C_k) ... P(x_d | C_k)$$這個(gè)“樸素”的假設(shè)在現(xiàn)實(shí)中幾乎從不成立比如“身高”和“體重”顯然是相關(guān)的但它卻帶來(lái)了巨大的計(jì)算優(yōu)勢(shì)參數(shù)量急劇減少不需要估計(jì)完整的 $d \times d$ 協(xié)方差矩陣只需要估計(jì)每個(gè)特征在每個(gè)類別下的邊緣分布參數(shù)。這使其特別適合超高維特征的場(chǎng)景例如文本分類詞袋模型特征維度動(dòng)輒上萬(wàn)。訓(xùn)練速度極快參數(shù)估計(jì)可以并行進(jìn)行且通常有閉合解。對(duì)缺失數(shù)據(jù)不敏感每個(gè)特征獨(dú)立估計(jì)缺失某個(gè)特征不影響其他特征的似然計(jì)算。根據(jù)對(duì)特征 $x_j$ 分布的不同假設(shè)樸素貝葉斯有以下常見變體高斯樸素貝葉斯假設(shè)連續(xù)特征服從高斯分布。適用于像鳶尾花數(shù)據(jù)集這樣的數(shù)值型特征。多項(xiàng)式樸素貝葉斯假設(shè)特征服從多項(xiàng)式分布。這是文本分類的經(jīng)典模型特征通常是詞頻或TF-IDF值。伯努利樸素貝葉斯假設(shè)特征是二元的出現(xiàn)/不出現(xiàn)。也常用于文本分類特別是短文本或側(cè)重于“是否出現(xiàn)”的場(chǎng)景。實(shí)戰(zhàn)心得文本分類的利器在數(shù)學(xué)建模競(jìng)賽中如果遇到涉及文本情感分析、新聞分類、垃圾郵件識(shí)別等問(wèn)題多項(xiàng)式樸素貝葉斯通常是你的第一道“基線模型”。它的實(shí)現(xiàn)簡(jiǎn)單效果穩(wěn)定能快速提供一個(gè)可比較的基準(zhǔn)。在scikit-learn中使用MultinomialNB配合TfidfVectorizer幾行代碼就能搭建一個(gè)強(qiáng)大的文本分類器。雖然它的獨(dú)立性假設(shè)很強(qiáng)但在詞袋模型這種高維稀疏表示下往往能取得出乎意料的好效果。4.2 混合模型與期望最大化算法捕捉數(shù)據(jù)的內(nèi)部結(jié)構(gòu)很多時(shí)候一個(gè)類別內(nèi)部并不是同質(zhì)的。例如“客戶”這個(gè)類別里可能包含“高價(jià)值活躍客戶”、“低價(jià)值沉默客戶”、“即將流失客戶”等多個(gè)子群體。用一個(gè)單一的高斯分布去擬合這樣一個(gè)多模態(tài)的分布顯然會(huì)力不從心。高斯混合模型GMM就是為了解決這個(gè)問(wèn)題而生。它假設(shè)數(shù)據(jù)是由多個(gè)高斯分布以一定權(quán)重混合而成的 $$P(\mathbf{x}) \sum_{k1}^{K} \pi_k \mathcal{N}(\mathbf{x} | \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)$$ 其中 $\pi_k$ 是混合權(quán)重滿足 $\sum_k \pi_k 1$。GMM本身是一個(gè)無(wú)監(jiān)督聚類模型但它可以很自然地用于生成式分類方法一生成式分類對(duì)每個(gè)類別 $C_j$ 單獨(dú)擬合一個(gè)GMM即 $P(\mathbf{x} | C_j) \sum_{k1}^{K_j} \pi_{jk} \mathcal{N}(\mathbf{x} | \boldsymbol{\mu}{jk}, \boldsymbol{\Sigma}{jk})$。這相當(dāng)于用多個(gè)高斯分布的線性組合來(lái)更精細(xì)地描述每個(gè)類別的復(fù)雜分布。方法二兩階段法先用GMM對(duì)整個(gè)數(shù)據(jù)集不區(qū)分標(biāo)簽進(jìn)行聚類得到K個(gè)成分。然后將每個(gè)樣本的“軟聚類”結(jié)果即屬于各成分的后驗(yàn)概率作為新的特征再輸入到一個(gè)標(biāo)準(zhǔn)的分類器如邏輯回歸中。這種方法有時(shí)能挖掘出數(shù)據(jù)中潛在的子結(jié)構(gòu)提升分類性能。GMM的參數(shù)估計(jì)無(wú)法像高斯分布那樣直接通過(guò)MLE得到閉合解需要使用期望最大化算法EM算法進(jìn)行迭代優(yōu)化。EM算法通過(guò)引入“隱變量”即每個(gè)樣本屬于哪個(gè)混合成分來(lái)簡(jiǎn)化問(wèn)題交替進(jìn)行E步計(jì)算隱變量的后驗(yàn)期望和M步基于期望更新模型參數(shù)。實(shí)戰(zhàn)心得EM算法的陷阱與調(diào)優(yōu)EM算法對(duì)初始值敏感容易陷入局部最優(yōu)。在實(shí)際應(yīng)用中通常需要多次隨機(jī)初始化運(yùn)行多次EM算法選擇似然函數(shù)值最大的那次結(jié)果。利用先驗(yàn)知識(shí)初始化如果對(duì)數(shù)據(jù)子結(jié)構(gòu)有大致了解可以用K-Means聚類的結(jié)果來(lái)初始化GMM的均值和權(quán)重。約束協(xié)方差矩陣對(duì)于高維數(shù)據(jù)使用全協(xié)方差矩陣容易過(guò)擬合。可以約束為對(duì)角矩陣特征獨(dú)立甚至球狀矩陣各向同性這對(duì)應(yīng)sklearn.mixture.GaussianMixture中的covariance_type參數(shù)full,tied,diag,spherical。4.3 如何為你的問(wèn)題選擇合適的生成模型面對(duì)一個(gè)具體的二分類建模任務(wù)如何在這些生成模型中做出選擇下面是一個(gè)決策參考流程數(shù)據(jù)探索先行永遠(yuǎn)的第一步是可視化。繪制特征的分布直方圖、散點(diǎn)圖矩陣。如果單個(gè)類別內(nèi)的特征分布看起來(lái)大致是單峰的、對(duì)稱的那么高斯判別分析LDA/QDA是一個(gè)很好的起點(diǎn)。審視特征維度與樣本量如果特征維度非常高$d 1000$樣本量有限樸素貝葉斯特別是多項(xiàng)式或伯努利變體是你的首選它的計(jì)算效率和防過(guò)擬合能力很強(qiáng)。如果樣本量充足$m d$可以嘗試更復(fù)雜的模型。檢查類別內(nèi)結(jié)構(gòu)如果懷疑一個(gè)類別內(nèi)部存在明顯的子群體例如在散點(diǎn)圖上看到多個(gè)簇考慮使用高斯混合模型來(lái)為每個(gè)類別建模??梢杂脽o(wú)監(jiān)督聚類方法如K-Means先對(duì)每個(gè)類別的數(shù)據(jù)分別進(jìn)行聚類如果輪廓系數(shù)較高則提示可能需要混合模型。特征類型連續(xù)特征GDA GMM。離散/計(jì)數(shù)特征多項(xiàng)式/伯努利樸素貝葉斯?;旌项愋吞卣鬟@比較棘手。一種方法是分別對(duì)連續(xù)和離散部分建?;蛘呤褂媚軌蛱幚砘旌蠑?shù)據(jù)的專用模型在某些軟件包中提供。最終驗(yàn)證沒(méi)有理論能保證哪個(gè)模型一定最好。始終使用交叉驗(yàn)證來(lái)比較不同生成模型以及判別模型在驗(yàn)證集上的性能。在數(shù)學(xué)建模論文中這個(gè)模型對(duì)比和選擇的過(guò)程本身就是重要的分析內(nèi)容。5. 從模型到評(píng)價(jià)生成式分類的完整工作流與陷阱規(guī)避構(gòu)建一個(gè)模型只是開始如何評(píng)價(jià)它、優(yōu)化它并在實(shí)際中可靠地使用它才是更見功力的部分。對(duì)于生成式分類有一些獨(dú)特的評(píng)價(jià)要點(diǎn)和常見陷阱。5.1 評(píng)價(jià)指標(biāo)不止于準(zhǔn)確率對(duì)于二分類問(wèn)題生成模型輸出的是概率 $P(y1|\mathbf{x})$。我們需要一個(gè)閾值通常為0.5將其轉(zhuǎn)化為類別標(biāo)簽。但僅僅看準(zhǔn)確率是遠(yuǎn)遠(yuǎn)不夠的。精確率、召回率與F1分?jǐn)?shù)當(dāng)類別不平衡時(shí)例如欺詐檢測(cè)中正例極少準(zhǔn)確率會(huì)嚴(yán)重失真。此時(shí)精確率查準(zhǔn)率和召回率查全率以及它們的調(diào)和平均F1分?jǐn)?shù)更能反映模型在稀有類別上的性能。生成模型通過(guò)調(diào)整決策閾值可以在精確率和召回率之間做出權(quán)衡繪制P-R曲線。ROC曲線與AUCROC曲線描繪了在不同閾值下模型的真正例率TPR和假正例率FPR的變化情況。其下的面積AUC值衡量的是模型整體的排序能力將正例樣本排在負(fù)例樣本前面的能力。AUC的一個(gè)巨大優(yōu)勢(shì)是它不依賴于具體的分類閾值這對(duì)于評(píng)估概率輸出本身的質(zhì)量非常有用。一個(gè)完美的生成模型其輸出的概率應(yīng)該能夠完美區(qū)分正負(fù)例AUC接近1。對(duì)數(shù)損失也稱為交叉熵?fù)p失。它直接衡量模型輸出的概率分布與真實(shí)標(biāo)簽分布的差異。公式為 $$\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)})$。對(duì)數(shù)損失對(duì)預(yù)測(cè)概率的“校準(zhǔn)度”非常敏感。一個(gè)被預(yù)測(cè)為0.9概率為正的樣本如果它實(shí)際是負(fù)的將對(duì)損失產(chǎn)生很大的懲罰。因此對(duì)數(shù)損失是評(píng)估概率生成模型預(yù)測(cè)“質(zhì)量”的金標(biāo)準(zhǔn)。一個(gè)好的生成模型不僅要有高的AUC還應(yīng)該有低的Log Loss。注意在數(shù)學(xué)建模競(jìng)賽中清晰地展示這些評(píng)價(jià)指標(biāo)并解釋為什么選擇它們例如“由于本問(wèn)題中正例樣本僅占10%我們更關(guān)注模型在正例上的識(shí)別能力因此主要采用F1分?jǐn)?shù)和AUC作為評(píng)價(jià)標(biāo)準(zhǔn)”能顯著提升論文的專業(yè)性。5.2 概率校準(zhǔn)讓你的模型輸出“真概率”生成模型從理論上給出了后驗(yàn)概率但在實(shí)踐中由于模型假設(shè)不完美、參數(shù)估計(jì)有偏等原因其輸出的概率值可能并不“準(zhǔn)”。例如在100個(gè)被模型預(yù)測(cè)為“正例概率0.7”的樣本中實(shí)際只有60個(gè)是正例這說(shuō)明模型過(guò)于自信了。概率校準(zhǔn)的目的就是修正這種偏差使得模型輸出的概率值與實(shí)際發(fā)生的頻率相一致。校準(zhǔn)后的概率在需要依賴概率進(jìn)行后續(xù)決策如風(fēng)險(xiǎn)定價(jià)、資源分配的場(chǎng)景中至關(guān)重要。常用的校準(zhǔn)方法有Platt Scaling將原始模型輸出如決策函數(shù)值或概率通過(guò)一個(gè)邏輯回歸函數(shù)進(jìn)行映射。適用于像SVM這樣輸出非概率分?jǐn)?shù)的模型對(duì)生成模型也有一定效果。Isotonic Regression一種非參數(shù)方法可以學(xué)習(xí)任意單調(diào)的校準(zhǔn)映射比Platt Scaling更靈活但需要更多數(shù)據(jù)容易過(guò)擬合。在sklearn中可以使用CalibratedClassifierCV來(lái)方便地進(jìn)行概率校準(zhǔn)。它會(huì)自動(dòng)在交叉驗(yàn)證的每一折上用驗(yàn)證集學(xué)習(xí)一個(gè)校準(zhǔn)器然后應(yīng)用到測(cè)試集上。實(shí)操建議對(duì)于嚴(yán)肅的應(yīng)用尤其是金融、醫(yī)療等領(lǐng)域?qū)ι赡P突蚱渌魏胃怕誓P瓦M(jìn)行概率校準(zhǔn)是一個(gè)推薦步驟。你可以通過(guò)繪制可靠性曲線來(lái)檢查校準(zhǔn)效果將預(yù)測(cè)概率分桶如[0,0.1), [0.1,0.2), ...計(jì)算每個(gè)桶內(nèi)樣本的平均預(yù)測(cè)概率和實(shí)際正例比例。如果點(diǎn)都落在對(duì)角線附近說(shuō)明校準(zhǔn)得很好。5.3 常見陷阱與解決方案協(xié)方差矩陣奇異或病態(tài)這是高維小樣本數(shù)據(jù)使用GDA/QDA時(shí)最常見的問(wèn)題。癥狀是計(jì)算似然時(shí)出現(xiàn)數(shù)值溢出或得到荒謬的結(jié)果。解決方案特征選擇/降維使用PCA、LDA這里的LDA是線性判別分析一種有監(jiān)督降維方法注意區(qū)分或基于模型的特征選擇減少特征維度。正則化收縮如前所述在估計(jì)的協(xié)方差矩陣上加入一個(gè)正則項(xiàng)如 $\hat{\boldsymbol{\Sigma}}_{\text{reg}} (1-\lambda)\hat{\boldsymbol{\Sigma}} \lambda \text{diag}(\hat{\boldsymbol{\Sigma}})$。sklearn的LinearDiscriminantAnalysis(solverlsqr, shrinkageauto)會(huì)自動(dòng)選擇最優(yōu)的$\lambda$。使用樸素貝葉斯直接規(guī)避了全協(xié)方差矩陣的估計(jì)。類別先驗(yàn)概率的誤用在訓(xùn)練集中各類別的樣本比例可能無(wú)法代表真實(shí)世界中的分布。例如在疾病篩查中訓(xùn)練數(shù)據(jù)可能包含大量病例但真實(shí)人群中患病率很低。解決方案fit方法中估計(jì)的phi是基于訓(xùn)練集的。如果你知道真實(shí)的先驗(yàn)分布 $P_{\text{真實(shí)}}(C_k)$在預(yù)測(cè)時(shí)應(yīng)該使用它來(lái)修正后驗(yàn)概率 $$P_{\text{修正}}(C_k|\mathbf{x}) \propto P(\mathbf{x}|C_k) \times P_{\text{真實(shí)}}(C_k)$$ 在sklearn的LDA和樸素貝葉斯中可以通過(guò)設(shè)置priors參數(shù)來(lái)指定。模型假設(shè)嚴(yán)重違背例如數(shù)據(jù)明顯是非高斯的、多模態(tài)的或者特征間存在復(fù)雜的非線性依賴關(guān)系。解決方案數(shù)據(jù)變換嘗試對(duì)特征進(jìn)行變換如對(duì)數(shù)變換、Box-Cox變換使其更接近高斯分布。使用更靈活的模型切換到混合模型GMM或者考慮判別式模型如核SVM、梯度提升樹它們對(duì)數(shù)據(jù)分布的假設(shè)更弱。生成模型并非萬(wàn)能當(dāng)其主要優(yōu)勢(shì)如處理缺失值、提供數(shù)據(jù)分布不是當(dāng)前任務(wù)的核心需求時(shí)一個(gè)強(qiáng)大的判別模型可能是更簡(jiǎn)單有效的選擇。計(jì)算復(fù)雜度QDA需要為每個(gè)類別估計(jì)并存儲(chǔ)一個(gè) $d \times d$ 的協(xié)方差矩陣及其逆預(yù)測(cè)時(shí)需要計(jì)算二次型當(dāng) $d$ 很大時(shí)計(jì)算和存儲(chǔ)開銷都很大。解決方案對(duì)于高維數(shù)據(jù)優(yōu)先考慮LDA或樸素貝葉斯。如果必須使用QDA考慮使用對(duì)角QDA假設(shè)各類別的協(xié)方差矩陣都是對(duì)角矩陣這大大減少了參數(shù)量。生成式分類為我們打開了一扇從數(shù)據(jù)生成視角理解分類問(wèn)題的大門。它不僅僅是給出一個(gè)預(yù)測(cè)標(biāo)簽更是提供了一套描述數(shù)據(jù)、量化不確定性的完整概率框架。在數(shù)學(xué)建模和實(shí)際應(yīng)用中當(dāng)你需要的不只是一個(gè)黑箱預(yù)測(cè)而是對(duì)問(wèn)題更深刻的理解、對(duì)預(yù)測(cè)結(jié)果更可靠的信心評(píng)估時(shí)概率生成模型無(wú)疑是一個(gè)極具價(jià)值的工具。從扎實(shí)的高斯判別分析基礎(chǔ)出發(fā)逐步擴(kuò)展到更復(fù)雜的模型并時(shí)刻警惕數(shù)據(jù)與模型假設(shè)之間的差距你就能讓生成式思維在解決實(shí)際分類問(wèn)題時(shí)大放異彩。