Google ColabでLightAutoML(LAMA)を試す

# はじめに
最近のKaggleのテーブルデータのコンペでLightautoML(LAMA)というAutoMLが使われているので、試してみました。

# LightAutoML(LAMA)
**LAMA**は表形式のデータを扱うタスクに使えるオープンソースのAutoMLのライブラリです。従来のAutoMLがニューラルネットワークのような計算量の多い手法を使っていたのに対して、少数のGBDTと線形モデルに集中することで、処理速度と性能のバランスを保ち効率を向上させています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691958/c1795f9d-fe94-d477-1bbd-adbd9fa1c227.png)

https://lightautoml.readthedocs.io/en/latest/

https://arxiv.org/abs/2109.01528

# Colabでの実行

有名なTitanicのデータを使ってLightAutoMLの実力を確認します。

https://www.kaggle.com/competitions/titanic/overview

それではチュートリアルに沿って実行していきましょう！
手順は以下の通りです。

(1) ライブラリのインストール
```python
!pip install -U lightautoml
```
(2) ライブラリのインポート
```python
# 一般的なPythonのライブラリ
import os

# データ分析用のライブラリ
import numpy as np
import pandas as pd
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import train_test_split
import torch

# LightAutoMLのライブラリ
from lightautoml.automl.presets.tabular_presets import TabularAutoML, TabularUtilizedAutoML
from lightautoml.tasks import Task
from lightautoml.report.report_deco import ReportDeco, ReportDecoUtilized
```
(3) 定数の設定
Titanicのデータ(train.csv, test.csv, gender_submission.csv)はGoogle Drive直下に"data"というフォルダを作って入れてください。

```python
N_THREADS = 2
N_FOLDS = 5
RANDOM_STATE = 42
TEST_SIZE = 0.2
TIMEOUT = 300
TARGET_NAME = 'Survived'

DATASET_DIR = '/content/drive/MyDrive/data/'
DATASET_NAME = 'train.csv'
DATASET_FULLNAME = os.path.join(DATASET_DIR, DATASET_NAME)
```

(4) Google Driveのマウント
```python
from google.colab import drive
drive.mount("/content/drive")
os.listdir(DATASET_DIR)
```

(5) データの確認
```python
data = pd.read_csv(DATASET_DIR + DATASET_NAME)
data.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691958/ef45c6b3-3c3b-ff3e-1cb0-4fbfb4c83d33.png)

(6) validationデータの分割
```python
train_data, val_data = train_test_split(
    data,
    test_size=TEST_SIZE,
    stratify=data[TARGET_NAME],
    random_state=RANDOM_STATE
)

print(f'Data is splitted. Parts sizes: train_data = {train_data.shape}, val_data = {val_data.shape}')

train_data.head()
```

(7) LightAutoMLの設定
```python
task = Task('binary')
roles = {
    'target': TARGET_NAME
    }
    
automl = TabularAutoML(
    task = task,
    timeout = TIMEOUT,
    cpu_limit = N_THREADS,
    reader_params = {'n_jobs': N_THREADS, 'cv': N_FOLDS, 'random_state': RANDOM_STATE},
)
```

(8) モデルの学習と評価
```python
out_of_fold_predictions = automl.fit_predict(train_data, roles = roles, verbose = 1)
```
評価結果を見ると良さそうですね！
ハイパーパラメータ調整したLightGBMの寄与が低いのはちょっと意外です。
```python
val_predictions = automl.predict(val_data)

print(f'OOF score: {roc_auc_score(train_data[TARGET_NAME].values, out_of_fold_predictions.data[:, 0])}')
print(f'HOLDOUT score: {roc_auc_score(val_data[TARGET_NAME].values, val_predictions.data[:, 0])}')
print(automl.create_model_str_desc())
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691958/082d01ec-7b87-2c23-444e-d9e087e3584d.png)

(9) 特徴量重要度の計算
```python
RD = ReportDeco()

automl_rd = RD(
    TabularAutoML(
        task = task,
        timeout = TIMEOUT,
        cpu_limit = N_THREADS,
        reader_params = {'n_jobs': N_THREADS, 'cv': N_FOLDS, 'random_state': RANDOM_STATE}
    )
)

out_of_fold_predictions = automl_rd.fit_predict(train_data, roles = roles, verbose = 1)

fast_fi = automl_rd.model.get_feature_scores('fast')
fast_fi.set_index('Feature')['Importance'].plot.bar(figsize = (30, 10), grid = True)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691958/88978b35-0d77-4082-0759-5f6af9b9e0f4.png)


(10) testデータとsubmit用ファイルの読み込み
```python
test_data = pd.read_csv(DATASET_DIR + "test.csv")
submit = pd.read_csv(DATASET_DIR + "gender_submission.csv")
```
(11) 推論とsubmitファイルの作成
```python
probabilities = automl.predict(test_data).data[:,0]
predictions = (probabilities > 0.5).astype(int)
submit['Survived'] = predictions
submit.to_csv(DATASET_DIR + "submit.csv", index=None)
```

提出結果は　Score: 0.76076

残念ながらサンプルファイル(Score: 0.76555)以下😥
TitanicのようなきちんとEDAと前処理をしないといけないようなデータに対してはまだまだAutoMLでは力不足でした。
モデルに頼りきらず、データをよく見て自分の頭で考え適切な特徴量の選定やエンジニアリングを行うことが必要です。