教學課程:Power BI 整合 - 使用 Jupyter Notebook 建立預測模型 (第 1 部分,共 2 部分)

適用於:Python SDK azureml 第 1 版

在本教學課程的第 1 部分中,您會使用 Jupyter Notebook 中的程式碼來訓練和部署預測性機器學習模型。 您也會建立評分指令碼來定義模型的輸入和輸出架構,以便整合到 Power BI 中。 在第 2 部分中,您會使用模型來預測 Microsoft Power BI 中的結果。

在本教學課程中,您:

  • 建立 Jupyter Notebook。
  • 建立 Azure Machine Learning 計算執行個體。
  • 使用 scikit-learn 訓練迴歸模型。
  • 寫入評分指令碼來定義輸入和輸出,以便與 Microsoft Power BI 輕鬆整合。
  • 將模型部署到即時評分端點。

先決條件

  • Azure 訂用帳戶。 如果您沒有訂用帳戶,可以使用免費試用
  • Azure Machine Learning 工作區。 若您尚未擁有工作區,請參閱建立工作區資源
  • Python 語言和機器學習工作流程的簡介知識。

建立筆記本和計算

Azure Machine Learning Studio 首頁中,選取 [新建] > [筆記本]:

顯示如何建立筆記本的螢幕擷取畫面。

建立新檔案頁面:

  1. 為您的筆記本命名 (例如 my_model_notebook)。
  2. 檔案類型變更為筆記本
  3. 選取 [建立]。

接下來,若要執行程式碼資料格,請建立計算執行個體並附加至您的筆記本。 請選取筆記本頂端的加號圖示開始此作業:

顯示如何建立計算執行個體的螢幕擷取畫面。

建立計算執行個體頁面上:

  1. 選擇 CPU 虛擬機器大小。 在本教學課程中,您可以選擇具有 2 個核心和 14 GB RAM 的 Standard_D11_v2
  2. 選取 [下一步] 。
  3. 設定頁面上,提供有效的計算名稱。 有效的字元為大寫和小寫字母、數字和連字號 (-)。
  4. 選取 [建立]。

您可能會在筆記本中注意到計算旁的圓形已變成青色。 顏色變更表示正在建立計算執行個體:

顯示計算正在建立的螢幕擷取畫面。

注意

計算執行個體可能需要 2 到 4 分鐘才能完成佈建。

佈建計算之後,您就可以使用筆記本來執行程式碼資料格。 例如,您可以在資料格中輸入下列程式碼:

import numpy as np

np.sin(3)

接著選取 Shift + Enter (或選取 Control + Enter,或選取資料格旁邊的 [播放] 按鈕)。 您應該會看見下列輸出:

顯示資料格輸出的螢幕擷取畫面。

您現在已準備好建置 Machine Learning 模型了。

使用 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 Machine Learning Studio 中檢視模型。 在左側功能表中,選取 [模型]:

顯示如何檢視模型的螢幕擷取畫面。

定義評分指令碼

部署要整合到 Power BI 的模型時,您必須定義 Python「評分指令碼」和自訂環境。 評分指令碼包含兩個函式:

  • 當服務啟動時,就會執行 init() 函式。 此函式會載入模型 (模型會從模型登錄中自動下載) 並將其還原序列化。
  • 當服務的呼叫包含需要計分的輸入資料時,就會執行 run(data) 函式。

注意

下方程式碼中的 Python 裝飾項目會定義輸入和輸出資料的結構描述,這對於 Microsoft Power BI 整合來說很重要。

請將下列程式碼複製並貼到您筆記本中的新「程式碼資料格」。 下列程式碼片段具有資料格魔術功能,會將程式碼寫入名為 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 Machine Learning Studio 中檢視服務。 在左側功能表中,選取 [端點]:

顯示如何檢視服務的螢幕擷取畫面。

建議您測試 Web 服務以確保如預期般運作。 若要傳回筆記本,請在 Azure Machine Learning Studio 的左側功能表中,選取 [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 報表使用此模型。