不均衡データ処理【アンダーサンプリング】

:::note
Day16: [機械学習 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/machine-learning)

「不均衡データ処理」シリーズの3つ目の記事です。
1: [不均衡データ処理【概要】](https://qiita.com/citrus-soke/items/9fad1a791e757f253342)
2: [不均衡データ処理【オーバーサンプリング】](https://qiita.com/citrus-soke/items/18a87eb506b0f6d0c6d2)
3: 不均衡データ処理【アンダーサンプリング】 / 当記事
4: 不均衡データ処理【ハイブリッド手法】 / coming soon
5: 未定
:::

# ③ アンダーサンプリングの理論と比較
## アンダーサンプリングとは
アンダーサンプリング は、クラス不均衡問題において**多数派クラスのデータ数を削減** し、少数派クラスとのバランスを取る手法である。
オーバーサンプリングとは異なり、既存のデータを増やすのではなく、データを削減することでクラスの比率を調整するため、計算コストが削減される利点がある。
しかし、データが削減されることで 情報の損失 が発生するリスクがあるため、適切な手法の選定が重要である。

## 代表的なオーバーサンプリング手法
- **ランダムアンダーサンプリング**
  最もシンプルな手法で、多数派クラスのデータをランダムに削減する。
  簡単で実装しやすいが、重要なデータを削除してしまう可能性がある。
    ```python
    from imblearn.under_sampling import RandomUnderSampler
    under_sampler = RandomUnderSampler(random_state=42)
    X_under, y_under = under_sampler.fit_resample(X, y)
    ```
<br>

- **NearMiss**
  NearMiss は、多数派クラスのデータから**少数派クラスに近いデータのみを残す** 手法である。以下の3つのバリエーションが存在する:
    1. **NearMiss-1**: 少数派クラスに近いデータ上位k個を残す
    2. **NearMiss-2**: 少数派クラスのデータに対して、平均距離が最も小さい多数派クラスのデータを残す
    3. **NearMiss-3**: 少数派クラスのデータごとに、近傍k個の多数派データを選ぶ
    ```python
    from imblearn.under_sampling import NearMiss
    nearmiss = NearMiss(version=1) # NearMiss-1を例に実装
    X_nearmiss, y_nearmiss = nearmiss.fit_resample(X, y)
    ```

<br>

- **Tomek Links**
  Tomek Linksは、少数派クラスと多数派クラスの 境界にあるデータペア に着目し、
その境界付近の多数派クラスのデータを削減する手法である。
Tomek Linksを削除することで、クラス境界が明確になり、分類性能が向上することが期待される。

    ```python
    from imblearn.under_sampling import TomekLinks
    tomek = TomekLinks()
    X_tomek, y_tomek = tomek.fit_resample(X, y)
    ```

## オーバーサンプリングの理論
アンダーサンプリングの理論的背景は以下の2点に基づいている：

データセットのバランス化: 多数派クラスのデータ量を削減することで、モデルが少数派クラスを無視する傾向を抑制する。
計算コストの削減: データ量が減少するため、学習時間やメモリの節約につながる。

## メリット・デメリット
### メリット
- データ量が削減されるため、計算コストが低く抑えられる。
- クラス不均衡の問題を軽減し、少数派クラスの精度向上が期待される。
### デメリット
- 情報の損失: 重要な多数派クラスのデータが削除されるリスクがある。
- 適切に選ばないと、過学習や分類性能の低下を招くことがある。

---

## アンダーサンプリング前後のモデル性能
### 概要
アンダーサンプリングを適用した場合と適用しなかった場合で、モデルの性能にどのような違いが出るかを実際に比較してみる。

ここでは、3つの異なるデータを使用して、以下のような手順で性能を比較する。
データについては、当シリーズの最初の記事を見ていただきたい。

https://qiita.com/citrus-soke/private/9fad1a791e757f253342#サンプルデータセット

- **モデル構築**:
  - 各データセットに対して、`RandomForestClassifier`を用いて訓練

- **性能評価指標**:
  - accuracy
  - precision
  - recall
  - f1-score

アンダーサンプリングを行うことで、少数派クラスの予測精度が向上することが期待される。また、特に少数派クラスが重要なタスクにおいては、アンダーサンプリング手法が有効であると考えられる。

具体的には、以下のような結果が期待される。

- **アンダーサンプリング前**: 少数派クラスの精度が低く、多数派クラスに偏った予測がされる
- **アンダーサンプリング後**: 少数派クラスの予測精度が向上し、全体的な精度も改善される。特にF1スコアやROC-AUCの指標で改善が見られる

### 動作検証
#### Sample 1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748559/b0c0f3a8-5a8b-4782-fcc7-780522e12b69.png)

#### Sample 2
##### 分布図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748559/29bd1733-3cb5-3029-0732-b32ee7f7cae9.png)

##### 性能比較

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748559/51f39c11-62ce-36d9-76bb-4c7a10920f9d.png)

#### Sample 3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748559/8e6305ae-1496-f3f6-0dd5-5f88671ce591.png)


## 5. **オーバーサンプリングが適している場合**

アンダーサンプリングがオーバーサンプリングより適している場合には、次のような状況がある。

1. **データセットが非常に大きい場合**  
2. **過剰なデータで過学習を防ぎたい場合**  
   オーバーサンプリングは、少数クラスのデータを増加させることで学習を安定させるが、過剰なデータにより過学習を引き起こす可能性がある。アンダーサンプリングは過学習を防ぐために、データの数を減らす方法として有効である。

3. **計算リソースが限られている場合**  
   オーバーサンプリングは、新しいサンプルを生成するため計算リソースを消費する。リソースが限られている場合、アンダーサンプリングでデータ量を減らす方が効率的である。

4. **少数クラスが非常に重要な場合**  
   少数クラスのデータが非常に重要で、オーバーサンプリングによって少数クラスに過度に依存するリスクがある場合、アンダーサンプリングによってバランスを取ることが有効である。