英語で読む

次の方法で共有


チュートリアル: 不正検出モデルの作成、評価、スコア付け

このチュートリアルでは、Microsoft Fabric ワークフローの Synapse Data Science のエンド ツー エンドの例について説明します。 このシナリオでは、履歴データでトレーニングされた機械学習アルゴリズムを使用して不正行為検出モデルを構築します。 その後、モデルを使用して、将来の不正なトランザクションを検出します。

このチュートリアルに含まれる手順は次のとおりです:

  • カスタム ライブラリをインストールする
  • データの読み込み
  • 探索的データ分析を通じてデータを理解して処理する
  • Scikit-learn を使って機械学習モデルをトレーニングし、MLflow と Fabric の自動ログ機能を使って実験を追跡する
  • 最も高いパフォーマンスをもつ機械学習モデルを保存して登録する
  • スコアリング行う機械学習モデルを読み込み、予測を行う

前提条件

ノートブックで作業を進めます

ノートブックでこれらの後続のオプションのうちのいずれかを選択できます

  • Data Science 環境のビルトイン ノートブックを開いて実行します
  • GitHub から Data Science 環境にノートブックをアップロードする

ビルトインのノートブックを開きます

[不正行為の検出] サンプル ノートブックは、このチュートリアルに付属しています。

チュートリアルのビルトインのサンプル ノートブックを Synapse Data Science 環境で開くには:

  1. Synapse Data Science のホーム ページに移動します。

  2. [サンプルの使用] を選択してください。

  3. 対応するサンプルを選択してください。

    • サンプルが Python チュートリアル用の場合は、既定の [エンド ツー エンド ワークフロー (Python)] タブから。
    • サンプルが R チュートリアル用の場合は、[エンド ツー エンド ワークフロー (R)] タブから。
    • サンプルがクイック チュートリアル用の場合は、[クイック チュートリアル] タブから。
  4. コードの実行を開始する前に、[レイクハウスをノートブックにアタッチします]

GitHub からノートブックをインポートします

[AIsample - Fraud Detection.ipynb] ノートブックは、このチュートリアルに付属しています。

このチュートリアルが付属するノートブックを開く場合は、「データ サイエンス チュートリアル用にシステムを準備する」内の指示に従い、ノートブックを、お使いのワークスペースにインポートします。

このページからコードをコピーして貼り付ける場合は、[新しいノートブックを作成する] ことができます。

コードの実行を開始する前に、必ずレイクハウスをノートブックにアタッチしてください。

手順 1: カスタム ライブラリをインストールする

機械学習モデルの開発またはアドホックなデータ分析には、Apache Spark セッション用のカスタム ライブラリをすばやくインストールすることが必要な場合があります。 ライブラリをインストールするには、2 つのオプションがあります。

  • ノートブックのインライン インストール機能 (%pip または %conda) を使って、現在のノートブックにのみライブラリをインストールします
  • または、Fabric 環境を作成し、パブリック ソースからライブラリをインストールするか、あるいはカスタム ライブラリをそこにアップロードすると、ワークスペース管理者はその環境をワークスペースの既定としてアタッチできます。 その後、環境内のすべてのライブラリが、ワークスペース内のすべてのノートブックと Spark ジョブ定義で使用できるようになります。 環境の詳細については、「Microsoft Fabric で環境を作成、構成、および使用する」を参照してください。

このチュートリアルでは、%pip install を使用して、ノートブックに imblearn ライブラリをインストールします。

注意

PySpark カーネルは、%pip install の実行後に再起動します。 他のセルを実行する前に必要なライブラリをインストールします。

# Use pip to install imblearn
%pip install imblearn

手順 2: データを読み込む

不正検出のデータセットには、2 日間にわたってヨーロッパのカード所有者が行った、2013 年 9 月以降のクレジット カード取引が含まれています。 データセットには数値の特徴量のみが含まれていますが、これは元の特徴量に対するプリンシパル コンポーネント解析 (PCA) 変換によるものです。 PCA は、Time および Amount を除くすべての特徴量を変換しました。 機密性を維持するために、データセットに関する元の特徴量や背景情報を提供することはできません。

