Tutorial:Power BI 集成 - 使用 Jupyter Notebook 创建预测模型(第 1 部分,共 2 部分)
在本教程的第 1 部分中,你将使用 Jupyter Notebook 中的代码训练和部署预测机器学习模型。 你还将创建一个评分脚本,以定义模型的输入和输出架构来集成到 Power BI。 在第 2 部分中,你将使用该模型来预测 Power BI 中的结果。
在本教程中,你将了解:
- 创建 Jupyter Notebook。
- 创建 Azure 机器学习计算实例。
- 使用 scikit-learn 训练回归模型。
- 编写一个评分脚本,该脚本定义输入和输出,以便轻松集成到 Power BI 中。
- 将模型部署到实时评分终结点。
先决条件
创建笔记本和计算
在 Azure 机器学习工作室主页中,选择“新建”>“笔记本” :
在“创建新文件”页上,执行以下操作:
- 为笔记本命名(例如 my_model_notebook)。
- 将“文件类型”改为“笔记本” 。
- 选择“创建” 。
接下来,若要运行代码单元格,请创建一个计算实例并将其附加到笔记本。 首先选择笔记本顶部的加号图标:
在“创建计算实例”页上,执行以下操作:
- 选择 CPU 虚拟机大小。 对于本教程,可以选择 Standard_D11_v2,其中包含 2 个核心和 14 GB 的 RAM。
- 选择“下一页”。
- 在“配置设置”页上,提供有效的“计算名称” 。 有效字符包括大写字母、小写字母、数字和连字符 (-)。
- 选择“创建” 。
在笔记本中,你可能会注意到“计算”旁边的圆圈变为了蓝绿色。 此颜色更改表明正在创建计算实例:
注意
计算实例可能需要 2 到 4 分钟时间才能完成预配。
预配计算后,可以使用笔记本来运行代码单元格。 例如,在单元格中,可以键入以下代码:
import numpy as np
np.sin(3)
然后按 Shift + Enter(或按 Control + Enter 或选择单元格旁边的“播放”按钮)。 应会看到以下输出:
现在,你可以构建机器学习模型。
使用 scikit-learn 构建模型
在本教程中,将使用糖尿病数据集。 Azure 开放数据集中提供了该数据集。
导入数据
若要导入数据,请复制以下代码并将其粘贴到笔记本中的新“代码单元格”。
from azureml.opendatasets import Diabetes
diabetes = Diabetes.get_tabular_dataset()
X = diabetes.drop_columns("Y")
y = diabetes.keep_columns("Y")
X_df = X.to_pandas_dataframe()
y_df = y.to_pandas_dataframe()
X_df.info()
X_df
pandas 数据帧包含 10 个基线输入变量。 这些变量包括年龄、性别、体重指数、平均血压和六个血清测定值。 y_df
pandas 数据帧是目标变量。 其中包含基线后一年疾病进展的量化度量值。 该数据帧包含 442 条记录。
定型模型
在笔记本中创建新的代码单元格。 然后复制下面的代码并将其粘贴到单元格中。 此代码片段可构造岭回归模型,并使用 Python pickle 格式对其进行序列化。
import joblib
from sklearn.linear_model import Ridge
model = Ridge().fit(X_df,y_df)
joblib.dump(model, 'sklearn_regression_model.pkl')
注册模型
除了模型文件本身的内容之外,注册的模型还将存储元数据。 元数据包括模型说明、标记和框架信息。
在工作区中管理和部署模型时,元数据很有用。 例如,通过使用标记,可以对模型进行分类,并在工作区中列出模型时应用筛选器。 此外,如果使用 scikit-learn 框架标记此模型,则可简化将其部署为 Web 服务的过程。
复制以下代码,然后将其粘贴到笔记本中的新“代码单元格”。
import sklearn
from azureml.core import Workspace
from azureml.core import Model
from azureml.core.resource_configuration import ResourceConfiguration
ws = Workspace.from_config()
model = Model.register(workspace=ws,
model_name='my-sklearn-model', # Name of the registered model in your workspace.
model_path='./sklearn_regression_model.pkl', # Local file to upload and register as a model.
model_framework=Model.Framework.SCIKITLEARN, # Framework used to create the model.
model_framework_version=sklearn.__version__, # Version of scikit-learn used to create the model.
sample_input_dataset=X,
sample_output_dataset=y,
resource_configuration=ResourceConfiguration(cpu=2, memory_in_gb=4),
description='Ridge regression model to predict diabetes progression.',
tags={'area': 'diabetes', 'type': 'regression'})
print('Name:', model.name)
print('Version:', model.version)
你还可以在 Azure 机器学习工作室中查看模型。 在左侧菜单中选择“模型”:
定义评分脚本
部署要集成到 Power BI 的模型时,需要定义 Python 评分脚本和自定义环境。 评分脚本包含两个函数:
- 当服务启动时,
init()
函数将运行。 它会加载模型(从模型注册表自动下载),并对其进行反序列化。 - 当对服务的调用包含需要评分的输入数据时,
run(data)
函数将运行。
注意
下方代码中的 Python 修饰器可定义输入和输出数据的架构,这对于到 Power BI 的集成非常重要。
复制以下代码并将其粘贴到笔记本中的新“代码单元格”。 以下代码片段具有单元格 magic,可将代码写入名为 score.py 的文件中。
%%writefile score.py
import json
import pickle
import numpy as np
import pandas as pd
import os
import joblib
from azureml.core.model import Model
from inference_schema.schema_decorators import input_schema, output_schema
from inference_schema.parameter_types.numpy_parameter_type import NumpyParameterType
from inference_schema.parameter_types.pandas_parameter_type import PandasParameterType
def init():
global model
# Replace filename if needed.
path = os.getenv('AZUREML_MODEL_DIR')
model_path = os.path.join(path, 'sklearn_regression_model.pkl')
# Deserialize the model file back into a sklearn model.
model = joblib.load(model_path)
input_sample = pd.DataFrame(data=[{
"AGE": 5,
"SEX": 2,
"BMI": 3.1,
"BP": 3.1,
"S1": 3.1,
"S2": 3.1,
"S3": 3.1,
"S4": 3.1,
"S5": 3.1,
"S6": 3.1
}])
# This is an integer type sample. Use the data type that reflects the expected result.
output_sample = np.array([0])
# To indicate that we support a variable length of data input,
# set enforce_shape=False
@input_schema('data', PandasParameterType(input_sample))
@output_schema(NumpyParameterType(output_sample))
def run(data):
try:
print("input_data....")
print(data.columns)
print(type(data))
result = model.predict(data)
print("result.....")
print(result)
# You can return any data type, as long as it can be serialized by JSON.
return result.tolist()
except Exception as e:
error = str(e)
return error
定义自定义环境
接下来,定义环境以对模型进行评分。 在环境中,定义评分脚本 (score.py) 所需的 Python 包,例如 pandas 和 scikit-learn。
若要定义环境,请复制以下代码并将其粘贴到笔记本中的新“代码单元格”。
from azureml.core.model import InferenceConfig
from azureml.core import Environment
from azureml.core.conda_dependencies import CondaDependencies
environment = Environment('my-sklearn-environment')
environment.python.conda_dependencies = CondaDependencies.create(pip_packages=[
'azureml-defaults',
'inference-schema[numpy-support]',
'joblib',
'numpy',
'pandas',
'scikit-learn=={}'.format(sklearn.__version__)
])
inference_config = InferenceConfig(entry_script='./score.py',environment=environment)
部署模型
若要部署模型,请复制以下代码并将其粘贴到笔记本中的新“代码单元格”:
service_name = 'my-diabetes-model'
service = Model.deploy(ws, service_name, [model], inference_config, overwrite=True)
service.wait_for_deployment(show_output=True)
注意
该服务可能需要 2 到 4 分钟才能完成部署。
如果服务成功部署,则应会看到以下输出:
Tips: You can try get_logs(): https://aka.ms/debugimage#dockerlog or local deployment: https://aka.ms/debugimage#debug-locally to debug if deployment takes longer than 10 minutes.
Running......................................................................................
Succeeded
ACI service creation operation finished, operation "Succeeded"
你还可以在 Azure 机器学习工作室中查看服务。 在左侧菜单中选择“终结点”:
建议你测试 Web 服务,以确保其按预期运行。 若要返回笔记本,请在 Azure 机器学习工作室中的左侧菜单中,选择“Notebooks”。 然后复制以下代码并将其粘贴到笔记本中的新“代码单元格”以测试服务。
import json
input_payload = json.dumps({
'data': X_df[0:2].values.tolist()
})
output = service.run(input_payload)
print(output)
输出应类似于此 JSON 结构:{'predict': [[205.59], [68.84]]}
。
后续步骤
在本教程中,你已了解如何生成和部署模型,使其可供 Power BI 使用。 在下一部分中,你将了解如何在 Power BI 报表中使用此模型。