罕見疾病資料集嚴重不平衡,怎麼提升少數類偵測?
若開發一個用於罕見疾病自動診斷的分類模型,目前資料集中確診樣本僅佔不到 1%,且因為標註成本高,短期內無法取得更多資料。在此情況下,若希望提升模型對少數類的偵測能力,同時避免過擬合,下列哪一種策略最為合理?
要開發罕見疾病診斷模型,資料集中確診樣本不到 1%,且短期內無法補充更多標註資料。目標是提升模型偵測這 1% 少數類的能力,同時不要過擬合。
問你:資料嚴重不平衡且無法取得更多真實標註資料,哪種策略最合理?
一句話總結
資料嚴重不平衡(少數類 <1%)且無法補充真實資料,用SMOTE(合成少數類過採樣技術)生成合成樣本平衡資料集,比直接複製樣本(過採樣)或刪減多數類(欠採樣)更能避免過擬合並保留資訊。
先感受問題:10,000 筆資料裡只有 90 個確診案例
「博仁醫療 AI」的工程師雅筑要開發一個罕見疾病篩檢模型。
訓練資料:10,000 筆病患記錄,其中確診(陽性): 90 筆(0.9%),未確診(陰性): 9,910 筆(99.1%)。
如果直接訓練,模型學到的最簡單規則就是「全部預測陰性」,準確率高達 99.1%,但所有陽性案例都漏掉了,根本沒用。
雅筑需要一個方法讓模型「看到更多陽性案例」,但又不能製造假資料讓模型過擬合。
其他做法各有缺陷
- 隨機過採樣容易過擬合:把 90 個陽性樣本複製貼上幾百次,模型反覆看到完全相同的資料,「記住」這些特定案例,對略微不同的新陽性樣本反而辨識不出來。
- 欠採樣丟棄大量有效資訊:把 9,910 個陰性樣本隨機砍到 90 個,訓練集剩 180 筆,大量原本有用的資訊被丟掉,模型泛化能力差。
- 只調閾值不改資料分佈:降低決策閾值(例如從 0.5 改到 0.1)可以提升召回率,但模型底層的決策邊界沒變,只是「更寬鬆」地標記陽性,精確率會大幅下降,產生大量誤報。
- 直接用不平衡資料硬訓:模型被 9,910 個陰性案例淹沒,梯度更新幾乎全被多數類主導,少數類信號微弱,訓練效果差。
- 加大少數類的損失權重:雖然比不做處理好,但仍是在同樣的 90 筆上做文章,資料量太少時模型仍難以學到穩健的決策邊界。
SMOTE 在真實樣本之間插值,生成新的合理樣本
雅筑採用 SMOTE,做法如下:
- 對每個陽性樣本,找出它的 k 個最近鄰(同樣是陽性樣本)
- 在這個樣本和它的某個近鄰之間,隨機插值產生一個「新」合成樣本
- 重複直到陽性樣本數量到達目標比例(例如陽性:陰性 = 1:4)
為什麼 SMOTE 比直接複製好:合成的樣本是在真實樣本之間「插出來的新點」,不是原有樣本的複製。模型看到的是「分佈在真實陽性樣本附近的合理變體」,學到的決策邊界更穩健,不會只記住那 90 個固定點。
這就是選項 C 講的:使用 SMOTE(Synthetic Minority Over-sampling Technique)生成合成少數類樣本後再訓練分類模型。
技術版:SMOTE 的概念位置和相關改進
SMOTE 是 Chawla 等人在 2002 年提出的不平衡資料處理方法,核心算法:對每個少數類樣本 xi,隨機選取其 k-近鄰中的一個 xnn,在兩點之間插值:x_new = xi + rand(0,1) × (xnn - xi)。
SMOTE 的幾個重要改進版本:
- SMOTE-NC:處理含類別特徵的資料(原版 SMOTE 只能處理數值特徵)
- Borderline-SMOTE:只在決策邊界附近的少數類樣本上做插值,更有針對性
- ADASYN(Adaptive Synthetic Sampling):根據樣本被誤分類的難易程度,自動調整生成密度
Python 的 imbalanced-learn 套件提供完整 SMOTE 家族實作,使用方式:
from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X_train, y_train)
評估不平衡模型不能只看 Accuracy,應看 F1-Score(少數類)、Recall、AUC-ROC 或 PR-AUC(Precision-Recall 曲線下面積,對不平衡資料更敏感)。
為什麼其他選項是錯的
A對少數類進行隨機過採樣(Random Oversampling)
把那 90 個陽性樣本隨機複製多份,讓陽性和陰性數量接近。
題目明確說「避免過擬合」,而隨機過採樣的最大問題就是過擬合。複製相同樣本讓模型反覆看到同樣的資料點,模型學的是「這 90 個特定樣本」而非「陽性樣本的一般特徵」,對新的陽性樣本泛化能力差。
知道「要增加少數類樣本」但不清楚隨機過採樣和 SMOTE 差異的人。兩者都在增加少數類,但 SMOTE 生成「新」樣本,隨機過採樣只是複製舊樣本。
B對多數類進行欠採樣(Random Undersampling)
把 9,910 個陰性樣本隨機刪掉大部分,讓陰性和陽性數量相近。
刪掉 9,820 個陰性樣本(訓練集只剩 180 筆),原本有價值的陰性資訊大量丟失。用 180 筆訓練出來的模型泛化能力極差,且訓練集太小,過擬合問題更嚴重。
記住「不平衡資料可以用欠採樣平衡」但沒考慮到「當少數類只有 90 筆時,刪多數類後訓練集會小到不夠用」的人。
D僅使用現有資料調整模型決策閾值以提升召回率
不改訓練資料,只把分類器的判斷門檻調低,讓更多樣本被標記為陽性。
閾值調整是「不改動模型,只調整輸出判斷標準」,它確實能提升召回率,但代價是精確率大幅下降:大量陰性樣本被誤判為陽性(誤報率飆升)。醫療場景這意味著大量健康者被誤診、後續不必要的醫療資源浪費,且模型本身的決策能力沒有提升。
只知道「調低閾值可以抓到更多陽性」,但沒考慮精確率代價,或把「提升偵測能力」誤解為「只要召回率高就好」的人。
同個考點下次怎麼變形
評估不平衡資料集的模型,為什麼不能只看 Accuracy?
準確率不是最重要的指標嗎?
99:1 的不平衡資料中,「全預測陰性」的模型準確率就有 99%,但召回率為 0。應改用 F1-Score(少數類)、PR-AUC 或 ROC-AUC 評估,這些指標對少數類的預測能力更敏感。
SMOTE 插值有什麼潛在問題?在什麼情況下效果不好?
SMOTE 聽起來很好,有沒有不適用的場景?
SMOTE 在少數類樣本很少(如 <5 個)時,插值出來的合成樣本幾乎都在相同區域,多樣性不足。另外,若少數類和多數類在特徵空間嚴重重疊,SMOTE 可能在錯誤區域插值,產生「讓模型更混亂」的合成樣本。
除了 SMOTE,不平衡資料還有哪些常見處理策略?
SMOTE 是一種,還有其他方法嗎?
調整損失函數的類別權重(class_weight='balanced');使用對不平衡資料穩健的算法(如隨機森林、XGBoost,本身有樣本權重機制);集成方法(EasyEnsemble、BalancedBaggingClassifier);Focal Loss(強調難分類的少數類樣本)。
SMOTE 應該在訓練集還是整個資料集上做?
合成樣本要在切分前後生成,順序重要嗎?
MUST 只在訓練集上做 SMOTE,驗證集和測試集保持原始分佈。如果先做 SMOTE 再切分,合成樣本會出現在訓練集和驗證集,導致資訊洩漏(Data Leakage),評估指標虛高。
「Focal Loss」是什麼?它解決不平衡問題的方式和 SMOTE 有什麼不同?
目標偵測的論文常提到 Focal Loss,它也是處理不平衡嗎?
Focal Loss 是損失函數的改進,對容易分類的樣本(多數類)降低損失權重,讓模型更專注於困難樣本(少數類)。SMOTE 是在資料層面做平衡;Focal Loss 是在訓練目標函數層面做平衡,不需要改動資料集,常用於物件偵測(Retina-Net)和不平衡分類任務。
想再往下看,這 5 個
- 資料不平衡(Data Imbalance)類別比例嚴重失衡的資料集,是 SMOTE 等過採樣技術的應用場景。
- 資料擴增術(Data Augmentation)SMOTE 是一種針對表格資料的資料擴增方法,圖像領域有翻轉、旋轉等類似技術。
- F1 Score(F1 分數)評估不平衡資料集模型效果的關鍵指標,綜合精確率和召回率的調和平均。
- 召回率(Recall)醫療診斷場景最關鍵的指標,衡量模型找出所有真陽性的能力。
- 合成數據(Synthetic Data)SMOTE 生成的合成樣本是合成數據的一種,廣泛用於解決資料稀缺和不平衡問題。