これらの詳細では、データセットについて説明します:

  • V1V2V3、... V28 特徴量は、PCA で取得された主要コンポーネントです。
  • Time 特徴量には、各トランザクションとデータセット内の最初のトランザクションの間に経過秒数が含まれます。
  • Amount 特徴量はこのトランザクションの金額です。 この特徴量は、サンプル依存のコスト重視型学習に使用できます。
  • Class 列は応答 (ターゲット) 変数です。 不正の場合には値 1 を受け取り、それ以外の場合は 0 となります

284,807 件のトランザクションのうち、不正なトランザクションは 492 件のみです。 少数派クラス (不正) が占めるのはデータの約 0.172% のみであるため、データセットは非常に不均衡になっています。

このテーブルは、creditcard.csv データのプレビューを示しています:

時刻 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 Amount クラス
0 -1.3598071336738 -0.0727811733098497 2.53634673796914 1.37815522427443 -0.338320769942518 0.462387777762292 0.239598554061257 0.0986979012610507 0.363786969611213 0.0907941719789316 -0.551599533260813 -0.617800855762348 -0.991389847235408 -0.311169353699879 1.46817697209427 -0.470400525259478 0.207971241929242 0.0257905801985591 0.403992960255733 0.251412098239705 -0.018306777944153 0.277837575558899 -0.110473910188767 0.0669280749146731 0.128539358273528 -0.189114843888824 0.133558376740387 -0.0210530534538215 149.62 "0"
0 1.19185711131486 0.26615071205963 0.16648011335321 0.448154078460911 0.0600176492822243 -0.0823608088155687 -0.0788029833323113 0.0851016549148104 -0.255425128109186 -0.166974414004614 1.61272666105479 1.06523531137287 0.48909501589608 -0.143772296441519 0.635558093258208 0.463917041022171 -0.114804663102346 -0.183361270123994 -0.145783041325259 -0.0690831352230203 -0.225775248033138 -0.638671952771851 0.101288021253234 -0.339846475529127 0.167170404418143 0.125894532368176 -0.00898309914322813 0.0147241691924927 2.69 "0"

データセットをダウンロードしてレイクハウスにアップロードする

さまざまなデータセットでこのノートブックを使用できるように、これらのパラメーターを定義します:

IS_CUSTOM_DATA = False  # If True, the dataset has to be uploaded manually

TARGET_COL = "Class"  # Target column name
IS_SAMPLE = False  # If True, use only <SAMPLE_ROWS> rows of data for training; otherwise, use all data
SAMPLE_ROWS = 5000  # If IS_SAMPLE is True, use only this number of rows for training

DATA_FOLDER = "Files/fraud-detection/"  # Folder with data files
DATA_FILE = "creditcard.csv"  # Data file name

EXPERIMENT_NAME = "aisample-fraud"  # MLflow experiment name

このコードは、公開されているバージョンのデータセットをダウンロードし、Fabric レイクハウスに格納します。

重要

実行する前にノートブックに、確実に [レイクハウスを追加] してください。 そうしないと、エラーが表示されます。

if not IS_CUSTOM_DATA:
    # Download data files into the lakehouse if they're not already there
    import os, requests

    remote_url = "https://synapseaisolutionsa.blob.core.windows.net/public/Credit_Card_Fraud_Detection"
    fname = "creditcard.csv"
    download_path = f"/lakehouse/default/{DATA_FOLDER}/raw"

    if not os.path.exists("/lakehouse/default"):
        raise FileNotFoundError("Default lakehouse not found, please add a lakehouse and restart the session.")
    os.makedirs(download_path, exist_ok=True)
    if not os.path.exists(f"{download_path}/{fname}"):
        r = requests.get(f"{remote_url}/{fname}", timeout=30)
        with open(f"{download_path}/{fname}", "wb") as f:
            f.write(r.content)
    print("Downloaded demo data files into lakehouse.")

