• トップ
  • ブログ一覧
  • 機械学習の自動化を可能にする「PyCaret」の実力を把握してみる
  • 機械学習の自動化を可能にする「PyCaret」の実力を把握してみる

    広告メディア事業部広告メディア事業部
    2020.07.10

    IT技術

    機械学習パッケージ「PyCaret」とは?

    「Pycaret」とは、様々な種類の機械学習を数行で実現してくれるライブラリです。

    2020年4月7日に PyCaret ver.1.0.0 がリリースされると、その内容から世界中に衝撃が走りました。

    公式サイトでは、以下のように説明されています。

    PyCaret は Python の低コード機械学習ライブラリであり、仮説から考察までの時間短縮を目的としています。

    これにより、データサイエンティストとアナリストは反復的な機械学習を効率的に実行することができ、コード実装に費やす時間が大幅に短縮されるため、結論に素早く到達できます。

    【PyCaret公式サイト】
    https://pypi.org/project/pycaret/1.0.0/

    ワンクリックだけで、元データの分析から複数の学習結果を出力できるのです!

    PyCaret のメリット

    PyCaret には下記のようなメリットがあります。

    1. コード実装が非常に簡単(数行で実装可能)
    2. 使い方が簡単
    3. ハイパーパラメータの自動最適化が可能
    4. 多面的な分析結果を図で確認できる
    5. データの前処理も自動で実施する

    Pycaret の実装

    それでは早速、PyCaret の実装を行っていきましょう。

    実装の流れは、下記のようになります。

    1. データの読み込み
    2. データの前処理
    3. 学習モデルによる精度の比較
    4. ハイパーパラメータの最適化
    5. モデルの可視化

    データの読み込み

    まずは、pycaret のパッケージをインストールします。

    1pip install pycaret

    必要なパッケージの読み込み

    次に、必要なパッケージを読み込みます。

    1# パッケージの読み込み
    2import pandas as pd
    3from pycaret.regression import *

    今回は、回帰を行うのでpycaret.regression としました。

    分類を行う場合は、pycaret.classification としてください。

    ご覧のように、必要なパッケージは非常に少ないです。

    データの読み込み

    次に、データを読み込みます。

    1# 使用するデータの読み込み 
    2from pycaret.datasets import get_data 
    3boston_data = get_data('boston')

    手持ちのデータだけでなく、PyCaret に用意されているデータ( PyCaret’s Data Repository )も使えます。

    気になる方は、下記のリンクを参照してみてください。

    【PyCaret’s Data Repository】
    https://pycaret.org/get-data/

    PyCaret’s Data Repository では、約50種類のデータセットが提供されています。

    また、scikit-learn のデータセットも7種類あるので、とても充実しています。

    今回は、定番の「Boston 地価データ」を使用します。

    データの前処理

    次に、PyCaret を起動します。

    1. 第一引数:解析に用いる data(読み込んだデータ)
    2. 第二引数:予測に用いる目的変数の名称
    3. 第三引数:分析から外す説明変数の名称
    1# PyCaretを起動
    2exp1 = setup(boston_data, target = 'medv', ignore_features = None)

    起動すると、投入したデータに対するデータ型の予測結果が表示されます。

    PyCaret の予測が必ずしも正しいとは限らないので、自身でも確認してください。

    問題がなければ、下の白枠にカーソルを移動し、「Enter」を押してください。

    すると、「正常に SetUp が完了しました」というメッセージが出てきます。

    上の画像が、SetUP 完了後の画面です。

    データを様々な角度から捉えた結果を示しています。

    データによっては算出できない項目もあるため、その場合は「False」や「None」と表示されます。

    回帰モデルの自動構築

    コードは、下記のたった1行です。

    1# モデルの構築
    2compare_models()

    モデルの構築結果

    下の画像が、モデルの構築結果です。

    「Gradient Boosting」、「RandomForest」の決定木系や「Lasso」、「Ridge」など、主要な分析モデルが多く含まれています。

    同時に分析した結果を並べ、精度が高い順に並べてくれます。

    これが1行で出てくるとは衝撃ですね、普通に実装したらどれだけ時間がかかることか…。

    ただし、こちらの分析では、ハイパーパラメータの最適化までは行われていません。(この後、個別で最適化を進める手順を説明します。)

    初期条件

    では、初期条件はどうなっているのでしょうか。

    訓練データ:評価データ = 7:3 で分割し、実施しています。

    初期条件は、交差検証「10回」です。

    下記のコードにあるAbbreviated Stringのモデル略称名は、今後必要になりますので、覚えておいてください。

    1Signature:
    2create_model(
    3    estimator=None,
    4    ensemble=False,
    5    method=None,
    6    fold=10,
    7    round=4,
    8    verbose=True,
    9)
    10Docstring:
    11 
    12Description:
    13------------
    14This function creates a model and scores it using Kfold Cross Validation. 
    15(default = 10 Fold). The output prints a score grid that shows MAE, MSE, 
    16RMSE, RMSLE, R2 and MAPE.
    17
    18This function returns a trained model object. 
    19
    20setup() function must be called before using create_model()
    21
    22    Example
    23    -------
    24    from pycaret.datasets import get_data
    25    boston = get_data('boston')
    26    experiment_name = setup(data = boston,  target = 'medv')
    27    
    28    lr = create_model('lr')
    29
    30    This will create a trained Linear Regression model.
    31
    32Parameters
    33----------
    34estimator : string, default = None
    35
    36Enter abbreviated string of the estimator class. List of estimators supported:
    37
    38Estimator                     Abbreviated String     Original Implementation 
    39---------                     ------------------     -----------------------
    40Linear Regression             'lr'                   linear_model.LinearRegression
    41Lasso Regression              'lasso'                linear_model.Lasso
    42Ridge Regression              'ridge'                linear_model.Ridge
    43Elastic Net                   'en'                   linear_model.ElasticNet
    44Least Angle Regression        'lar'                  linear_model.Lars
    45Lasso Least Angle Regression  'llar'                 linear_model.LassoLars
    46Orthogonal Matching Pursuit   'omp'                  linear_model.OMP
    47Bayesian Ridge                'br'                   linear_model.BayesianRidge
    48Automatic Relevance Determ.   'ard'                  linear_model.ARDRegression
    49Passive Aggressive Regressor  'par'                  linear_model.PAR
    50Random Sample Consensus       'ransac'               linear_model.RANSACRegressor
    51TheilSen Regressor            'tr'                   linear_model.TheilSenRegressor
    52Huber Regressor               'huber'                linear_model.HuberRegressor 
    53Kernel Ridge                  'kr'                   kernel_ridge.KernelRidge
    54Support Vector Machine        'svm'                  svm.SVR
    55K Neighbors Regressor         'knn'                  neighbors.KNeighborsRegressor 
    56Decision Tree                 'dt'                   tree.DecisionTreeRegressor
    57Random Forest                 'rf'                   ensemble.RandomForestRegressor
    58Extra Trees Regressor         'et'                   ensemble.ExtraTreesRegressor
    59AdaBoost Regressor            'ada'                  ensemble.AdaBoostRegressor
    60Gradient Boosting             'gbr'                  ensemble.GradientBoostingRegressor 
    61Multi Level Perceptron        'mlp'                  neural_network.MLPRegressor
    62Extreme Gradient Boosting     'xgboost'              xgboost.readthedocs.io
    63Light Gradient Boosting       'lightgbm'             github.com/microsoft/LightGBM
    64CatBoost Regressor            'catboost'             https://catboost.ai
    65
    66ensemble: Boolean, default = False
    67True would result in an ensemble of estimator using the method parameter defined. 
    68
    69method: String, 'Bagging' or 'Boosting', default = None.
    70method must be defined when ensemble is set to True. Default method is set to None. 
    71
    72fold: integer, default = 10
    73Number of folds to be used in Kfold CV. Must be at least 2. 
    74
    75round: integer, default = 4
    76Number of decimal places the metrics in the score grid will be rounded to. 
    77
    78verbose: Boolean, default = True
    79Score grid is not printed when verbose is set to False.
    80
    81Returns:
    82--------
    83
    84score grid:   A table containing the scores of the model across the kfolds. 
    85-----------   Scoring metrics used are MAE, MSE, RMSE, RMSLE, R2 and MAPE. 
    86              Mean and standard deviation of the scores across the folds are 
    87              also returned.
    88
    89model:        trained model object
    90-----------
    91
    92Warnings:
    93---------
    94None
    95  
    96File:      c:\anaconda3\lib\site-packages\pycaret\regression.py
    97Type:      function

    学習モデルによる精度の比較

    今回は、決定木の王道「Random Forest」のモデルを確認してみます。

    先ほどのモデルの構築結果から、モデルを選択します。

    モデルの名称は、上記コードのAbbreviated String を用いる必要がありますので、注意してください。

    1# Random Forestのモデルを確認
    2rf = create_model('rf')

    確認

    初期設定である交差検証「10回」にて、検証が行われています。

    Mea(平均値)、SD(標準偏差)も、同時に表示されています。

    ハイパーパラメータの最適化

    次に、ハイパーパラメータの最適化を行います。

    1. 第一引数:モデルの名称
    2. 第二引数:ランダムグリッドサーチの回数
    3. 第三引数:最適化の対象

    これも、コードは下記の1行のみです。

    1# Random Forestのモデルを最適化
    2tuned_rf = tune_model('rf', n_iter = 500, optimize = 'r2')

    確認

    最適化前後を比較してみましょう。

    R2 が 0.8549 → 「0.8901」 と増加しており、しっかり最適化が行われています。

    PyCaret の最適化はランダムグリッドサーチが採用されていますが、現在の主流はベイズ最適化やステップワイズ法です。

    ランダムグリッドサーチは、いわば「数打ちゃ当たる」の手法なので、必ずしも最適とは限らないのです。

    ベイズ最適化やステップワイズ法と比較すると、やや時代遅れではありますが、便利であることに変わりはありません。

    解析結果の可視化

    解析結果を確認します。

    1# 解析結果の確認
    2evaluate_model(tuned_rf)

    確認

    「Plot Type」を選択することで、様々な視点から結果を確認することができます。

    今回は、「Random Forest」を用いましたが、学習手法を変えると、Plot Type の項目も変わります。

    Hyperparameters

    こちらは、ハイパーパラメータを確認できる項目です。

    最適化後のハイパーパラメータの値を確認することができます。

    Residuals Plot

    残差分析の結果を確認できる項目です。

    残差のバラつきを確認することで、外れ値を視覚的に確認することができます。

    外れ値が生じるケースは、以下の通りです。

    1. 回帰式が適切ではない
    2. データが不適切
    3. 学習不足

    右側にはヒストグラムも表示されているため、非常に分かりやすくなっています。

    Prediction Error Plot

    予測精度を確認できる項目です。

    identity に対するズレ(予測値と実測値の誤差)から R2 が計算されています。

    best fit の傾きが identity よりも小さくなっていることなど、作成した回帰モデルの特徴が見えてきます。

    Cooks Distance Plot

    クックの距離を確認できる項目です。

    クックの距離とは、「i番目の観測値を使用して計算された係数と、観測値を使用しないで計算された係数との間の距離に対する測度」です。

    【回帰分析と分散分析に外れ値を特定する方法】
    https://support.minitab.com/ja-jp/minitab/18/help-and-how-to/modeling-statistics/regression/supporting-topics/model-assumptions/ways-to-identify-outliers/

    図中の破線が、推奨される閾値です。

    これ以上は「外れ値の可能性あり」と判断できます。

    Recursive Feature

    特徴量の数による予測精度を確認できる項目です。

    特徴量が5個以上となると、予測精度が安定していることが分かります。

    このことから、必要最小限な特徴量の数を確認することができます。

    Random Forest のような決定木系では、特徴量の数が予測精度へ与える影響は小さいですが、線形回帰系では特徴量を減らすことが重要となります。

    Learing Curve

    学習曲線を確認できる項目です。

    訓練データとテストデータの予測精度が、データ数に対してどのように推移しているかが分かります。

    Cross Validation Score により、交差検証による精度の幅を示しています。

    訓練データを増やすと、テストデータの予測精度が上がっていきますが、感度が鈍っていく様子が分かります。

    Validation Curve

    木の深さによる予測精度の変化を確認できる項目です。

    精度を上げつつ、過学習にならないような最適な場所を探す際に活用できます。

    Manifold Learning

    高次元データの次元削減による可視化を確認できる項目です。

    クラスターを探す際に使用するため、「分類問題」にて使用します。

    Feature Importance

    特徴量の重要度を確認できる項目です。

    目的変数に及ぼす影響が大きい順に、上から表示されます。

    さいごに

    「PyCaret」は、初心者でも機械学習が使用できるように、様々な配慮がなされています。

    また、中級者の方が用いる際には、大幅な時間短縮と作業の効率化が実現できます。

    「PyCaret」を活用し、優れた解析ができるようになることを願っています。

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    広告メディア事業部

    広告メディア事業部

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background