搜尋意圖: 如果你在找「隨機過採樣 是什麼」或「隨機過採樣 和相近概念差在哪」,先看這頁的短定義、完整說明與延伸比較。
TL;DR: 隨機過採樣(Random Oversampling)是處理類別不平衡問題的技術,透過隨機複製少數類別的現有樣本,使各類別的訓練樣本數趨於平衡,讓模型對少數類別有足夠的學習機會,但有增加過擬合風險的疑慮
實用情境: 適合用在閱讀 AI 文章、產品文件或和同事討論時,先用一頁快速對齊概念。
下一步: 先讀完定義,再往下看延伸比較與對應工具,把概念轉成實際應用。
隨機過採樣(Random Oversampling)是處理類別不平衡問題的技術,透過隨機複製少數類別的現有樣本,使各類別的訓練樣本數趨於平衡,讓模型對少數類別有足夠的學習機會,但有增加過擬合風險的疑慮
核心概念
類別不平衡(Class Imbalance)是實際機器學習場景中極為普遍的問題:信用卡詐欺檢測中詐欺交易可能只佔 0.1%,疾病篩查中陽性病例可能只佔 2-5%,工業瑕疵檢測中瑕疵品可能只佔 1%。在這種情況下,若直接訓練模型,它往往學會「全部預測為多數類別」,即可達到 99% 以上的準確率,但對少數類別的召回率(Recall)卻趨近於零,完全失去實用意義。
隨機過採樣(Random Oversampling)是應對此問題最直接的方式:在少數類別中隨機選取樣本並複製,直到少數類別的樣本數達到目標比例(通常是與多數類別 1:1)。
運作原理
基本算法:
- 計算目標數量:通常目標是讓少數類別樣本數等於多數類別
- 需要新增的樣本數 = 目標數量 - 現有少數類別樣本數
- 從現有少數類別樣本中有放回地隨機抽取,直到達到目標數量
- 合併原始多數類別樣本與擴增後的少數類別樣本,作為新的訓練集
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。類別權重調整通常是最快速的基線解法,可優先嘗試。