Microsoft社製AutoMLツールFLAMLが便利すぎた！

## はじめに
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407956/3d92d522-2232-d65b-ff28-470b6595ab38.png)

本記事ではMicrosoft社製のAutoMLツールであるFLAMLについて数ヶ月使用してみたので、使用感や私が考える効果的な使い方などと共にご紹介したいと思います。

AutoMLツールはいろいろ出てきていますが、その中でもFLAMLは使いやすく拡張性の高い印象です。特にAzureを使っている場合はメリットも大きいでしょう。

日本語の記事が少ないようなので、本記事がFLAMLを使う上で参考になれば幸いです。

## FLAMLとは

最初に紹介した通り、FLAMLはMicrosoft社製のAutoMLツールです。

https://microsoft.github.io/FLAML/

AutoMLと一言で言ってもいろいろありますが、FLAMLはxgboostやlightgbmなど複数の機械学習アルゴリズムの中から最適なモデルとそのモデルの最適なパラメータを自動でチューニングしてくれる機能を提供します。また、NASのように大量の計算リソースを必要とするわけではなく、非常に高速かつ軽量なのが特徴です。

pipで簡単にインストールできます。

```bash
pip install flaml
```

使い方はとても簡単でsklearnライクなインターフェースで使用可能です。

```python
from flaml import AutoML
automl = AutoML()
automl.fit(X_train, y_train, task="regression", time_budget=60, **other_settings)
pred = automl.predict(X_test)
```

### タスク

FLAMLで解くことのできるタスクは以下の通りです。
- [クラス分類](https://microsoft.github.io/FLAML/docs/Examples/AutoML-Classification)
- [回帰](https://microsoft.github.io/FLAML/docs/Examples/AutoML-Regression)
- [時系列予測](https://microsoft.github.io/FLAML/docs/Examples/AutoML-Time%20series%20forecast)
- [ランキング](https://microsoft.github.io/FLAML/docs/Examples/AutoML-Rank)
- [自然言語問題](https://microsoft.github.io/FLAML/docs/Examples/AutoML-NLP)


その他、なんと[Pytorchで実装したDeep Learningモデル](https://microsoft.github.io/FLAML/docs/Examples/Tune-PyTorch)、[HuggingFace](https://microsoft.github.io/FLAML/docs/Examples/Tune-HuggingFace)モデルのパラメータチューニングもサポートしています。ちなみにDeep Learning系では探索空間を以下のように定義してその中で最適化を行います。

```python
config = {
    "l1": tune.randint(2, 9),   # log transformed with base 2
    "l2": tune.randint(2, 9),   # log transformed with base 2
    "lr": tune.loguniform(1e-4, 1e-1),
    "num_epochs": tune.loguniform(1, max_num_epoch),
    "batch_size": tune.randint(1, 5)    # log transformed with base 2
}
```

### モデル

FLAMLで組み込みで使用できるモデルは以下の通りです。

- LGBM(クラス分類、回帰、時系列分類)
- XGBoost（クラス分類、回帰、ランキング、時系列回帰、時系列分類）
- RandomForest（クラス分類、回帰、時系列回帰、時系列分類）
- ExtraTree（クラス分類、回帰、時系列回帰、時系列分類）
- LRL1Classifier/LRL2Classifier（クラス分類）
- CatBoost（クラス分類、回帰）
- KNeighbors(クラス分類、回帰）
- Prophet(時系列回帰）
- ARIMA/SARIMAX(時系列回帰）
- Transformer（テキスト分類、テキスト回帰、マルチラベル分類、トークン分類、文書要約）

利用できるモデルの種類の多さはAutoMLツールの中でも随一かと思います。

その他、`flaml.model.BaseEstimator`を継承することで自分のカスタムモデルを作成したり、探索空間を自身で定義することで拡張することもできます。

また、パラメータに"ensemble"を指定することでアンサンブルモデルも利用できます。

```python
automl.fit(
    X_train, y_train, task="classification",
    "ensemble": {
        "final_estimator": LogisticRegression(),
        "passthrough": False,
    },
)
```

モデルに関してはこちらにまとまった情報が提供されているのでご参考下さい。

https://microsoft.github.io/FLAML/docs/Use-Cases/Task-Oriented-AutoML#customize-automlfit


### 手が痒いところに行き届いてる系な機能

#### Data split method
学習と検証用のデータの分け方も指定できます。

https://microsoft.github.io/FLAML/docs/Use-Cases/Task-Oriented-AutoML#data-split-method

### Parallel tuning

`ray`を使って簡単い並列処理可能です。

https://microsoft.github.io/FLAML/docs/Use-Cases/Task-Oriented-AutoML#parallel-tuning


### MLflow

`start_run()`するだけで`mlflow`を使って実験管理もできます。

```python
mlflow.set_experiment("flaml")
with mlflow.start_run() as run:
    automl.fit(X_train=X_train, y_train=y_train, **settings)
```
こんな感じで実行された全てのモデルがmlflow上の記録されるので簡単にモデルの性能を比較できます。

![161516546-1833141f-99ed-47a0-907a-05047ee7622b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407956/abbc0003-f713-d444-107c-d21b366ac38a.png)

https://microsoft.github.io/FLAML/docs/Use-Cases/Task-Oriented-AutoML#parallel-tuning

### 独自の評価関数関数を定義できる

https://microsoft.github.io/FLAML/docs/Use-Cases/Tune-User-Defined-Function


## 筆者なりの効果的な利用方法

### ベースライン
FLAMLは非常に軽量でmacbookでも問題なく動きます。よって、手軽に実行できるため、機械学習のタスクを解くときのベースラインとして利用しています。
具体的には、「どのようなモデルが今回のタスクに向いているのか」や「どの程度の精度が期待できそうか」を検証するのに使用しています。

### データセントリックAI的なアプローチ

データセントリックAI的にモデルの選択には一切タッチせずに、特徴量エンジニアリングのみを行い各特徴量でのFLAMLのベストモデルの精度比較します。タスクにとって有用な特徴量を判断するのに重宝します。

## 実際のところ、精度はどうなの？

タスクにもよりますが、特徴量が良い場合はKaggleなどで上位の方のスコアに近づくこともあります。肌感としてはAutoMLで出せる精度としては十分なように感じます。

もちろん、人間がチューニングした方が最終的には良いモデルができるかもしれませんが、「MLの専門知識がなくてもそこそこ良いモデルが作れる」、「高速に実験を回すことで時間を大幅に節約できる」ことから、スタートアップなどでは特に利用する価値があるのではないでしょうか。

## 終わりに
チップスとして、ここで紹介した内容以外には、筆者の経験上、カスタムモデルを使うことでかなり効果的に最適化を行えます。
FLAML、非常に簡単に使えるので是非使ってみてください。