MLflow 実験追跡を設定する

実験の追跡プロセスでは、実行するすべての実験に関連するすべての実験関連情報を保存します。 時には、特定の実験を実行する際、より良い結果を得る方法がない場合があります。 そのような場合は、実験を停止し、新しい実験を試す必要があります。

Microsoft Fabric の Synapse Data Science エクスペリエンスには、自動ログ機能が含まれています。 この機能によって、トレーニング中に機械学習モデルのパラメータ、メトリック、項目を自動的にログするために必要なコードの量が減ります。 この機能により、MLflow 自動ログ機能が拡張されます。 Data Science 環境には深い統合があります。

自動ログ記録を使用すると、手動追跡を必要とせずに、さまざまなモデルや実験のパフォーマンスを簡単に追跡および比較できます。 詳細については、「Microsoft Fabric での自動ログ記録」を参照してください。

ノートブック セッションで Microsoft Fabric の自動ログ記録を無効にする場合は、mlflow.autolog() を呼び出して disable=True を設定します:

# Set up MLflow for experiment tracking
import mlflow

mlflow.set_experiment(EXPERIMENT_NAME)
mlflow.autolog(disable=True)  # Disable MLflow autologging

レイクハウスから生データを読み取る

次のコードは、レイクハウスから生データを読み取ります。

df = (
    spark.read.format("csv")
    .option("header", "true")
    .option("inferSchema", True)
    .load(f"{DATA_FOLDER}/raw/{DATA_FILE}")
    .cache()
)

手順 3: 探索的データ分析を実行する

このセクションでは、まず生データと高レベルの統計を検索します。 次に、視覚化を容易にするために、データを変換し、列を正しい型にキャストし、Spark DataFrame から pandas DataFrame に変換します。 最後に、データ内のクラス分布を調べて視覚化します。

生データを表示する

  1. 生データを調べて、display コマンドを使用して高レベルの統計情報を表示します。 データの視覚化の詳細については、「Microsoft Fabric でのノートブックの視覚化」を参照してください。

    display(df)
    
  2. データセットに関する基本的な情報を出力します。

    # Print dataset basic information
    print("records read: " + str(df.count()))
    print("Schema: ")
    df.printSchema()
    

データの変換

  1. データセットの列を正しい型にキャストします:

    import pyspark.sql.functions as F
    
    df_columns = df.columns
    df_columns.remove(TARGET_COL)
    
    # Ensure that TARGET_COL is the last column
    df = df.select(df_columns + [TARGET_COL]).withColumn(TARGET_COL, F.col(TARGET_COL).cast("int"))
    
    if IS_SAMPLE:
        df = df.limit(SAMPLE_ROWS)
    
  2. 視覚化と処理を容易にするために、spark DataFrame を pandas DataFrame に変換します:

    df_pd = df.toPandas()
    

データセット内のクラス分布を調べる

  1. データセット内のクラス分布を表示します。

    # The distribution of classes in the dataset
    print('No Frauds', round(df_pd['Class'].value_counts()[0]/len(df_pd) * 100,2), '% of the dataset')
    print('Frauds', round(df_pd['Class'].value_counts()[1]/len(df_pd) * 100,2), '% of the dataset')
    

    このコードは、データセットの次のクラス分布を返します: 99.83% No Frauds、0.17% Frauds。 このクラス分布は、ほとんどのトランザクションが非不正利用であることを示しています。 そのため、オーバーフィットを回避するために、モデル トレーニングの前にデータの前処理が必要です。

  2. プロットを使って、データセット内のクラスの不均衡を表示します。それには、不正な取引と不正でない取引の分布を表示します。

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    colors = ["#0101DF", "#DF0101"]
    sns.countplot(x='Class', data=df_pd, palette=colors) 
    plt.title('Class Distributions \n (0: No Fraud || 1: Fraud)', fontsize=10)
    
  3. ボックス プロットを使って、取引量に関する 5 つの数値による概要 (最小スコア、第 1 四分位数、中央値、第 3 四分位数、最大スコア) を表示します。

    fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12,5))
    s = sns.boxplot(ax = ax1, x="Class", y="Amount", hue="Class",data=df_pd, palette="PRGn", showfliers=True) # Remove outliers from the plot
    s = sns.boxplot(ax = ax2, x="Class", y="Amount", hue="Class",data=df_pd, palette="PRGn", showfliers=False) # Keep outliers from the plot
    plt.show()
    

    非常に不均衡なデータの場合、ボックス プロットでは正確な分析情報が示されない場合があります。 しかし、Class の不均衡の問題に最初に対処してから、より正確な分析情報を得るための同じプロットを作成することもできます。

