隨機過採樣(Random Oversampling)是什麼?

隨機過採樣(Random Oversampling)是處理類別不平衡問題的技術,透過隨機複製少數類別的現有樣本,使各類別的訓練樣本數趨於平衡,讓模型對少數類別有足夠的學習機會,但有增加過擬合風險的疑慮|本頁含完整原理、應用場景、iPAS 考試重點與 3 個常見問答。

英文
Random Oversampling
主題標籤
機器學習、資料處理、模型訓練
考點定位
非 iPAS 核心術語
最後更新
2026/06/22
隨機過採樣(Random Oversampling)是什麼? 機器學習資料處理
術語快查

搜尋意圖: 如果你在找「隨機過採樣 是什麼」或「隨機過採樣 和相近概念差在哪」,先看這頁的短定義、完整說明與延伸比較。

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

實用情境: 適合用在閱讀 AI 文章、產品文件或和同事討論時,先用一頁快速對齊概念。

下一步: 先讀完定義,再往下看延伸比較與對應工具,把概念轉成實際應用。

隨機過採樣(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 通常在召回率上有額外提升,但在高維空間可能失效。

常見問題

過採樣應該在交叉驗證的哪個階段執行?

必須在每個交叉驗證折的訓練集內部執行,不能在切割折之前對整體訓練資料執行。若提前執行過採樣,訓練集與驗證集可能共享完全相同的複製樣本,導致驗證集的評估分數虛高(這是一種資料洩漏)。正確做法是使用 imbalanced-learn 的 Pipeline 包裹過採樣步驟,Pipeline 會確保 fit_resample 只在每一折的訓練部分被呼叫,驗證折保持未被修改的狀態。

隨機過採樣和 SMOTE 的主要差異是什麼?

隨機過採樣直接複製現有的少數類別樣本,訓練集中出現重複的資料點,模型可能因此在這些特定點上過擬合。SMOTE(Synthetic Minority Over-sampling Technique)在少數類別的近鄰樣本之間進行線性插值,生成全新的合成樣本,增加了少數類別的多樣性,通常能帶來更好的泛化效果。然而,SMOTE 在高維稀疏空間(如文字的 TF-IDF 表示)中插值可能產生無意義的點,此時隨機過採樣反而更安全。

不平衡問題除了過採樣,還有哪些常見解法?

主要有四類解法:一是採樣策略,包含過採樣(增加少數類)和欠採樣(減少多數類);二是演算法層面的類別權重,大多數 Scikit-learn 模型支援 class_weight='balanced',直接在損失函數中放大少數類的懲罰,無需修改資料;三是調整決策門檻,將二元分類的輸出機率門檻從 0.5 下調(如 0.3),以提高少數類召回率;四是使用對不平衡較不敏感的演算法,如集成方法中的 BalancedRandomForest 或 EasyEnsemble。類別權重調整通常是最快速的基線解法,可優先嘗試。