Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

機械学習未経験者も良いモデルを作れるAutoGluonで「テーブルデータの解析」をやってみた

こんにちは。
@tereka114です。

最近はCA x atma杯に参加するなどバタバタしておりましたが、少しずつ落ち着いてきました。
今回、AutoGluonと呼ばれるツールを使ってテーブルデータに挑戦してみました。

AutoGluonについて

AutoGluonは簡単に拡張、利用ができる自動機械学習のライブラリです。
前処理、ハイパーパラメータのチューニング、モデル選定、或いはアンサンブルといった機械学習モデリングを自動化できます。
これにより、機械学習に詳しくない人も簡単に精度が高いモデルの作成ができます。

autogluon.mxnet.io

AutoGluonはテーブルデータの分類・回帰、画像分類、文書分類、物体検出、そして、ニューラルネットワークアーキテクチャの自動構成を行うNAS(=Neural Architecture Search)に対応しています。
今回は、テーブルデータの分類を行うモデルを自動構築し、最適なモデルを提供します。

画像分類やテキスト分類と比較してテーブルデータの分類・回帰の自動化は難しいです。
テーブルデータは列に様々な情報が含まれるため、入力データごとに別々の特徴量変換手法を試す必要があります。
たとえば、温度や湿度のように数値で表現できるものは加工しなくとも数値のまま扱えます。
しかし、文字列であれば、その文字を数字に変換するなど工夫が必要になります。

これらの方法を知らなくても、AutoGluonが自動でその工夫を行ってくれるため、実装者はデータに対して何も加工することなく、機械学習モデルの作成ができます。

AutoGluonでテーブルデータの解析に挑戦する

今回、テーブルデータのサンプルには、機械学習チュートリアルで頻繁に利用されるTitanicのデータを利用します。
このデータセットを事前にKaggleのサイトに登録し、入手してください。

www.kaggle.com

1. データを読み込む

はじめに、学習用のデータを準備して、AutoGluonで利用できる形式にします。
autogluon.TabularPrediction.Datasetクラスを利用します。そのクラスの引数にファイルパスを入力し、インスタンスを初期化します。

import autogluon as ag
from autogluon import TabularPrediction as task

train_data = task.Dataset(file_path='train.csv')
2. 学習を行う

次に学習を行います。学習の実装は次の通りです。
autogluon.TabularPrediction.fitにより、あとは何も考えず、よしなに実行されます。

output_directory = "./outputs"
label_column = "Survived"
predictor = task.fit(train_data=train_data, label=label_column, output_directory=output_directory)

学習データとラベルと結果出力先のディレクトリを指定します。
それぞれ、デフォルトで決まっているモデルを利用し、構築します。
ディレクトリには、学習された結果のモデルが出力されています。

学習を開始するとログが次の通り、出力されます。
解析するデータセットの情報や使っている機械学習アルゴリズムとその評価結果、そして学習時間が出力されます。
単体のモデルだと、LightGBMの精度が最も高く、複数の機械学習アルゴリズムのアンサンブルでより精度が向上していることがわかります。

Loaded data from: train.csv | Columns = 12 / 12 | Rows = 891 -> 891
Warning: Specified num_trials == 1 or time_limits is too small for hyperparameter_tune, setting to False.
Beginning AutoGluon training ... Time limit = 10s
Preprocessing data ...
Here are the first 10 unique label values in your data:  [0 1]
AutoGluon infers your prediction problem is: binary  (because only two unique label-values observed)
If this is wrong, please specify `problem_type` argument in fit() instead (You may specify problem_type as one of: ['binary', 'multiclass', 'regression'])

Selected class <--> label mapping:  class 1 = True, class 0 = False
        Data preprocessing and feature engineering runtime = 0.33s ...
AutoGluon will gauge predictive performance using evaluation metric: accuracy
To change this, specify the eval_metric argument of fit()
Fitting model: RandomForestClassifierGini ... Training model for up to 9.67s of the 9.67s of remaining time.
        0.29s    = Training runtime
        0.8212   = Validation accuracy score