手順 4: モデルをトレーニングして評価する

ここでは、不正行為を分類する LightGBM モデルをトレーニングします。 不均衡なデータセットと均衡なデータセットの両方で LightGBM モデルをトレーニングします。 その後、2 つのモデルのパフォーマンスを比較します。

トレーニング用およびテスト用のデータセットを準備する

トレーニングの前に、データをトレーニング データセットとテスト データセットに分割します。

# Split the dataset into training and testing sets
from sklearn.model_selection import train_test_split

train, test = train_test_split(df_pd, test_size=0.15)
feature_cols = [c for c in df_pd.columns.tolist() if c not in [TARGET_COL]]

SMOTE をトレーニング データに適用する

imblearn ライブラリは、Synthetic Minority Oversampling Technique (SMOTE) アプローチを使って、不均衡な分類の問題に対処します。 不均衡な分類は、モデルが意思決定境界を効果的に学習するために利用できる少数派クラスの例が少なすぎる場合に発生します。 SMOTE は、マイノリティ クラスの新しいサンプルを合成するために最も広く使用されているアプローチです。

SMOTE はトレーニング データセットにのみ適用し、テスト データセットには適用しません。 テスト データを使用してモデルをスコア付けする場合は、運用環境で見えないデータに対するモデルのパフォーマンスを近似する必要があります。 有効な近似には、元の不均衡分布を頼りに、テスト データが運用環境のデータを可能な限り正確に表します。

# Apply SMOTE to the training data
import pandas as pd
from collections import Counter
from imblearn.over_sampling import SMOTE

X = train[feature_cols]
y = train[TARGET_COL]
print("Original dataset shape %s" % Counter(y))

sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X, y)
print("Resampled dataset shape %s" % Counter(y_res))

new_train = pd.concat([X_res, y_res], axis=1)

SMOTE の詳細については、「SMOTE メソッドに関する Scikit-learn リファレンス ページ」と「オーバーサンプリングに関する Scikit-learn ユーザー ガイド」リソースを参照してください。

機械学習モデルをトレーニングし、実験を実行する

Microsoft Fabric の Apache Spark を使うと、ビッグ データを使った機械学習を行うことができます。 Apache Spark を使うと、大量の構造化データ、非構造化データ、すばやく変化するデータから、価値のある分析情報を得ることができます。

Microsoft Fabric の Azure Spark を使用して機械学習モデルをトレーニングするには、Apache Spark MLlib、SynapseML、およびその他のさまざまなオープンソース ライブラリなど、いくつかのオプションが利用可能です。 詳しくは、「Microsoft Fabric での機械学習モデルのトレーニング」をご覧ください。

機械学習の実験 は、関連するすべての機械学習の実行を編成および制御するための主要な単位として機能します。 "実行" はモデル コードの 1 回の実行に対応します。 機械学習の 実験追跡 とは、パラメータ、メトリック、モデル、その他の成果物など、すべての実験とそのコンポーネントの管理を含みます。

