XGBoostを使って解約率予測したモデルの特徴量レポートをSageMaker Clarifyで出力してみた

ブラックボックスな機械学習モデルを理解するのに必要な、レポート出力をSageMaker Clarifyを使ってやってみました。
2023.05.17

皆さんこんにちは。

クルトンです!

今回は、以前やった解約率を予測するモデルの特徴量を確認するため、SageMaker Clarify(以降、Clarifyと呼称)でレポート出力をやってみました。レポート出力に際して、PDPのみのものと、PDPとSHAPを含めたものを出力しております。

XGBoostモデルの学習までのコードやその解説は、次のブログでご確認ください。

注意点

以降のコードは、SageMaker Studioで実行しています。また、上記ブログのXGBoostモデルを学習したコードまで実行済みとします。そのため、モデル学習までに使った変数を使用しています。

2023/05/30追記

本ブログで出力したレポートの見方についてブログ化しました。よければご覧ください。

必要なモジュールをインポート

まずはClarifyを実行するまでに必要なモジュールをインポートしておきます。

from sagemaker import clarify

前準備

前準備として、Clarify実行に必要なデータのアップロードや設定を行ないます。

データ準備

Clarifyを実行する際にS3 URIを用いてデータを渡す必要があります。 学習や検証に使ったデータとは違うデータを渡すため、テストデータをS3へアップロードします。

test_data.to_csv("test.csv", header=False, index=False)
s3.upload_file(Filename="test.csv", Bucket=bucket, Key=os.path.join(prefix, "test/test.csv"))

レポート出力の共通部分設定

Clarifyを実行する時の、インスタンスの設定など、実行環境の設定をします。

model_name = "<ここをお好きな名前に変更ください>"
model = xgb.create_model(name=model_name) 
container_def = model.prepare_container_def()
sess.create_model(model_name, role, container_def)

clarify_processor = clarify.SageMakerClarifyProcessor(
    role=role, instance_count=1, instance_type="ml.m4.xlarge", sagemaker_session=sess
)

Clarify実行(PDPのみ)

まずは、PDPのみを出力してみます。 PDPとは"Partial Dependence Plot"の略称です。簡単にどのようなものかを言うと、ある1つの特徴量を選んで、その特徴量に様々な値を入れた時の予測精度の変化を確認するものです。

PDPの出力先を指定します。

pdp_explainability_output_path = f"s3://{bucket}/{prefix}/<お好きな名前を入力ください。>"

次にPDPのレポートを出力するにあたって、必要なConfig合計4つを設定します。

config1つ目

1つ目はDataConfigです。PDPや後述のSHAPを含めたレポートを出力する際にも設定するものです。S3 URIを使って、インプットするデータとアウトプット先のS3 URIを指定します。

explainability_data_config = clarify.DataConfig(
    s3_data_input_path=f"s3://{bucket}/{prefix}/test",
    s3_output_path=pdp_explainability_output_path,
    label="Churn?_True.",
    headers=test_data.columns.to_list(),
    dataset_type="text/csv",
)

config2つ目

PDPをプロットしたい対象の機械学習モデルを指定します。今回使うモデルはCSVファイルを学習し、出力するモデルですので、引数に"text/csv"を渡しています。なお、他のファイル拡張子も使用可能です。

model_config = clarify.ModelConfig(
    model_name=model_name,
    instance_type="ml.m4.xlarge",
    instance_count=1,
    accept_type="text/csv",
    content_type="text/csv",
)

config3つ目

引数probability_thresholdを使用しています。バイナリ(TrueかFalseのような2値分類)を判断するモデルを使用している場合に、いくら以上であれば1(True)で、いくら未満だと0(False)であると判断するのか線引きをしているイメージです。

デフォルト値は0.5です。

predictions_config = clarify.ModelPredictedLabelConfig(probability_threshold=0.8)

config4つ目

最後にPDPのレポート内容に関する項目を設定します。筆者がエラーを出してしまい注意が必要だと感じた部分として、引数featuresの設定が必要であるという事です。

pdp_config = clarify.PDPConfig(
    features=test_data.columns.to_list(), # この引数を渡さないと ValueError: PDP features must be provided when ShapConfig is not provided というエラーが発生
    grid_resolution=15,
)

Clarifyを実行

ここまで設定したConfigを各引数に渡して、実行します。

clarify_processor.run_explainability(
    data_config=explainability_data_config,
    model_config=model_config,
    explainability_config=pdp_config,
    model_scores=predictions_config,
    logs=False,
)

出力先としてS3 URIで指定した場所へ確認しに行くと、"report"と名前のつくファイルが3種類の拡張子で出力されています。 お好きなファイルを開いてご確認ください。SageMaker上で確認したいという方は次のようなコマンドを実行してみてください。

!aws s3 cp {pdp_explainability_output_path}/report.html ./<お好きな名前に変更ください>.html

SageMaker上ではファイルを開くと、新しいタブで、htmlの中身を確認できます。

Clarify実行(PDPとSHAP値)

次はPDPとSHAP値を含むレポートを出力します。 Clarifyを実行するにあたって、Configを複数設定する所は、PDPのみのレポートの時と変わりません。

設定するConfigは5つですが、ModelConfigについてはPDPのみのレポートを出力する時と同じものを今回は流用しています。

config1つ目

PDPレポートのみの時にも設定していたPDPConfigです。 引数top_k_featuresでPDPのレポートに含める特徴量の個数を設定しています。

pdp_config_with_shap = clarify.PDPConfig(
    top_k_features=5,
    grid_resolution=25,
)

config2つ目

PDPのみのレポート時には設定していなかったConfigになります。 SHAPConfigでは、SHAP値を計算するにあたって必要な設定を行います。

SHAPそのものについては、弊社ブログで参考になる記事がございますので、こちらをご覧ください。

shap_config = clarify.SHAPConfig(
    baseline=[test_data.iloc[0].drop("Churn?_True.").values.tolist()],
    num_samples=15,
    agg_method="mean_abs",
)

config3つ目

今回筆者は、PDPのみのレポートとは違うS3 URIを設定しました。

pdp_with_shap_explainability_output_path = f"s3://{bucket}/{prefix}/<お好きな名前を入力ください。>"

config4つ目

PDPのみのレポートを出力していた時と違う箇所は、3行目のレポート出力先の設定です。

explainability_data_config = clarify.DataConfig(
    s3_data_input_path=f"s3://{bucket}/{prefix}/test",
    s3_output_path=pdp_with_shap_explainability_output_path,
    label="Churn?_True.",
    headers=test_data.columns.to_list(),
    dataset_type="text/csv",
)

Clarify実行

Clarifyを実行するにあたって、引数explainability_configにlist型で、PDPConfigとSHAPConfigの2種類を渡します。

clarify_processor.run_explainability(
    data_config=explainability_data_config,
    model_config=model_config,
    explainability_config=[pdp_config_with_shap, shap_config],
    logs=False,
)

PDPのみのレポートを確認した時と同様のやり方で、SageMaker Studio上でファイルの中身を確認できます。

!aws s3 cp {pdp_with_shap_explainability_output_path}/report.html ./<お好きな名前を入力ください。>.html

終わりに

今回はモデルの出力を解釈するのに使えるSHAPや、特徴量ごとの予測精度の確認に使えるPDPをClarifyを使ってレポートへ出力してみました。

Configの設定を複数する必要がありますが、比較的簡単にモデルの解釈をするのに必要な情報が手に入れられるのではないでしょうか。

次回ブログとして、レポートの中身の確認方法について、今回出力したレポートを元に確認したいと考えています。

今回はここまで。

それでは、また!

参考サイト