AI時代系列(1) 機器學習三部曲: 🔹 第一部:《機器學習 —— AI 智慧的啟航》
18/100 第二週:資料處理與特徵工程
18. 處理不平衡資料 ⚖ 避免 AI 偏心,讓少數類別也能被正確預測!
避免 AI 偏心,讓少數類別也能被正確預測!
________________________________________
1️⃣ 什麼是不平衡資料?
在機器學習分類問題中,如果某一類別的數據量遠大於其他類別,模型可能會過度偏向多數類別,導致少數類別預測不準確。
📊 例子
類別 數量
🟢 類別 0(正常交易) 9500 筆
🔴 類別 1(詐欺交易) 500 筆
在這種情況下,模型可能只要永遠預測「正常交易」,就能有 95% 的準確率,但這樣完全無法偵測詐欺交易,這就是不平衡資料(Imbalanced Data) 的問題。
________________________________________
2️⃣ 如何判斷數據是否不平衡?
✅ (1) 觀察類別比例
可以用 value_counts() 來查看各類別的分布:
python
import pandas as pd
# 假設 y 是標籤(target)
y = pd.Series([0] * 9500 + [1] * 500)
# 計算類別比例
print(y.value_counts(normalize=True))
📌 如果某個類別佔比超過 90%,就可能是不平衡數據!
✅ (2) 繪製柱狀圖
python
import matplotlib.pyplot as plt
y.value_counts().plot(kind="bar")
plt.xlabel("類別")
plt.ylabel("數量")
plt.title("類別分布")
plt.show()
📌 可視化類別分布,確認是否有不均衡問題。
________________________________________
3️⃣ 處理不平衡資料的方法
解決不平衡數據的策略主要分為 兩大類:
1. 調整數據(Resampling)
2. 調整模型(Algorithmic Techniques)
________________________________________
📌 方法 1:調整數據(Resampling)
這些方法透過 增加少數類別數據(過採樣) 或 減少多數類別數據(欠採樣) 來平衡類別。
✅ (1) 過採樣(Oversampling) – 增加少數類別數據
讓少數類別的數據數量增加,使其與多數類別的比例更接近。
📌 方法
• 隨機過採樣(Random Oversampling)
• SMOTE(Synthetic Minority Over-sampling Technique)(常見)
python
from imblearn.over_sampling import SMOTE
X_resampled, y_resampled = SMOTE().fit_resample(X, y)
print("原始數據分布:")
print(y.value_counts())
print("過採樣後的數據分布:")
print(pd.Series(y_resampled).value_counts())
📌 效果
• 讓少數類別的數據量增加,使模型更能學習到其特徵。
• SMOTE 透過 KNN 方法生成新的合成樣本,而不是簡單複製現有數據。
________________________________________
✅ (2) 欠採樣(Undersampling) – 減少多數類別數據
隨機移除多數類別的數據,使其與少數類別的比例更接近。
📌 方法
• 隨機欠採樣(Random Undersampling)
• Tomek Links(移除容易混淆的樣本)
python
from imblearn.under_sampling import RandomUnderSampler
X_resampled, y_resampled = RandomUnderSampler().fit_resample(X, y)
print("欠採樣後的數據分布:")
print(pd.Series(y_resampled).value_counts())
📌 效果
• 讓數據更加均衡,但可能會丟失部分有價值的數據。
• 適合數據量很大的情況,否則可能會導致訓練數據不足。
________________________________________
📌 方法 2:調整模型(Algorithmic Techniques)
如果不想調整數據,也可以透過調整機器學習模型來解決不平衡問題。
✅ (3) 權重調整(Class Weights)
在訓練時,給少數類別較高的權重,讓模型更關注這些類別。
📌 使用方式
python
from sklearn.ensemble import RandomForestClassifier
# 設定 class_weight="balanced",自動調整權重
model = RandomForestClassifier(class_weight="balanced")
model.fit(X_train, y_train)
📌 適合場景
• 不想修改原始數據,但希望模型對少數類別更敏感。
________________________________________
✅ (4) 調整評估指標
如果類別不平衡,準確率(Accuracy)容易誤導,我們應該使用:
• 精確率(Precision):被預測為「正類」的樣本中,真正正確的比例。
• 召回率(Recall):實際的「正類」中,被成功預測出來的比例。
• F1-Score:精確率和召回率的加權平均數。
• AUC-ROC 曲線:衡量分類模型在不同閾值下的區分能力。
python
from sklearn.metrics import classification_report
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
📌 適合場景
• 不想改變數據,但希望更準確地評估模型效能。
________________________________________
4️⃣ 各方法的比較
方法 適用場景 優點 缺點
當面對類別不平衡問題時,可以考慮多種策略:若數據量較少,採用過採樣(如 SMOTE)能有效增加少數類別樣本,提升召回率但需注意可能引入噪音;數據量較大時,欠採樣有助於降低計算成本,但要留意可能損失有價值的數據;若不希望改變數據集本身,調整類別權重(class_weight)是一種簡單且有效的方法,但需模型本身支援;此外,調整評估指標則能避免被準確率誤導,幫助更準確地評估模型效果,然而僅影響評估層面,無法直接改善模型性能。
________________________________________
🎯 結論
📌 不平衡數據會導致 AI 偏心,需要適當處理!
📌 最好的方法通常是「數據處理」+「模型調整」的組合!
📌 請務必使用 Precision / Recall / F1-Score 來評估,而不是僅看準確率!
🚀 推薦策略
1️⃣ 中小數據集 → 使用 SMOTE(過採樣)+ 權重調整
2️⃣ 大型數據集 → 欠採樣 + class_weight="balanced"
3️⃣ 時間有限 → 直接調整 class_weight
這樣,你的 AI 就能公平對待所有類別,避免偏心! 🎯