実験追跡では、特定の機械学習実験に必要なすべてのコンポーネントを整理できます。 さらに、保存した実験を使って、過去の結果を簡単に再現することもできます。 機械学習の実験の詳細については、「Microsoft Fabric での機械学習の実験」を参照してください。

  1. より多くのメトリック、パラメータ、ファイルを追跡するには、exclusive=False を設定して、 MLflow 自動ログ構成を更新します:

    mlflow.autolog(exclusive=False)
    
  2. LightGBM を使用して 2 つのモデルをトレーニングします。 一方のモデルは不均衡なデータセットを処理し、もう 1 つのモデルは (SMOTE を介して) バランスの取れたデータセットを処理します。 次に、2 つのモデルのパフォーマンスを比較します。

    import lightgbm as lgb
    
    model = lgb.LGBMClassifier(objective="binary") # Imbalanced dataset
    smote_model = lgb.LGBMClassifier(objective="binary") # Balanced dataset
    
    # Train LightGBM for both imbalanced and balanced datasets and define the evaluation metrics
    print("Start training with imbalanced data:\n")
    with mlflow.start_run(run_name="raw_data") as raw_run:
        model = model.fit(
            train[feature_cols],
            train[TARGET_COL],
            eval_set=[(test[feature_cols], test[TARGET_COL])],
            eval_metric="auc",
            callbacks=[
                lgb.log_evaluation(10),
            ],
        )
    
    print(f"\n\nStart training with balanced data:\n")
    with mlflow.start_run(run_name="smote_data") as smote_run:
        smote_model = smote_model.fit(
            new_train[feature_cols],
            new_train[TARGET_COL],
            eval_set=[(test[feature_cols], test[TARGET_COL])],
            eval_metric="auc",
            callbacks=[
                lgb.log_evaluation(10),
            ],
        )
    

トレーニングの特徴量の重要度を決定する

  1. 不均衡なデータセットでトレーニングしたモデルの特徴量の重要度を決定します。

    with mlflow.start_run(run_id=raw_run.info.run_id):
        importance = lgb.plot_importance(
            model, title="Feature importance for imbalanced data"
        )
        importance.figure.savefig("feauture_importance.png")
        mlflow.log_figure(importance.figure, "feature_importance.png")
    
  2. 均衡なデータセットでトレーニングしたモデルの特徴量の重要度を決定します。 SMOTE によって、バランスの取れたデータが生成されました:

    with mlflow.start_run(run_id=smote_run.info.run_id):
        smote_importance = lgb.plot_importance(
            smote_model, title="Feature importance for balanced (via SMOTE) data"
        )
        smote_importance.figure.savefig("feauture_importance_smote.png")
        mlflow.log_figure(smote_importance.figure, "feauture_importance_smote.png")
    

不均衡なデータセットを使用してモデルをトレーニングするには、バランスの取れたデータセットでトレーニングされたモデルと比較すると、重要な特徴に大きな違いがあります。

モデルを評価する

ここでは、トレーニング済みの 2 つのモデルを評価します:

  • 生の不均衡なデータに対してトレーニング済みの model
  • バランスの取れたデータに対してトレーニング済みの smote_model

コンピューティング モデルのメトリック

  1. 予測を実行し、予測結果を Spark DataFrame に変換する prediction_to_spark 関数を定義します。 後で SynapseML を使用して、予測結果のモデル統計を計算できます。

    from pyspark.sql.functions import col
    from pyspark.sql.types import IntegerType, DoubleType
    
    def prediction_to_spark(model, test):
        predictions = model.predict(test[feature_cols], num_iteration=model.best_iteration_)
        predictions = tuple(zip(test[TARGET_COL].tolist(), predictions.tolist()))
        dataColumns = [TARGET_COL, "prediction"]
        predictions = (
            spark.createDataFrame(data=predictions, schema=dataColumns)
            .withColumn(TARGET_COL, col(TARGET_COL).cast(IntegerType()))
            .withColumn("prediction", col("prediction").cast(DoubleType()))
        )
    
        return predictions
    
  2. 関数 prediction_to_spark を使って、2 つのモデル modelsmote_model を使った予測を実行します。

    predictions = prediction_to_spark(model, test)
    smote_predictions = prediction_to_spark(smote_model, test)
    predictions.limit(10).toPandas()
    
  3. 2 つのモデルのメトリックを計算します。

    from synapse.ml.train import ComputeModelStatistics
    
    metrics = ComputeModelStatistics(
        evaluationMetric="classification", labelCol=TARGET_COL, scoredLabelsCol="prediction"
    ).transform(predictions)
    
    smote_metrics = ComputeModelStatistics(
        evaluationMetric="classification", labelCol=TARGET_COL, scoredLabelsCol="prediction"
    ).transform(smote_predictions)
    display(metrics)
    

