🤖

【20日目】AutoGluonでAutoMLをやってみる【2021アドベントカレンダー】

2021/12/20に公開

2021年1人アドベントカレンダー(機械学習)、20日目の記事になります。

https://qiita.com/advent-calendar/2021/solo_advent_calendar

テーマは AutoML になります。

AWS製の AutoGluon を扱います。

https://pages.awscloud.com/rs/112-TZM-766/images/1.AWS_AutoML_AutoGluon.pdf

https://auto.gluon.ai/stable/index.html

https://auto.gluon.ai/stable/api/autogluon.task.html#module-0

今回はテーブルデータを扱いますが、テーブルデータだけでなく、テキストや画像にも使えるようです。

Colab のコードはこちら Open In Colab

前処理

目的変数にNull値があっても学習・予測できるが、評価時にエラーが出るのでNull値を補完します

df["Global_Sales"] = df["Global_Sales"].fillna(df["Global_Sales"].mean())
train, test = train_test_split(
                            df.drop(["NA_Sales", "PAL_Sales", "JP_Sales", "Other_Sales"], axis=1), 
                            test_size=0.3,
                            shuffle=True, 
                            random_state=SEED
                        )

AutoGluon で学習・推論

gkf = GroupKFold(n_splits=5)

groups = train["Genre"]

cv_result_gln_eval = []

for i, (train_index, test_index) in enumerate(gkf.split(train, train, groups)):
    train_gkf, test_gkf = train.iloc[train_index], train.iloc[test_index]
    
    print(f"Fold {i}")

    model = TabularPredictor(
                    label = "Global_Sales",                  # 目的変数
                    problem_type = "regression",             # 回帰を指定
                    eval_metric = "root_mean_squared_error", # 評価指標
                    verbosity = 0,                           # ログの非表示
                )

    # 学習
    model.fit(
            train_data=train_gkf,
            ag_args_fit={'num_gpus': 1}, # GPUの使用
            time_limit = 30,             # 学習時間の上限
            )

    # 予測
    y_pred = model.predict(test_gkf.drop(["Global_Sales"], axis=1))

    # AutoGluon の解釈性機能
    print("特徴量の重要度")
    feature_importance_df = model.feature_importance(
                                test_gkf,
                                silent = True
                            )

    display(feature_importance_df)
    
    # 特徴量の重要度をグラフ表示
    plt.figure(figsize=(12, 8))
    plt.title(f"Fold {i} 特徴量の重要度")
    plt.xlabel("重要度")
    plt.ylabel("特徴量")

    plt.barh(
        feature_importance_df.index,
        feature_importance_df["importance"],
        )
    plt.show()
    print()

    # AutoGluon の機能
    print("リーダーボード")
    display(
        model.leaderboard(
            test_gkf,
            silent = True
        )
    )
    print()

    # AutoGluon の評価機能
    score = model.evaluate_predictions(y_true=test_gkf["Global_Sales"], y_pred=y_pred)

    rmse_gln_eval = score['root_mean_squared_error']

    cv_result_gln_eval.append(rmse_gln_eval)

print("RMSE:", round(np.mean(cv_result_skl_eval), 3))

出力:
RMSE: 0.135

20日目は以上になります、最後までお読みいただきありがとうございました。

参考サイト

https://qiita.com/ysit/items/a601cb59523cc1961556

Discussion