CatBoostを初心者に使ってもらう

## はじめに


### この記事の目的
機械学習の勉強を最近始めた方は次のようなことを思うのではないでしょうか？  

- モデルが多すぎてどれを使えばいいのかわからない  
- 見つけたモデルがなにかの進化系→昔のモデルから勉強する必要があり大変  

この記事では、機械学習の初心者がCatBoostを使うための最小限の知識を解説します。 
元の論文は[こちら](https://arxiv.org/pdf/1706.09516)


### 対象読者  
- 機械学習実装の流れは知ってる
- なにか１つのモデルを勉強したことがある  
- CatBoostを使ってみたい


## ➀ CatBoostの特徴

CatBoostは、カテゴリカルデータ(後ほど説明)を効果的に処理するために設計されたアルゴリズムです。初心者向けの最低限の特徴を紹介します：

- **対応データ**：カテゴリカルデータを扱える
- **高精度**：他のアルゴリズムより高い精度を出せる

[こちらの論文](https://link.springer.com/article/10.1186/s40537-020-00369-0)を参考にさせていただきました。



### どんな時にCatBoostを使うか  

CatBoostは、テーブルデータ（CSVやエクセル）を用いた教師あり学習に広く使用されています。特に、以下のようなデータセットに対して効果的です：

- **データの種類**：
  - カテゴリカルデータのみで構成されたデータ
  - カテゴリカルデータと数値データの両方を含むデータ

CatBoostは、以下のような様々なタスクに利用できます：

- **分類**：顧客の購入予測、スパムメールの検出、クレジットカードの不正利用検出など
- **回帰**：不動産価格の予測、売上予測、気象データの予測など
- **ランキング**：検索エンジンの結果ランキング、レコメンデーションシステムなど
- **時系列予測**：株価予測、需要予測など


## ➁ カテゴリカルデータとは


### カテゴリカルデータの定義

テーブルデータは大きく分けてカテゴリカルデータと数値データの2種類に分類されます。

- **カテゴリカルデータ**：データがいくつかのカテゴリーに分類されるものを指し、文字列やラベルで表現されます。
- **数値データ**：数値で表現されるデータを指し、計算や比較が可能です。


#### カテゴリカルデータの具体例

- **色**：赤、青、緑
- **性別**：男性、女性
- **国籍**：日本、アメリカ、フランス


#### 数値データの具体例

- **年齢**：25歳、30歳、45歳
- **収入**：500万円、700万円、1000万円
- **温度**：20度、25度、30度


### 数値化の必要性

機械学習モデルは数値データを計算に使うため、カテゴリカルデータを数値に変換しなくてはいけません。このプロセスを「エンコーディング」と呼びます。最も簡単なワンホットエンコーディングを具体例として紹介します。


### 具体例

- **ワンホットエンコーディング**：カテゴリカルデータを0と1で表現します。

![ワンホット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808337/d7c36301-db4f-dc9f-0091-95ccc14b4741.png)


## ➂ CatBoostのエンコーディング


### Ordered TSの仕組み

CatBoostは、Ordered TS という手法でエンコーディングしています。正しくCatBoostを扱うためにこの手法を紹介します。内部で何が行われるかを知り、入力データを正しく設定できるようになるためです。  

Ordered TS では次のステップでカテゴリカルデータを数値化します。

1. トレーニングデータをランダムに順序付け
2. 各データの前のデータを使用してターゲット統計量を計算

ちなみに、なんでこれでうまくいくの？と思うかもしれませんが、うまくいったからこの手法を採用しているようです。結果がすべてのようですね。


### 具体例

例えば、以下のようなデータセットをOrdered TS でエンコーディングしてみましょう：  

まず、データセットをランダムに順序付けします。

![Ordered TS➀.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808337/7ff49625-2f01-9b0f-f58e-60ae8d19ce63.png)
　　
次の式を用いてカテゴリカルデータを数値化します。
```math
\frac{\text{手前で登場した同じカテゴリのラベルの値の和} + 0.05}{\text{手前で同じカテゴリが登場した回数} + 1}
```

順序をもとに入れ替えて年齢というカテゴリカルデータをOrdered TSで数値化します。
  
![Ordered TS➁.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808337/6707287e-f205-6956-291c-34f2030e59b3.png)


ユーザー６に注目して計算を紹介します。  
ユーザー６は順序が６なので1~5のデータを使用して計算します。  
まず、手前で登場した同じカテゴリのラベルの値の和は、ユーザー１とユーザー３のラベルを合計して１になります。  
次に手前で同じカテゴリが登場した回数はユーザー１とユーザー３の２回で２になります。  
これをあてはめて計算すればエンコーディングの結果は0.35となります。

[こちらの動画](https://youtu.be/KXOTSkPL2X4?si=E7UH_3G2WZ70NdRj)が分かりやすく参考にさせていただきました。


## 実装してみる

CatBoostを使ってカテゴリカルデータを処理し、モデルをトレーニングする方法を実際に実装してみます。以下のコードは、簡単な2値分類の例を示しています。  

colabで実装できるように紹介します。

### 必要なライブラリのインストール

まず、CatBoostライブラリをインストールします。以下のコマンドを実行してください：

```
pip install catboost
```


### CatBoostの実装

データの準備、モデルの作成、モデルのトレーニング、予測までのコードを示します。  
本来はトレーニングデータとテストデータを用意しますが割愛

```python
import pandas as pd
from catboost import CatBoostClassifier

# データの準備
data = {
    'user': ['ユーザー1', 'ユーザー2', 'ユーザー3', 'ユーザー4', 'ユーザー5', 'ユーザー6'],
    'age': ['20代', '30代', '20代', '30代', '40代', '20代'],
    'purchased': [1, 0, 0, 0, 1, 1]
}

df = pd.DataFrame(data)
X = df[['age']]
y = df['purchased']

# モデルの作成
model = CatBoostClassifier(cat_features=[0], iterations=100, verbose=0)

# モデルのトレーニング
model.fit(X, y)

# 予測
predictions = model.predict(X)
print(predictions)
```

## まとめ

CatBoostを使用することでカテゴリカルデータを効果的に処理し、高性能なモデルを簡単に構築することができます。ぜひ、CatBoostを使ってみてください！
紹介してない内容もたくさんあるのでもっと詳しく知りたい方は論文や他の記事を読んでみてください！

# Reference
[1] Liudmila Prokhorenkova, Gleb Gusev, Aleksandr Vorobev, Anna Veronika Dorogush, Andrey Gulin, "CatBoost: unbiased boosting with categorical features", 2019.
[2] John T. Hancock and Taghi M. Khoshgoftaar, "CatBoost for big data: an interdisciplinary
review", 2020.
[3] https://youtu.be/KXOTSkPL2X4?si=E7UH_3G2WZ70NdRj
[4] https://catboost.ai/en/docs/concepts/python-quickstart