混同行列を使用してモデルのパフォーマンスを評価する

混同行列 には、次の数が表示されます

  • 真陽性 (TP)
  • 真陰性 (TN)
  • 偽陽性 (FP)
  • 偽陰性 (FN)

テスト データでスコア付けされたときにモデルによって生成される。 二項分類の場合は、このモデルは 2x2 混同行列を返します マルチクラス分類の場合、このモデルは nxn 混同行列を返し、そこでは n はクラスの数です。

  1. 混同行列を使って、テスト データに対するトレーニング済み機械学習モデルのパフォーマンスを集計します。

    # Collect confusion matrix values
    cm = metrics.select("confusion_matrix").collect()[0][0].toArray()
    smote_cm = smote_metrics.select("confusion_matrix").collect()[0][0].toArray()
    print(cm)
    
  2. (均衡なデータでトレーニングされた) smote_model の予測の混同行列をプロットします。

    # Plot the confusion matrix
    import seaborn as sns
    
    def plot(cm):
        """
        Plot the confusion matrix.
        """
        sns.set(rc={"figure.figsize": (5, 3.5)})
        ax = sns.heatmap(cm, annot=True, fmt=".20g")
        ax.set_title("Confusion Matrix")
        ax.set_xlabel("Predicted label")
        ax.set_ylabel("True label")
        return ax
    
    with mlflow.start_run(run_id=smote_run.info.run_id):
        ax = plot(smote_cm)
        mlflow.log_figure(ax.figure, "ConfusionMatrix.png")
    
  3. (生の不均衡なデータでトレーニングされた) model の予測の混同行列をプロットします。

    with mlflow.start_run(run_id=raw_run.info.run_id):
        ax = plot(cm)
        mlflow.log_figure(ax.figure, "ConfusionMatrix.png")
    

AUC-ROC および AUPRC メジャーを使用してモデルのパフォーマンスを評価する

受信機動作特性曲線下領域 (AUC-ROC) 測定は、二項分類器のパフォーマンスを評価します。 AUC-ROC グラフは、真陽性率 (TPR) と偽陽性率 (FPR) のトレードオフを視覚化します。

場合によっては、Precision-Recall 曲線の下の面積 (AUPRC) メジャーに基づいて分類子を評価する方が適切です。 AUPRC 曲線は、これらの割合を組み合わせたものです:

  • 精度、または陽性適中率 (PPV)
  • 再現率、または TPR

