Slide 1

Slide 1 text

はじめに Kaggle 問題にチームで取り組み奮闘記 Pycaret でかんたん AutoML 1

Slide 2

Slide 2 text

自己紹介 須藤明洋 すとうあきひろ 1984 年生まれ Power BI (2021 年 5 月~) Python (2021 年 9 月~) Rugby (1993 年~) Kendama (2020 年~) Qiita https://qiita.com/hanaseleb 2

Slide 3

Slide 3 text

Pycaret https://techninjahere. medium.com/best- opensource-automl- frameworks- 4e40820e2d79 3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

Pycaret とは PyCaretは、機械学習のワークフローを自動化する Python 製のオープンソー ス、ローコード機械学習ライブラリです。 エンドツーエンドの機械学習およびモデル管理ツールであり、実験サイクル を指数関数的に高速化し、生産性を高めます。 他のオープンソース機械学習ライブラリと比較して、PyCaretは数百行のコ ードを数行だけで置き換えることができる、代替のローコード・ライブラリ です。これにより、実験が飛躍的に速く、効率的になります。 PyCaret は基本的に、いくつかの機械学習ライブラリやフレー ムワークの Python ラッパーです。 5

Slide 6

Slide 6 text

機械学習ライブラリ scikit-learn 勾配ブースティング × 決定木 XGBoost LightGBM CatBoost 6

Slide 7

Slide 7 text

自然言語処理 spaCy ハイパーパラメーター 最適化フレームワーク Optuna Hyperopt 分散実行フレームワーク Ray 7

Slide 8

Slide 8 text

分析開始 PyCaret の Regression モジュールは、25 以上のすぐに使えるアルゴ リズムと、学習したモデルの性能を分析するためのいくつかのプロッ トが用意されています。 8

Slide 9

Slide 9 text

前処理は省略します 9

Slide 10

Slide 10 text

データセットの分割 今回のコンクールでは、目的変数が3つあるため、3つの DataSet を作 成します train_3 = train2.drop(columns = ['target_carbon_monoxide', 'target_benzene', 'target_nitrogen_oxides']) test_3 = test2.drop(columns = ['target_carbon_monoxide', 'target_benzene', 'target_nitrogen_oxides']) train_co = train2.drop(columns = ['target_benzene', 'target_nitrogen_oxides']) train_be = train2.drop(columns = ['target_carbon_monoxide', 'target_nitrogen_oxides']) train_no = train2.drop(columns = ['target_carbon_monoxide', 'target_benzene']) 10

Slide 11

Slide 11 text

Pycaret インストールとライブラリのインポート KaggleカーネルやGoogleColabにはプリインストールされていないの で、 pip install をおこないます。 !pip install pycaret from pycaret.regression import * 11

Slide 12

Slide 12 text

Pycaret Quick Start 回帰問題における Pycaret の最小の流れは、 1. setup() 2. create_model() 3. predict_model() の流れです。インスタンスを作成したあと、モデルも決め打ちで、ビ ジュアライズもとくになしで OK であれば、この 3 つの関数に最低限 の引数およびデータを入れてあげればすぐに機械学習を実行すること が可能です 12

Slide 13

Slide 13 text

このコードを実行するだけで、予測値が出力されます。 # Pycaretの最初単位 # !pip install pycaret from pycaret.datasets import get_data from pycaret.regression import * data = get_data('insurance') # テストデータの取得 s = setup(data, target = 'charges') # インスタンスの作成 lr = create_model('lr') # モデルの作成 predictions = predict_model(lr, data=data) # 実行 13

Slide 14

Slide 14 text

14

Slide 15

Slide 15 text

scikit-learn での実装例 データセットの分割 特徴量の取捨 グラフの作成 などで多くのコードが必要 15

Slide 16

Slide 16 text

Pycaretでモデルを作成 Kaggleに戻ります。関数は下記を使用します。 1. setup() 2. compare_models() 3. blend_models() 4. tune_model() 5. plot_model() 6. evaluate_model() 7. predict_model() 8. finalize_model() 16

Slide 17

Slide 17 text

setup() この関数は学習環境を初期化し、変換 パイプラインを作成します。Setup 関 数は他の関数を実行する前に呼び出す 必要があります。この関数は、data と target という 2 つの必須パラメーター を受け取ります。その他のパラメータ ーは任意です。 17

Slide 18

Slide 18 text

18

Slide 19

Slide 19 text

setup() exp = setup(data=train_co, target='target_carbon_monoxide') 上記コードを実行するとデータ・タイプの一覧が出力され、Enter を 押すと処理が続行、Quitをテキスト入力すると処理が中止されます。 19

Slide 20

Slide 20 text

20

Slide 21

Slide 21 text

処理が終わるとデータ セットの情報を出して くれる。 21

Slide 22

Slide 22 text

compare_models() 回帰用にモデル 20 個以上が使えるようになっている。 それぞれのモデルで交差検証をして評価指数順に並び替えて表示。 top3 = compare_models(sort='RMSLE', n_select=3, fold = 3) 22

Slide 23

Slide 23 text

23

Slide 24

Slide 24 text

blend_models() estimator_list パラメーターで渡されたモデルに対して、Voting Regressor を学習します。 blended = blend_models(estimator_list= top3, fold=3, optimize='RMSLE') 24

Slide 25

Slide 25 text

25

Slide 26

Slide 26 text

26

Slide 27

Slide 27 text

