Snowpark MLで作成したXGBoostモデルの特徴量重要度をテーブルとして保存する

Snowpark MLで作成したXGBoostモデルの特徴量重要度をテーブルとして保存する

Clock Icon2024.03.10

データアナリティクス事業本部 機械学習チームの鈴木です。

Snowpark MLで作成したXGBoostモデルの特徴量重要度をテーブルとして保存したい場合があると思います。

例えばStreamlitで、運用しているXGBoostのモデルの特徴量重要度を見たいような場合です。

Snowpark MLのsnowflake.ml.modeling.xgboost.XGBRegressorなどにはto_xgboost()メソッドが実装されています。xgboost.XGBRegressorのインスタンスなどに変換した後はXGBoostの仕様にしたがって道なりにというところですが、毎回調べるのも大変なので、簡単にですが実装例をご紹介します。

実装例

snowflake.ml.modeling.xgboost.XGBRegressorを訓練するケースで、学習したモデルの特徴量重要度をSnowflakeにテーブルとして保存する箇所を記載します。

# モデルの定義と学習
regressor = XGBRegressor(
    input_cols=CATEGORICAL_COLUMNS_OE+NUMERICAL_COLUMNS,
    label_cols=LABEL_COLUMNS,
    output_cols=OUTPUT_COLUMNS
)
regressor.fit(train_df)

# XGBoostモデルの特徴量重要度の保存
# XGBoostモデルのインスタンスのうち、ブースターから特徴量重要度を取得する。
xgb_booster = regressor.to_xgboost().get_booster()
d_feature_importance = xgb_booster.get_score(importance_type='gain')
d_feature_importance = {key.upper(): value for key, value in d_feature_importance.items()}
df_feature_importance = pd.DataFrame(d_feature_importance, index=[0])

# 特徴量重要度の保存
# sessionはあらかじめ作成しておく
sfdf_feature_importance = session.create_dataframe(df_feature_importance, schema=[d_feature_importance.keys()])
sfdf_feature_importance.write.mode("overwrite").save_as_table("xgb_feature_importance")

session作成などは少し長くなるため省略しています。詳しくは『クイックスタートでSnowpark ML Modelingを学んだのでポイントをご紹介』をご確認ください。

XGBoostは1.7.3、Snowflake-ml-pythonは1.2.0の前提です。

ポイント

xgboost.XGBRegressorインスタンスへの変換と特徴量重要度の取得

snowflake.ml.modeling.xgboost.XGBRegressorなどにはto_xgboost()メソッドが実装されているため、xgboostのScikit-Learn APIのインスタンスに変換します。

後はXGBoostの仕様通りなのですが、今回はboosterのget_scoreメソッドで辞書として特徴量重要度を取るのが分かりやすそうだったので、こちらの方法を使いました。

テーブルへの保存

特徴量重要度は辞書で得られるため、Pandasデータフレームにした後、create_dataframeメソッドでSnowparkのデータフレームに変換してからテーブルにしました。

テーブルへの保存例

Snowparkのデータフレームのカラム名は、エスケープしていない文字は大文字に統一されますが、カラム名は念の為、辞書の段階で大文字にしておきました。

最後に

今回はSnowpark MLで作成したXGBoostモデルの特徴量重要度をテーブルとして保存する例についてご紹介しました。

参考になりましたら幸いです。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.