markdown
問題
許多實際應用中,資料不均勻是常見的
如:工廠中的OK/NG的樣本數比例、醫學影像中罕見疾病的發生機率
使用不均勻資料進行機器學習,所產生的結果會造成偏差
例如:[信用卡詐騙分析](https://www.kaggle.com/mlg-ulb/creditcardfraud)的資料集中,no fraud與fraud佔的百分比為99.83%、0.17%

由於資料的數量偏向某一類別,在資料沒有處理的情況下會造成overfitting
分類模型將假定在大多數情況下沒有詐騙,而實際的模型是希望能找出少數的詐騙事件
解決方法
* 收集更多數據
* 設定訓練時的 class weights
調整訓練時的類別權重,讓類別資料數較少的影像有較高的權重
EX:當資料數量為100:2:50, 權重可設定為 $\dfrac{100}{100} : \dfrac{100}{2} : \dfrac{100}{50} = 1 : 50 : 2$
```=python
# 設定訓練權重
class_weight = {0: 1.,
1: 50.,
2: 2.}
model.fit(X_train, Y_train, nb_epoch=5, batch_size=32, class_weight=class_weight)
```
* Oversampling
* Random oversampling
隨機重複採樣相同資料填充數據集
* Data Generator
影像中的過採樣
對現有影像旋轉、位移、調整亮度、縮放產生更多數據集
參考[keras ImageDataGenerator](https://keras.io/api/preprocessing/image/)
* SMOTE(Synthetic Minority Oversampling Technique)
基於已存在的資料,隨機抽取一個點,並與他的鄰居資料點(k-nearest neighbors)產生一個新的合成資料
* Undersampling
* Random undersampling
從各類別中隨機抽取樣本
* Cluster
各群內進行clustering(K-Means),刪除遠離各群群心的資料點
Note:採樣流程要在切分訓練、測試集之後,才能讓測試集保持純度
所得到的測試結果才有鑑別度
參考
[训练集样本不平衡问题对CNN的影响](https://zhuanlan.zhihu.com/p/23444244)
[smote-enn-解決數據不平衡建模的採樣方法](https://medium.com/%E6%95%B8%E5%AD%B8-%E4%BA%BA%E5%B7%A5%E6%99%BA%E6%85%A7%E8%88%87%E8%9F%92%E8%9B%87/smote-enn-%E8%A7%A3%E6%B1%BA%E6%95%B8%E6%93%9A%E4%B8%8D%E5%B9%B3%E8%A1%A1%E5%BB%BA%E6%A8%A1%E7%9A%84%E6%8E%A1%E6%A8%A3%E6%96%B9%E6%B3%95-cdb6324b711e)