27

Slide 28

Slide 28 text

tune_model() tuned_blended = tune_model(blended) 28

Slide 29

Slide 29 text

29

Slide 30

Slide 30 text

plot_model() モデルの性能をビジュアライズをして 解析できます。 30

Slide 31

Slide 31 text

31

Slide 32

Slide 32 text

32

Slide 33

Slide 33 text

33

Slide 34

Slide 34 text

34

Slide 35

Slide 35 text

evaluate_model() 学習済みモデルの性能を分析するためのユーザインタフェースを表示 します。内部で plot_model 関数を呼び出しています。 evaluate_model(tuned_blended) 35

Slide 36

Slide 36 text

36

Slide 37

Slide 37 text

37

Slide 38

Slide 38 text

finalize_model() データセット全体に対して学習させます。 final_model = finalize_model(tuned_blended) 38

Slide 39

Slide 39 text

predict_model() 学習されたモデルを用いて Label 列に予測を入れる。 pred_esb = predict_model(tuned_blended) 39

Slide 40

Slide 40 text

predict_model() pred_esb = predict_model(tuned_blended) 40

Slide 41

Slide 41 text

submit サブミット用データの作成をします。 対数を元の数値に変換するため、 np.exp 関数を使用。 sub = pd.read_csv('../input/tabular-playground-series-jul-2021/sample_submission.csv') sub['target_carbon_monoxide'] = np.exp(pred_esb['Label'])-1 41

Slide 42

Slide 42 text

42

Slide 43

Slide 43 text

AutoMLの関数化 def pycaret_model(train, target, test, n_select, fold, opt, exclude): print('Setup Your Data....') setup(data=train, target=target, silent= True) print('Comparing Models....') top3 = compare_models(sort=opt, n_select=n_select, fold = fold, exclude = exclude) print('Blending Models....') blended = blend_models(estimator_list= top3, fold=fold) print('Tuning Models....') tuned_blended = tune_model(blended) print('Finallizing Models....') final_model = finalize_model(tuned_blended) print('Done...!!!') pred_esb = predict_model(final_model, test) re = pred_esb['Label'] 43

Slide 44

Slide 44 text

'target_benzene' と 'target_nitrogen_oxides' の予測 sub['target_benzene'] = np.exp( pycaret_model( train_be, 'target_benzene', test_3, 3, 10, 'RMSLE', ['knn', 'xgboost']) )-1 sub['target_nitrogen_oxides'] = np.exp( pycaret_model( train_no, 'target_nitrogen_oxides', test_3, 3, 10, 'RMSLE', ['xgboost']) ) - 1 44

Slide 45

Slide 45 text

仕上げ ① leak_sub = pd.read_excel( '../input/air-quality-time-series-data-uci/AirQualityUCI.xlsx' ) [7110:].reset_index( drop = True ) 45

Slide 46

Slide 46 text

仕上げ ② co_out = leak_sub[leak_sub['CO(GT)'] == -200].index be_out = leak_sub[leak_sub['C6H6(GT)'] == -200].index ni_out = leak_sub[leak_sub['NOx(GT)'] == -200].index leak_sub.loc[co_out, 'CO(GT)'] = sub.loc[co_out, 'target_carbon_monoxide'] leak_sub.loc[be_out, 'C6H6(GT)'] = sub.loc[be_out, 'target_benzene'] leak_sub.loc[ni_out, 'NOx(GT)'] = sub.loc[ni_out, 'target_nitrogen_oxides'] sub['target_carbon_monoxide'] = leak_sub['CO(GT)'] sub['target_benzene'] = leak_sub['C6H6(GT)'] sub['target_nitrogen_oxides'] = leak_sub['NOx(GT)'] 46

Slide 47

Slide 47 text

submit 用の csv を作成 sub.to_csv('sub.csv', index = 0) 47

Slide 48

Slide 48 text

試行錯誤の開始 48

Slide 49

Slide 49 text

setup() 引数追加 exp = setup(data=train_co, target='target_carbon_monoxide', normalize = True, # 数値列を標準化 numeric_imputation = 'mean', # 欠損値の穴埋め silent= True) # データ型の確認なし 49

Slide 50

Slide 50 text

blend_models() 引数追加 blended = blend_models( estimator_list= best, fold=10, # 交差検証の回数 optimize='RMSLE', # 評価指数 choose_better = True # 結果がよくなるときのみブレンドされたモデルを返す ) 50

Slide 51

Slide 51 text

51

Slide 52

Slide 52 text

サーチライブラリの変更 ハイパーパラメーターのチューニングに optuna を使用。 デフォルトは scikit-learn # !pip install optuna tuned_blended = tune_model( blended, optimize='RMSLE', search_library="optuna", # optuna の使用 choose_better = True, n_iter=30 ) 52

Slide 53

Slide 53 text

tune_model()の使用順を変更 53

Slide 54

Slide 54 text

SCORE 54

Slide 55

Slide 55 text

まとめ Pycaretは導入から実行まで簡単便利。 ドキュメントを読み、 各関数の使用順 引数でできること を確認すると機械学習の勉強の整理に役立つ。 55

Slide 56

Slide 56 text

appendix 56

Slide 57

Slide 57 text

57

Slide 58

Slide 58 text

58

Slide 59

Slide 59 text

59

Slide 60

Slide 60 text

60

Slide 61

Slide 61 text

ご清聴ありがとうございました。 61