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
〇 MMLspark LightGBMClassifier
from mmlspark.lightgbm import LightGBMClassifier LightGBMClassifier.__init__
3, MMLSparkモデルの構築
下記のようにモデルを構築します。6つのパラメータを設定することにします。
model = ( LightGBMClassifier( baggingSeed=1024, # シード値 learningRate=0.1, # 学習率 numIterations=100, # 作成する木の数 maxDepth=4, # 木の深さ numLeaves=16, # 木にある分岐の数 metric='auc') # 学習誤差の評価指標 )
その学習・検証精度はこのようになります。
また、変数重要度はこのようになりました。
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を合わせるため設定 )
その学習・検証精度はこのようになります。
また、変数重要度はこのようになりました。
5, 評価精度の比較
MMLSparkとPythonモデルが構築できました。まず両者の検証精度を比較してみます。
下16桁まで完全一致します。
6, 変数重要度の比較
次に両者の変数重要度を比較してみます。
下18桁まで完全一致します。
7, 予測スコアの比較
最後に両者の検証データの予測スコアを比較してみます。
下6桁まで完全一致します。
おわりに
MMLSparkとPythonのLightGBM分類器で評価精度、変数重要度、予測スコアを比較してみました。
各種条件を同一にすれば完全一致することが分かりました。
PythonからMMLSparkへモデル移行を検討される際、参考にしてもらえれば幸いです。