Fitting model: RandomForestClassifierEntr ... Training model for up to 9.19s of the 9.19s of remaining time.
        0.28s    = Training runtime
        0.8156   = Validation accuracy score
Fitting model: ExtraTreesClassifierGini ... Training model for up to 8.64s of the 8.64s of remaining time.
        0.27s    = Training runtime
        0.7933   = Validation accuracy score
Fitting model: ExtraTreesClassifierEntr ... Training model for up to 8.06s of the 8.06s of remaining time.
        0.27s    = Training runtime
        0.7821   = Validation accuracy score
Fitting model: KNeighborsClassifierUnif ... Training model for up to 7.61s of the 7.61s of remaining time.
        0.03s    = Training runtime
        0.6089   = Validation accuracy score
Fitting model: KNeighborsClassifierDist ... Training model for up to 7.48s of the 7.48s of remaining time.
        0.01s    = Training runtime
        0.6145   = Validation accuracy score
Fitting model: LightGBMClassifier ... Training model for up to 7.36s of the 7.36s of remaining time.
        0.28s    = Training runtime
        0.8268   = Validation accuracy score
Fitting model: CatboostClassifier ... Training model for up to 7.06s of the 7.06s of remaining time.
        0.66s    = Training runtime
        0.8156   = Validation accuracy score
Fitting model: NeuralNetClassifier ... Training model for up to 6.39s of the 6.39s of remaining time.
        3.54s    = Training runtime
        0.7933   = Validation accuracy score
Fitting model: LightGBMClassifierCustom ... Training model for up to 2.59s of the 2.59s of remaining time.
        0.4s     = Training runtime
        0.8268   = Validation accuracy score
Fitting model: weighted_ensemble_l1 ...
        0.36s    = Training runtime
        0.8492   = Validation accuracy score
AutoGluon training complete, total runtime = 9.52s ..

また、各モデルのハイパーパラメータをチューニングする場合には、hyperparameter_tuneの引数にTrueを与えます。
例えば、次のように設定できます。

predictor = task.fit(train_data=train_data, label=label_column, output_directory=output_directory, hyperparameter_tune=True, num_trials=10, time_limits=10)
3. 推論を行う

推論もごくわずかな実装で可能です。
学習した結果の機械学習モデルを利用して推論します。

test_data = task.Dataset(file_path='test.csv')
y_pred = predictor.predict(test_data)

使ってみての感想

良かったところ

機械学習そのものを知らない人でも簡単に記述できる

今回実施した通り、非常にシンプルに実装を書けます。
更には特に人間が設定しなくてはならないハイパーパラメータの設定を行っていません。
それぞれのモデルの知見が少なくともそれなりのスコアを出せることが良い点です。

ハイパーパラメータのチューニングも可能

fit関数は標準の引数だと、実行モデルの標準パラメータを網羅するのみとなっており、ハイパーパラメータの調整までは行いません。
しかし、ハイパーパラメータのチューニングの有無を指定でき、時間をかければ、より高い精度を出せます。
ハイパーパラメータの試行回数も設定ができるので、巨大なデータの場合は少ない回数を指定できるなど、設定の工夫が可能です。

制限時間がついている

一度の検証の制限時間を引数として与えられます。
そのため、偶然にも極端に長い検証時間がかかるハイパーパラメータを引き当ててしまった場合、通常だと終わるまで待つか、実行そのものをキャンセルするかになります。
この設定により、時間で打ち切り、すぐに次の試行に移れます。

ここがあるとより嬉しい

ドキュメントや例の整備

例題は非常にシンプルで使いやすいと思っていますが、カスタマイズする際にどうすればよいのかがあまり書かれていないと感じました。
ここに書いてあるかなーとメソッドのリファレンスを参照し、実行することで理解ができました。
機械学習をメインに取り組んでいる人であれば、直感と閃きで発見することが可能でしたが、なれていない人では難しいと思います。

最後に

AutoGluonですが、想像よりも柔軟に様々なパラメータを設定できてよいツールだと感じています。
ちょっとした実験や分析には十分利用できるライブラリだと思っています。
では、またお会いしましょう!

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Masterと働きたい尖ったエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの求人 - Wantedlywww.wantedly.com