隨機過採樣 是什麼?

Random Oversampling:隨機過採樣 的完整解釋

隨機過採樣(Random Oversampling)是處理類別不平衡問題的技術,透過隨機複製少數類別的現有樣本,使各類別的訓練樣本數趨於平衡,讓模型對少數類別有足夠的學習機會,但有增加過擬合風險的疑慮

核心概念

類別不平衡(Class Imbalance)是實際機器學習場景中極為普遍的問題:信用卡詐欺檢測中詐欺交易可能只佔 0.1%,疾病篩查中陽性病例可能只佔 2-5%,工業瑕疵檢測中瑕疵品可能只佔 1%。在這種情況下,若直接訓練模型,它往往學會「全部預測為多數類別」,即可達到 99% 以上的準確率,但對少數類別的召回率(Recall)卻趨近於零,完全失去實用意義。

隨機過採樣(Random Oversampling)是應對此問題最直接的方式:在少數類別中隨機選取樣本並複製,直到少數類別的樣本數達到目標比例(通常是與多數類別 1:1)。

運作原理

基本算法:

  1. 計算目標數量:通常目標是讓少數類別樣本數等於多數類別
  2. 需要新增的樣本數 = 目標數量 - 現有少數類別樣本數
  3. 從現有少數類別樣本中有放回地隨機抽取,直到達到目標數量
  4. 合併原始多數類別樣本與擴增後的少數類別樣本,作為新的訓練集

Imbalanced-learn 實作:

from imblearn.over_sampling import RandomOverSampler
from sklearn.datasets import make_classification

# 建立不平衡資料集
X, y = make_classification(n_samples=1000, weights=[0.95, 0.05],
                           random_state=42)
print(f'原始分布:{dict(zip(*np.unique(y, return_counts=True)))}')  
# 原始分布:{0: 950, 1: 50}

ros = RandomOverSampler(sampling_strategy='auto', random_state=42)
X_resampled, y_resampled = ros.fit_resample(X, y)
print(f'過採樣後:{dict(zip(*np.unique(y_resampled, return_counts=True)))}')  
# 過採樣後:{0: 950, 1: 950}

sampling_strategy 參數可以設定目標比例(例如 0.5 代表少數:多數 = 1:2),或 'auto' 代表完全平衡。

過採樣必須在交叉驗證迴圈內部執行

這是最容易犯的錯誤:若在切割驗證集之前執行過採樣,由於訓練集和驗證集可能包含完全相同的複製樣本,模型在驗證集上的表現會被高估(資料洩漏的一種)。正確做法是使用 imblearn.pipeline.Pipeline 確保過採樣只在每個訓練折內部執行:

from imblearn.pipeline import Pipeline  # 注意:要用 imblearn 的 Pipeline,不是 sklearn 的
from imblearn.over_sampling import RandomOverSampler
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold, cross_val_score

pipeline = Pipeline([
    ('oversample', RandomOverSampler(random_state=42)),
    ('clf', RandomForestClassifier(random_state=42))
])

cv = StratifiedKFold(n_splits=5)
scores = cross_val_score(pipeline, X, y, cv=cv, scoring='f1')

實際應用

何時優先選擇隨機過採樣

  • 基線比較:作為其他過採樣方法(SMOTE、ADASYN)的對照基線,快速確認不平衡處理的效果上限。
  • 高維稀疏資料:SMOTE 在高維空間中插值效果不佳,隨機過採樣是更穩健的選擇(例如文字分類的 TF-IDF 特徵)。
  • 小型少數類別:若少數類別樣本數極少(< 10 個),SMOTE 可能產生不合理的合成樣本,此時直接複製更安全。

搭配欠採樣的組合策略

純粹過採樣會大幅增加訓練集規模(過採樣後可能是原始資料的數倍),影響訓練時間。實務中常搭配欠採樣:先對多數類別做欠採樣,再對少數類別做過採樣,在資料量與類別平衡之間取得折衷。

評估指標的選擇

使用過採樣後,模型評估應避免使用準確率(Accuracy),改用 F1-Score、AUC-ROC、Precision-Recall 曲線(尤其對極度不平衡的資料,PR 曲線比 ROC 更具區分力)。

常見誤區

誤區一:過採樣後模型一定更好 過採樣改善了類別不平衡,但複製樣本會讓模型在特定的少數類別樣本上過度擬合。若原始少數類別包含雜訊或標記錯誤,過採樣會放大這些問題。應始終在持出測試集(Hold-out Test Set)上驗證改善效果,而非僅依賴交叉驗證分數。

誤區二:過採樣應用在測試集上 過採樣只能應用於訓練集,測試集必須保持原始分布,以真實反映線上的使用情況。在測試集上過採樣會高估少數類別的效能。

誤區三:準確率是評估不平衡模型的好指標 在 95:5 的不平衡場景中,預測全部為多數類別可達 95% 準確率,但少數類別 F1 = 0。處理不平衡問題後應改用 F1(少數類別)、Balanced Accuracy 或 AUC-ROC 評估,不能用整體準確率。

與相關技術的比較

方法 作用機制 合成新資訊 計算成本 過擬合風險 適用場景
隨機過採樣 複製少數類別樣本 極低 中(重複樣本) 基線、高維資料
隨機欠採樣 刪減多數類別樣本 極低 大型資料集
SMOTE 少數類別樣本之間插值 低(樣本更多樣) 中小型資料集
ADASYN 加強邊界附近的合成 邊界複雜的場景
類別權重調整 損失函數加權 極低 極低 支援 class_weight 的模型

類別權重調整(class_weight='balanced')是最輕量的解法,無需修改訓練資料,若模型支援則優先嘗試。隨機過採樣比 SMOTE 更快但多樣性更低,SMOTE 通常在召回率上有額外提升,但在高維空間可能失效。

常見問題