Cream-Kuchen

MMLSpark と Python の LightGBM 比較 ~変数重要度や精度、予測値の観点から~

はじめに

MMLSparkとPythonのLightGBMの学習・予測結果はどのように違うのでしょう?

分類器Classifierで同一データの学習・予測を行い、評価精度変数重要度予測スコアを比較します。

結論:完全一致

※ 特徴量の行・列の並びは同一
※ 幾つか設定したハイパーパラメータ等も同一
※ 実行環境:DatabricksのCommunity Edition
※ MMLSparkのversion:1.0.0-rc1
Python LightGBMのversion:2.3.1


また、比較に用いたsample codeをGoogle driveで共有しているので参考にしてください。
html:LightGBM_[mmlspark_vs_Python].html - Google ドライブ
ipynb:LightGBM_[mmlspark_vs_Python].ipynb - Google ドライブ

目次


1, サンプルデータ取得

Databricksにある赤・白ワインのデータセットを使うことにします。

こちらの記事で紹介しているようにデータを取得・加工し、特徴量化します。
cream-kuchen.hatenablog.com


2, 同一にする条件等

下記を同一にした上で、MMLSparkとPythonの両方で学習・予測を行います。

    ・訓練(train), 検証(test) データ
        → Pysparkデータフレームで2分割後、それぞれPandasデータフレーム化

    ・データのレコード(縦)の並び順
        → データフレームにユニークなIDを振って並び替え

    ・データのカラム(横)の並び順
        → 特徴量のカラムをA-Z順に並び替え

    ・モデルのハイパーパラメータ設定
        → PythonとMMLSparkの公式doc等を参照し設定


このうち、モデルのハイパーパラメータ設定にやや苦戦しました。
PythonとMMLSparkのLightGBMClassifierはパラメータ名がそれぞれ異なるからです。
Pythonスネーク記法、MMLSparkはキャメル記法が使われています。


Python LGBMClassifier lightgbm.LGBMClassifier — LightGBM 3.1.1.99 documentation f:id:Cream-Kuchen:20200808160527p:plain

〇 MMLspark LightGBMClassifier

from mmlspark.lightgbm import LightGBMClassifier
LightGBMClassifier.__init__

f:id:Cream-Kuchen:20200723145225p:plain


3, MMLSparkモデルの構築

下記のようにモデルを構築します。6つのパラメータを設定することにします。

model = (
  LightGBMClassifier(
    baggingSeed=1024,    # シード値
    learningRate=0.1,    # 学習率
    numIterations=100,   # 作成する木の数
    maxDepth=4,          # 木の深さ
    numLeaves=16,        # 木にある分岐の数
    metric='auc')        # 学習誤差の評価指標
)



その学習・検証精度はこのようになります。
f:id:Cream-Kuchen:20200808172207p:plain

また、変数重要度はこのようになりました。
f:id:Cream-Kuchen:20200808172222p:plain


4, Pythonモデルの構築

MMLSparkと同様に、下記のようにモデルを構築します。パラメータ設定に注意します。

model = (
  lgb.LGBMClassifier(
    random_state=1024,  # シード値 
    learning_rate=0.1,  # 学習率
    n_estimators=100,   # 作成する木の数 
    max_depth=4,        # 木の深さ 
    num_leaves=16,      # 木にある分岐の数
    metric='auc',       # 学習誤差の評価指標
    importance_type='gain')  # 後ほど変数重要度を比較する際にtypeを合わせるため設定
)



その学習・検証精度はこのようになります。
f:id:Cream-Kuchen:20200808172707p:plain

また、変数重要度はこのようになりました。
f:id:Cream-Kuchen:20200808172721p:plain


5, 評価精度の比較

MMLSparkとPythonモデルが構築できました。まず両者の検証精度を比較してみます。

下16桁まで完全一致します。
f:id:Cream-Kuchen:20200808173317p:plain


6, 変数重要度の比較

次に両者の変数重要度を比較してみます。

下18桁まで完全一致します。
f:id:Cream-Kuchen:20200808173558p:plain


7, 予測スコアの比較

最後に両者の検証データの予測スコアを比較してみます。

下6桁まで完全一致します。
f:id:Cream-Kuchen:20200808174009p:plain

f:id:Cream-Kuchen:20200808174037p:plain


おわりに

MMLSparkとPythonのLightGBM分類器で評価精度変数重要度予測スコアを比較してみました。

各種条件を同一にすれば完全一致することが分かりました。

PythonからMMLSparkへモデル移行を検討される際、参考にしてもらえれば幸いです。