SynapseML を使用したモデルの構築

この記事では、Microsoft Fabric ノートブックで SynapseML を使用して機械学習モデルを構築する方法について説明します。 テキスト特徴付けと LightGBM 回帰を使用して、レビュー テキストから書籍の評価を予測するトレーニング パイプラインを作成します。 また、Foundry Tools を使用して事前構築済みのセンチメント分析を行う方法についても説明します。

  • Fabric ノートブックを作成し、レイクハウスをアタッチする
  • ライブラリのインポートとデータの読み込み
  • テキストの特徴量化と LightGBM 回帰パイプラインを構築し、学習する
  • 予測の生成
  • (省略可能)Foundry Tools のセンチメント分析を実行する

前提条件

環境を設定する

ノートブックで SynapseML ライブラリをインポートし、Spark セッションを初期化します。

from pyspark.sql import SparkSession
from synapse.ml.core.platform import *

spark = SparkSession.builder.getOrCreate()

検証: 次のセルを実行して、Spark が実行されていることを確認します。

print(f"Spark version: {spark.version}")

出力には Spark のバージョン番号が表示されます。 バージョン3.4以降であることが想定されています。 正確なバージョンは、Fabric ランタイムによって異なります。

データセットを読み込む

書籍レビュー データセットを読み込み、トレーニング セットとテスト セットに分割します。 データセットには、 rating (整数 1 から 5) と text (コンテンツの確認) の 2 つの列が含まれています。

train, test = (
    spark.read.parquet(
        "wasbs://publicwasb@mmlspark.blob.core.windows.net/BookReviewsFromAmazon10K.parquet"
    )
    .limit(1000)
    .cache()
    .randomSplit([0.8, 0.2])
)

display(train)

検証: 次のセルを実行して、正しく読み込まれたデータを確認します。

print(f"Training rows: {train.count()}, Test rows: {test.count()}")
print(f"Columns: {train.columns}")
train.printSchema()

出力には、約 800 のトレーニング行と 200 のテスト行が表示され、2 つの列 ( rating (整数) と text (文字列) が表示されます。 randomSplitは非決定論的であるため、正確な行数は異なります。

トレーニングのパイプラインを作成する

TextFeaturizerを使用してレビュー テキストを特徴付け、評価をLightGBMRegressorで予測するパイプラインを作成します。

from pyspark.ml import Pipeline
from synapse.ml.featurize.text import TextFeaturizer
from synapse.ml.lightgbm import LightGBMRegressor

model = Pipeline(
    stages=[
        TextFeaturizer(inputCol="text", outputCol="features"),
        LightGBMRegressor(featuresCol="features", labelCol="rating", dataTransferMode="bulk")
    ]
).fit(train)

検証: 次のセルを実行して、パイプラインのトレーニングを確認します。

print(f"Pipeline stages: {len(model.stages)}")
print(f"Stage 1: {type(model.stages[0]).__name__}")
print(f"Stage 2: {type(model.stages[1]).__name__}")

出力には、 TextFeaturizerModelLightGBMRegressionModelの 2 つのパイプライン ステージが表示されます。

テスト データの出力を予測する

モデルの transform メソッドを呼び出して、テスト データの評価を予測し、結果を表示します。

predictions = model.transform(test)
display(predictions)

検証: 次のセルを実行して、予測が生成されたことを確認します。

print(f"Prediction columns: {predictions.columns}")
print(f"Prediction count: {predictions.count()}")
predictions.select("rating", "prediction").show(5)

出力には、4 つの列 (ratingtextfeaturesprediction) と約 200 行が一覧表示されます。 prediction列には、モデルの予測された評価が float として含まれています。 モデルのパフォーマンスを評価するには、実際の rating 列と比較します。

(任意)Foundry Tools を使用して感情分析を行う

書籍レビューのセンチメントを分析する場合は、SynapseML と Foundry Tools の統合を使用できます。 この手順では、事前構築済みの TextSentiment モデルを使用してテキストセンチメントを分類します。これは、前の手順の評価予測とは異なるタスクです。

Important

この手順には、Azure Key Vaultに格納されている Foundry Tools キーが必要です。 これらの前提条件をスキップした場合は、最初にそれらを完了するか、このセクションをスキップします。

以下の置換を行って、次のコードを実行します。

  • <your-secret-name> を、Key Vaultの Foundry Tools キー シークレットの名前に置き換えます。
  • <your-key-vault-name> を、Azure Key Vault インスタンスの名前に置き換えます。
from synapse.ml.services import TextSentiment
from synapse.ml.core.platform import find_secret

sentiment_model = TextSentiment(
    textCol="text",
    outputCol="sentiment",
    subscriptionKey=find_secret("<your-secret-name>", "<your-key-vault-name>")
).setLocation("eastus")

sentiment_results = sentiment_model.transform(test)
display(sentiment_results)

Note

Foundry Tools リソースが別のAzureリージョン (たとえば、setLocation"westus2") にある場合は、"westeurope" 値を更新します。

検証: 次のセルを実行して、感情分析が完了したことを確認します。

print(f"Sentiment columns: {sentiment_results.columns}")
sentiment_results.select("text", "sentiment").show(3, truncate=50)

出力には、3 つの列 (ratingtextsentiment) が表示されます。 sentiment列には、各レビューのpositivenegativeneutralmixedなどのラベルを含む構造化された結果が含まれています。

Troubleshooting

問題点 原因 Resolution
JAVA_GATEWAY_EXITED SparkSession の作成時にエラーが発生する Fabric ノートブックの外部でコードを実行する Spark が事前構成されているFabric ノートブックでこのコードを実行します。 Spark をインストールせずにローカルで実行しないでください。
Could not find <secret> in keyvault <vault> Key Vault名またはシークレット名が正しくないか、ノートブック ID にアクセスできません 名前が正確に一致するかどうかを確認します。 Azure ポータルで、Fabric ワークスペース ID に、Key Vault シークレットに対する Get アクセス許可があることを確認します。
TextFeaturizer 空の機能を返します 入力テキスト列が null または空です null 値を確認する: train.filter(train.text.isNull()).count() - トレーニング前に null を削除します。
randomSplit 予期しない行数を返します Spark のランダム分割は非決定論的です これは予期される動作です。 再現性のためにシードを設定します。 .randomSplit([0.8, 0.2], seed=42)
AnalysisException: Path does not exist サンプル データ BLOB へのアクセスに関するネットワークの問題 ネットワーク接続を確認します。 Fabricで、ワークスペースが外部Azure Blob Storage URL にアクセスできることを確認します。
Foundry Tools は 401 または 403 を返します 無効または期限切れのサブスクリプション キー Azure ポータルの Foundry Tools リソース Keys と Endpoint セクションで新しいキーを生成します。 Key Vault シークレットを更新します。
setLocation 404 を返します リージョンの不一致 Foundry Tools リソースを作成したAzureリージョンと一致するように場所を設定します。

リソースをクリーンアップする

オプションの Foundry Tools ステップAzureリソースを作成し、不要になった場合は、課金されないように削除します。

  1. Azure ポータルで、Foundry Tools マルチサービス リソースを削除します。
  2. Azure ポータルで、Key Vault インスタンスを削除します。
  3. Fabric ワークスペースで、不要になったテスト ノートブックを削除します。