使用 SynapseML 生成模型

本文介绍如何在Microsoft Fabric笔记本中使用 SynapseML 生成机器学习模型。 你创建了一个训练管道,使用文本特征提取和 LightGBM 回归根据评论文本预测书籍评分。 你还将了解如何使用 Foundry 工具进行预生成情绪分析。

  • 创建 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 (审阅内容)。

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 个测试行,其中包含两列: 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

预测测试数据的输出

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)

输出列出了四列(rating、、 textfeaturesprediction和大约 200 行。 prediction 列包含模型预测的评分,且以浮点数形式表示。 将其与实际 rating 列进行比较,以评估模型性能。

(可选)使用 Foundry 工具进行情绪分析

如果要分析书评的情绪,可以使用 SynapseML 与 Foundry 工具的集成。 此步骤使用预生成 TextSentiment 模型对文本情绪进行分类,这与前面的步骤中的分级预测不同。

Important

此步骤需要存储在Azure 密钥保管库中的 Foundry Tools 密钥。 如果跳过了这些先决条件,请先完成这些先决条件,或跳过本部分。

运行以下代码,并进行下述替换:

  • <your-secret-name> 替换为 密钥保管库 中的 Foundry Tools 密钥机密的名称。
  • <your-key-vault-name> 替换为Azure 密钥保管库实例的名称。
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)

注释

如果 Foundry Tools 资源位于其他Azure区域(例如,setLocation"westus2"),请更新 "westeurope" 值。

验证: 运行以下单元格以确认情绪分析已完成:

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

输出显示三列(rating、、textsentiment)。 sentiment列包含结构化结果,并为每条评价标注了诸如positivenegativeneutralmixed之类的标签。

故障排除

問题 原因 解决方案
JAVA_GATEWAY_EXITED 创建 SparkSession 时出错 在Fabric笔记本外运行代码 在预配置 Spark 的Fabric笔记本中运行此代码。 不要在没有 Spark 安装的情况下在本地运行。
Could not find <secret> in keyvault <vault> 密钥保管库名称或机密名称不正确,或者笔记本标识缺少访问权限 验证名称是否完全匹配。 在 Azure 门户中,确认 Fabric 工作区身份对 密钥保管库 机密拥有 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 存储 URL。
Foundry Tools 返回 401 或 403 无效或过期的订阅密钥 在 Azure 门户中的 Foundry Tools 资源Keys 和 Endpoint 部分下生成新密钥。 更新 密钥保管库 机密。
setLocation 返回 404 区域不匹配 设置位置以匹配已创建 Foundry Tools 资源的Azure区域。

清理资源

如果为可选的 Foundry 工具步骤创建了Azure资源,并且不再需要它们,请将其删除以避免产生费用:

  1. 在Azure门户中,删除 Foundry Tools 多服务资源。
  2. 在Azure门户中,删除密钥保管库实例。
  3. 在Fabric工作区中,如果不再需要测试笔记本,请将其删除。