TECH BLOG
クロス・マーケティンググループ
クロス・マーケティンググループ

PyCaretを用いた特徴量エンジニアリング

Cover Image for PyCaretを用いた特徴量エンジニアリング
目次

    PyCaretを用いた特徴量エンジニアリング

    項目内容
    この記事でわかること機械学習モデルの精度を改善するために必要な「特徴量エンジニアリング」の効率的な実装方法を身につけることができる。
    本シリーズの対象者・コンピュータサイエンス、数学などの素養があるかた。
    ・ご自身のデータサイエンス・スキルをグロースハックに応用したいかた。
    本シリーズで提供する知識・グロースハックに役立つデータサイエンス手法を体系的に学ぶことができる。
    ・各記事で紹介するpythonコードを短時間で実務に利用できる。
    次回以降に予定している内容1. AutoMLの使いかた
    2. 実践的なデータ分析手法の紹介
    3. グロースハック手法の紹介
    4. 業務に役立つ統計知識・機械学習の知識の紹介

    1.特徴量エンジニアリングの効率化

     本シリーズでは、グロースハックに役立つデータサイエンス手法を紹介しています。第2回では、Pythonで扱える自動機械学習(AutoML: auto machine learning)、PyCaretを用いた「予測モデルによる要因分析(predictive data analysis)」を解説しました。PyCaretを使用すると、コーディングに費やす時間を減らし、分析に多くの時間を費やすことができます。

     AutoMLは、データ取得、前処理、モデル作成、評価、展開・共有などを自動化するツールです。PyCaretを使うことにより、特別な知識や経験がなくても、手軽に機械学習を利用できます。今回は、データ前処理の中でもとくにモデルの精度に大きく影響する特徴量エンジニアリングを自動化する方法を解説します。

    データ分析のフロー

    2.特徴量エンジニアリング

    2.1.なぜ特徴量エンジニアリングが必要なのか

     仕事で予測モデル構築をする場合、誰もが実用に耐えうる精度を出したいと考えると思います。モデルの精度には、特徴量エンジニアリング、モデル選択、モデルのハイパーパラメータ調整などが影響します。これらの仕事は、データサイエンティスト、AIエンジニアの腕の見せどころとなります

     データの特徴をモデルに学習させることのできる方法として深層学習がありますが、その場合も特徴量エンジニアリングの前処理はほぼ必須となります。

    2.2.特徴量とは何か

     特徴量(feature)とは、機械学習モデルの入力となる数値変数、カテゴリ変数のことです。統計学の分野では、説明変数と呼ばれています。例えば、体重の予測に、摂取カロリー、消費カロリーなどを用いる場合、体重を説明するのに用いるこれらの変数を特徴量と呼びます。

    2.3.モデルの軽量化

     データを収集するには労力がかかり、大量のデータで深層学習を処理するためには、TPUを搭載した高性能なクラウドサービスを利用するなど、多額の予算と時間がかかる場合があります。そのため、ビジネスの現場では、本質的な特徴量だけを用いるスパースモデリングなどの手法が重要性を増してきています。kaggleなどのデータ分析コンペティションにおいても、深層学習以外のモデルが上位のスコアを叩き出すことがあります。

     モデルの説明可能性の観点からも、深層学習以外の機械学習が用いられることがあります。変数重要度を可視化することにより、どの特徴量が重要なのかを理解することは、収集したほうがよい新たなデータを明確にしたり、ビジネスにインパクトを与える要因を理解する際に役に立ちます。PyCaretを用いて、変数重要度を可視化する方法については、第2回「PyCaretを用いた予測モデルによる要因分析」で解説しています。

    図3-3

    2.3.モデルの汎化性能

     モデルの汎化性能とは、与えられた訓練データだけではなく、未知のデータに対しても予測できるモデルの性能です。​​例えば、売上予測をする際に、過去データでは高い予測精度が出たにも関わらず、翌月を予測したところ予測精度が悪いということがしばしば起こります。

     「オッカムの剃刀」は、筆者がデータ分析をする際に大切にしている原則のひとつです。「ある事柄を説明するためには、必要以上に多くを仮定するべきでないという」指針であり、14世紀のスコラ哲学者・神学者、オッカムに由来します。

     モデルの予測誤差は、ノイズ、バイアス、バリアンス分解できます。バイアスは、モデルの予測値と実測値との差です。特徴量を増やしてモデルを複雑にすると、バイアスが小さくなります。例えば、説明変数が1つしかない単回帰モデルよりも、複数の説明変数を用いた重回帰モデルのほうが予測精度が高まることは、直感的に理解できると思います。

     バリアンスは、データセットのばらつきに対してモデルの予測値がどの程度ばらつくかを表す指標です。​​モデルを複雑にすると、訓練データのノイズまで学習した状態となり、未知のデータでは正しく予測できなくなります。

     バイアスとバリアンスはトレードオフの関係にあり、バイアス、バリアンスの誤差和が最小となるモデルの複雑さを選ぶことが、モデルの汎化性能を向上させる上でも大切なポイントとなります。

    growth hack3-4

    3.PyCaretで特徴量エンジニアリングを自動化する

    3.1.インストール

     Pycaret の動作環境は下記の通りです(2023年4月時点)。

    • Python 3.7, 3.8, 3.9, 3.10
    • Ubuntu 16.04 以降
    • Windows 7以降
    • 64ビットシステム

     PyCaretのインストールや動作確認でエラーが出る場合、既存のライブラリと競合が発生している可能性があります。競合を避けるために、Pycaret専用の仮想環境を作ることをお勧めします。ターミナルウィンドウ(Windows の場合は、Anaconda Prompt)で下記を実行します。

    # Anacondaでの仮想環境の作成
    conda create --name pycaret_test python=3.10 jupyter
    
    # 仮想環境のアクティベート
    conda activate pycaret_test
    
    # PyCaretのライブラリをインストール
    pip install pycaret
    
    # 作成した仮想環境をJupyter Notebookのカーネルに追加
    python -m ipykernel install --user --name pycaret_test --display-name "pycaret_test"
    
    # PythonShellの起動
    python
    

     PythonShellでの動作確認

    from pycaret.regression import *
    

    MacOSの場合、ここで、下記のようなエラーが発生する場合があります。

    Library not loaded: '/usr/local/opt/libomp/lib/libomp.dylib'

    LightGBMで使用するlibompがインストールされていないことが原因です。ターミナルでlibompをインストールします。MacOSではbrewを使用してインストールできます。

     brew install libomp
    

    ### 3.2.分類モデルの構築

     第2回「PyCaretを用いた予測モデルによる要因分析​​」では、回帰モデルを構築しました。今回は、分類モデルを構築します。例えば、顧客離脱の予測、陽性・陰性の判定などは、分類問題として予測することができます。

     Jupyter Notebook を起動します。ノートブックを新規作成するときに、pycaret_testをカーネルとして選択します。以下のコードは、ノートブック上で実行します。

    # ライブラリの読み込み
    from pycaret.datasets import get_data
    from pycaret.classification import *
    
    # Diabates データセットのロード
    data = get_data('diabetes')
    

    オリジナルのデータを使用したい場合は、pandasを使用して、csvファイルを読み込んでください。

    # ライブラリの読み込み
    import pandas as pd
    
    # オリジナルデータセットのロード
    data = pd.read_csv('mydata.csv')
    

     Diabetes(糖尿病)データセットは、分類モデルの構築に使えるデータセットです。年齢(Age)、血圧(Diastolic blood pressure​​)、インスリン(2-Hour serum insulin)など8種類の特徴量を用いて、糖尿病かどうかを示すラベル(0, 1)を予測します。

    growth hack3-5

    下記のコードでそれぞれの前処理を実行します。

    import pandas as pd
    
    # モデルを初期化する際の乱数
    seed = 123
    # 結果を格納するためのデータフレーム
    df_res = pd.DataFrame()
    for param in ["default", "normalize", "normalize_robust", "transformation", "pca", "bin_numeric_features", "remove_outliers", "remove_multicollinearity", "polynomial_features", "feature_selection", "fix_imbalance"]:
        if param == "default":
            # targetに目的変数を指定
            setup(data, target = 'Class variable', session_id = seed)
        elif param == "normalize":
            setup(data, target = 'Class variable', session_id = seed, normalize = True)
        elif param == "normalize":
            setup(data, target = 'Class variable', session_id = seed, normalize = True, normalize_method = "robust")
        elif param == "transformation":
            setup(data, target = 'Class variable', session_id = seed, transformation = True)
        elif param == "pca":
            setup(data, target = 'Class variable', session_id = seed, pca = True)
        elif param == "bin_numeric_features":
            # bin_numeric_featureに目的変数を除く数値変数のリストを指定
            setup(data, target = 'Class variable', session_id = seed, bin_numeric_features = list(data.columns[:-1]))
        elif param == "remove_outliers":
            setup(data, target = 'Class variable', session_id = seed, remove_outliers = True)
        elif param == "remove_multicollinearity":
            setup(data, target = 'Class variable', session_id = seed, remove_multicollinearity = True)
        elif param == "polynomial_features":
            setup(data, target = 'Class variable', session_id = seed, polynomial_features = True)
        elif param == "feature_selection":
            setup(data, target = 'Class variable', session_id = seed, feature_selection = True)
        elif param == "fix_imbalance":
            setup(data, target = 'Class variable', session_id = seed, fix_imbalance = True)
        else:
            print(param + "is not defined")
        # モデル構築
        best = compare_models()
        # 結果のデータフレームから1行目のみ取得
        res = pull().iloc[[0], :]
        res.insert(0, "PARAM", param)
        # 結果を縦結合
        df_res = pd.concat([df_res, res])
    

    growth_hack3-6

     defaultよりもF1スコアが高い処理は、normalize、transformation、bin_numeric_features、remove_outliers、fix_imbalanceです。これらのオプションを同時に指定してSetup関数を実行します。ただし、bin_numeric_featuresは、normalize、transformation の効果が得られなくなるため除外しました。

    # セットアップ(前処理)の実行
    setup(data, target = 'Class variable', session_id = seed, normalize = True, transformation = True, remove_outliers = True, fix_imbalance = True)
    # モデル構築
    best = compare_models()
    

    growth_hack3-7

     bestには、ベストモデル(Ridge Classifier)のハイパーパラメータのデフォルト値が含まれています。Ridge Classifierを実装する際は、同じパラメータを指定すれば、同じモデルを再現することができます。Ridge Classifier のAUCが 0 と表示されているのは、クラスの所属確率を予測する predict_proba() を持たないモデルではAUCを計算しないためです。

    # モデルのパラメータを表示
    print(best)
    

    RidgeClassifier(alpha=1.0, class_weight=None, copy_X=True, fit_intercept=True, max_iter=None, positive=False, random_state=123, solver='auto', tol=0.0001)

    4.まとめ

     第3回では、PyCaretを用いた特徴量エンジニアリングを解説しました。特徴量エンジニアリングは、機械学習の性能に大きな影響を与えるため、モデル構築の重要なプロセスの人つです。適切な特徴量エンジニアリングを行うことで、機械学習モデルの性能を向上させることができます。Setup関数には、今回、紹介できなかったオプションも存在しますので、興味のあるかたはぜひ調べてみてください。

     本シリーズでは、データサイエンスの基礎、データ分析の基本的なコード、AutoMLの活用方法などについて、グロースハックに役立つ実践的な方法を提案していく予定です。pythonコードを用いた分析手法などの紹介も行いますので、シリーズ全体を通じて皆様のお役に立てることができればと思います。


    著者プロフィール

    田口 健太郎 Kentaro Taguchi

    ソーシャルゲームのデータマイニング、原子力分野の研究コンサルタント、アクセンチュアデータ分析エンジニア、R&D推進室などを経て、技術顧問、講師、データサイエンティストを担当。2022年12月よりクロスマーケティング・グループにてデータサイエンティストとして従事。
    私たちは積極的に採用活動をしております。
    https://recruit.cross-m.co.jp/

    Companies

    エクスクリエ
    クロス・マーケティンググループ
    メタサイト
    クロス・コミュニケーション

    Tags