AUC-ROC および AUPRC メジャーを使ってパフォーマンスを評価する

  1. AUC-ROC メジャーと AUPRC メジャーを返す関数を定義します。

    from pyspark.ml.evaluation import BinaryClassificationEvaluator
    
    def evaluate(predictions):
        """
        Evaluate the model by computing AUROC and AUPRC with the predictions.
        """
    
        # Initialize the binary evaluator
        evaluator = BinaryClassificationEvaluator(rawPredictionCol="prediction", labelCol=TARGET_COL)
    
        _evaluator = lambda metric: evaluator.setMetricName(metric).evaluate(predictions)
    
        # Calculate AUROC, baseline 0.5
        auroc = _evaluator("areaUnderROC")
        print(f"The AUROC is: {auroc:.4f}")
    
        # Calculate AUPRC, baseline positive rate (0.172% in the data)
        auprc = _evaluator("areaUnderPR")
        print(f"The AUPRC is: {auprc:.4f}")
    
        return auroc, auprc    
    
  2. 不均衡なデータでトレーニングしたモデルの AUC-ROC メトリックと AUPRC メトリックをログ記録します。

    with mlflow.start_run(run_id=raw_run.info.run_id):
        auroc, auprc = evaluate(predictions)
        mlflow.log_metrics({"AUPRC": auprc, "AUROC": auroc})
        mlflow.log_params({"Data_Enhancement": "None", "DATA_FILE": DATA_FILE})
    
  3. 均衡なデータでトレーニングしたモデルの AUC-ROC メトリックと AUPRC メトリックをログ記録します。

    with mlflow.start_run(run_id=smote_run.info.run_id):
        auroc, auprc = evaluate(smote_predictions)
        mlflow.log_metrics({"AUPRC": auprc, "AUROC": auroc})
        mlflow.log_params({"Data_Enhancement": "SMOTE", "DATA_FILE": DATA_FILE})
    

バランスデータでトレーニングされたモデルは、不均衡なデータに対してトレーニングされたモデルと比較して、より高い AUC-ROC 値と AUPRC 値を返します。 これらのメジャーに基づいて、SMOTE は、不均衡の高いデータを操作する場合にモデルのパフォーマンスを向上させる効果的な手法であると考えられます。

次の図に示すように、あらゆる実験はそれぞれの名前と共にログされます。 ワークスペースで実験のパラメータとパフォーマンス メトリックを追跡できます。

Screenshot of the tracked experiment.

この画像は、バランスの取れたデータセット (バージョン 2) でトレーニングされたモデルのパフォーマンス メトリックも示しています。

Screenshot of logged model performance metrics and model parameters.

バージョン 1 を選択すると、不均衡なデータセットでトレーニングされたモデルのメトリックを確認できます。 メトリックを比較すると、均衡なデータセットでトレーニングしたモデルに対して AUROC の方が高いです。 これらの結果は、このモデルが 0 クラスを 0 として、1 クラスを 1 として正しく予測するうえで優れていることを示しています。

手順 5: モデルを登録する

MLflow を使って 2 つのモデルを登録します。

# Register the model
registered_model_name = f"{EXPERIMENT_NAME}-lightgbm"

raw_model_uri = "runs:/{}/model".format(raw_run.info.run_id)
mlflow.register_model(raw_model_uri, registered_model_name)

smote_model_uri = "runs:/{}/model".format(smote_run.info.run_id)
mlflow.register_model(smote_model_uri, registered_model_name)

手順 6: 予測結果を保存する

Microsoft Fabric では、ユーザーが PREDICT スケーラブル関数を使って機械学習モデルを運用化することができます。 この関数は、任意のコンピューティング エンジンでのバッチ スコアリング (またはバッチ推論) をサポートしています。

Microsoft Fabric ノートブックから、またはモデルの項目ページから、直接バッチ予測を生成できます。 PREDICT の詳細については、「Microsoft Fabric での PREDICT を使用したモデル スコアリング」を参照してください。

  1. バッチ スコアリングのためにパフォーマンスの高いモデル (バージョン 2) を読み込み、予測結果を生成します:

    from synapse.ml.predict import MLFlowTransformer
    
    spark.conf.set("spark.synapse.ml.predict.enabled", "true")
    
    model = MLFlowTransformer(
        inputCols=feature_cols,
        outputCol="prediction",
        modelName=f"{EXPERIMENT_NAME}-lightgbm",
        modelVersion=2,
    )
    
    test_spark = spark.createDataFrame(data=test, schema=test.columns.to_list())
    
    batch_predictions = model.transform(test_spark)
    
  2. 予測をレイクハウス保存する:

    # Save the predictions to the lakehouse
    batch_predictions.write.format("delta").mode("overwrite").save(f"{DATA_FOLDER}/predictions/batch_predictions")