使用Jupyter筆記型電腦建立配方

本教學課程將涵蓋兩個主要部分。 首先,您將使用中的範本建立機器學習模型 JupyterLab Notebook。 接下來,您將練習將筆記本移至內部的配方工作流 JupyterLab 程,以在內部建立配方 Data Science Workspace。

引入的概念:

  • 方式: 配方是Adobe的模型規格術語,是代表特定機器學習、AI演算法或整合演算法、處理邏輯和設定的頂層容器,用來建立並執行已訓練的模型,進而協助解決特定的商業問題。
  • 型號: 模型是機器學習方式的實例,使用歷史資料和配置進行訓練,以針對業務使用案例進行解決。
  • 培訓: 培訓是學習模式和從標籤資料獲得見解的過程。
  • 計分: 計分是使用訓練好的模型,從資料產生見解的程式。

開始使用筆記 JupyterLab 本環境

從頭開始建立配方可在內部完成 Data Science Workspace。 若要開始,請導覽至 Adobe Experience Platform ,然後按一下左側 的「筆記型電腦 」標籤。 從中選擇「方式產生器」範本,以建立新的筆記本 JupyterLab Launcher。

Recipe Builder 筆記型電腦可讓您在筆記型電腦中執行訓練和計分。 這可讓您在針對訓練和計分資料執行 train() 實驗 score() 時,靈活地變更其和方法。 一旦您對訓練和計分的輸出感到滿意,就可以建立配方,以便使用筆記型電腦, Data Science Workspace 將配方功能內建在Recipe Builder筆記型電腦上。

注意

Recipe Builder筆記型電腦支援使用所有檔案格式,但目前「建立方式」功能僅支援 Python。

當您從啟動器按一下Recipe Builder筆記型電腦時,就會在標籤中開啟筆記型電腦。 筆記本中使用的模板是Python Retail Sales Forecasting Recipe,也可以在此公共儲存庫 中找到

您會注意到,在工具列中有三個額外的動作,即 訓練分數​和 建立方式。 這些圖示只會出現在 Recipe Builder筆記本中 。 在筆記型電腦中建立配方後,有關這 些動作的詳細資訊,請參閱訓練與計分區

編輯配方檔案

若要編輯配方檔案,請導覽至Jupyter中與檔案路徑對應的儲存格。 例如,如果您想要變更,請 evaluator.py尋找 %%writefile demo-recipe/evaluator.py

開始對儲存格進行必要的變更,完成後,只要執行儲存格即可。 命 %%writefile filename.py 令將單元格的內容寫入 filename.py。 您必須手動為每個具有更改的檔案運行單元格。

注意

如果適用,您應手動執行儲存格。

開始使用Recipe Builder筆記型電腦

現在您已瞭解筆記型電腦環境的基 JupyterLab 本功能,可以開始檢視構成機器學習模型配方的檔案。 我們將討論的檔案如下所示:

需求檔案

需求檔案可用來宣告您想要在配方中使用的其他程式庫。 如果存在相依性,可以指定版本號。 若要尋找其他資料庫,請 造訪anaconda.org。 若要瞭解如何設定需求檔案的格式,請造 訪Conda。 已使用的主要程式庫清單包括:

python=3.6.7
scikit-learn
pandas
numpy
data_access_sdk_python
注意

您新增的程式庫或特定版本可能與上述程式庫不相容。 此外,如果您選擇手動建立環境檔案,則不 name 允許覆蓋該欄位。

配置檔案

配置檔案和 training.confscoring.conf於指定要用於培訓和計分以及添加超參數的資料集。 培訓和計分有不同的配置。

使用者在執行訓練和計分之前,必須填入下列變數:

  • trainingDataSetId
  • ACP_DSW_TRAINING_XDM_SCHEMA
  • scoringDataSetId
  • ACP_DSW_SCORING_RESULTS_XDM_SCHEMA
  • scoringResultsDataSetId

若要尋找資料集和結構ID,請前往左側導覽列(資料夾圖示下)筆記型電腦中的資料標籤。

Adobe Experience Platform的「架構」和「資料集 」標籤下 ,可找到相 同的資訊

預設情況下,在訪問資料時會為您設定以下配置參數:

  • ML_FRAMEWORK_IMS_USER_CLIENT_ID
  • ML_FRAMEWORK_IMS_TOKEN
  • ML_FRAMEWORK_IMS_ML_TOKEN
  • ML_FRAMEWORK_IMS_TENANT_ID

訓練資料載入器

訓練資料載入器的目的,是執行個體化用於建立機器學習模型的資料。 通常,培訓資料載入器將完成兩項工作:

  • 從 Platform
  • 資料準備與功能工程

以下兩節將重新載入資料和資料準備。

載入資料

這個步驟使用 熊貓資料框。 您可使用SDK( Adobe Experience Platform )從檔案載入資料,或使用熊貓或功能從外部來源 Platform 載入platform_sdk read_csv() read_json() 資料。

注意

在Recipe Builder筆記型電腦中,資料會透過資料載入器 platform_sdk 載入。

Platform SDK

如需有關使用資料載入器的深入教 platform_sdk 學課程,請造訪 Platform SDK指南。 本教學課程提供有關建立驗證、基本資料讀取和基本資料寫入的資訊。

外部來源

本節將說明如何將JSON或CSV檔案匯入至Apcotes物件。 熊貓圖書館的官方檔案可在這裡找到:

首先,以下是匯入CSV檔案的範例。 引 data 數是CSV檔案的路徑。 此變數是從上一節 configProperties 中匯 入的

df = pd.read_csv(data)

您也可以從JSON檔案匯入。 引 data 數是CSV檔案的路徑。 此變數是從上一節 configProperties 中匯 入的

df = pd.read_json(data)

現在,您的資料已位於dataframe物件中,可在下一節中加以分 析和處理

從平台SDK

您可以使用平台SDK載入資料。 您可加入下列行,將程式庫匯入頁面頂端:

from platform_sdk.dataset_reader import DatasetReader

然後,利用 load() 該方法從配置()檔案中 trainingDataSetId 的集合中獲取訓練資料recipe.conf集。

def load(config_properties):
    print("Training Data Load Start")

    #########################################
    # Load Data
    #########################################    
    client_context = get_client_context(config_properties)
    
    dataset_reader = DatasetReader(client_context, config_properties['trainingDataSetId'])
    
    timeframe = config_properties.get("timeframe")
    tenant_id = config_properties.get("tenant_id")
注意

如「設定檔 案」區段中所述,當您使用下列方式從Experience Platform存取資料時,會為您設定下列設定參數 client_context:

  • ML_FRAMEWORK_IMS_USER_CLIENT_ID
  • ML_FRAMEWORK_IMS_TOKEN
  • ML_FRAMEWORK_IMS_ML_TOKEN
  • ML_FRAMEWORK_IMS_TENANT_ID

既然您擁有了資料,您就可以從資料準備和功能工程開始。

資料準備與功能工程

資料載入後,資料會進行準備,然後分割至資料 trainval 和。 范常式式碼如下:

#########################################
# Data Preparation/Feature Engineering
#########################################
dataframe.date = pd.to_datetime(dataframe.date)
dataframe['week'] = dataframe.date.dt.week
dataframe['year'] = dataframe.date.dt.year

dataframe = pd.concat([dataframe, pd.get_dummies(dataframe['storeType'])], axis=1)
dataframe.drop('storeType', axis=1, inplace=True)
dataframe['isHoliday'] = dataframe['isHoliday'].astype(int)

dataframe['weeklySalesAhead'] = dataframe.shift(-45)['weeklySales']
dataframe['weeklySalesLag'] = dataframe.shift(45)['weeklySales']
dataframe['weeklySalesDiff'] = (dataframe['weeklySales'] - dataframe['weeklySalesLag']) / dataframe['weeklySalesLag']
dataframe.dropna(0, inplace=True)

dataframe = dataframe.set_index(dataframe.date)
dataframe.drop('date', axis=1, inplace=True) 

在此範例中,對原始資料集有5項動作:

  • 新增 week 和欄 year
  • 轉換 storeType 為指示符變數
  • 轉換 isHoliday 為數值變數
  • 抵銷 weeklySales 以獲得未來和過去的銷售價值
  • 依日期分割資料至 train 和資 val

首先, week 建立 year 列和列,並將原始列 date 轉換為日期時 Python 間 。 周值和年值從日期時間對象中提取。

接著, storeType 會轉換為代表三種不同商店類型(ABC)的三欄。 每個值都包含一個布爾值,以狀態 storeType 為true。 該 storeType 列將被刪除。

同樣地, weeklySales 將布爾值 isHoliday 更改為數字表示,一或零。

此資料會在資料集和資 train 料集 val 之間分割。

load() 數應以和資料集 trainval 輸出。

計分資料載入器

載入計分資料的程式類似於在函式中載入訓練資 split() 料。 我們使用Data Access SDK來載入檔案中 scoringDataSetId 的資料 recipe.conf

def load(config_properties):

    print("Scoring Data Load Start")

    #########################################
    # Load Data
    #########################################
    client_context = get_client_context(config_properties)

    dataset_reader = DatasetReader(client_context, config_properties['scoringDataSetId'])
    timeframe = config_properties.get("timeframe")
    tenant_id = config_properties.get("tenant_id")

在載入資料後,完成資料準備和特徵工程。

    #########################################
    # Data Preparation/Feature Engineering
    #########################################
    if '_id' in dataframe.columns:
        #Rename columns to strip tenantId
        dataframe = dataframe.rename(columns = lambda x : str(x)[str(x).find('.')+1:])
        #Drop id, eventType and timestamp
        dataframe.drop(['_id', 'eventType', 'timestamp'], axis=1, inplace=True)

    dataframe.date = pd.to_datetime(dataframe.date)
    dataframe['week'] = dataframe.date.dt.week
    dataframe['year'] = dataframe.date.dt.year

    dataframe = pd.concat([dataframe, pd.get_dummies(dataframe['storeType'])], axis=1)
    dataframe.drop('storeType', axis=1, inplace=True)
    dataframe['isHoliday'] = dataframe['isHoliday'].astype(int)

    dataframe['weeklySalesAhead'] = dataframe.shift(-45)['weeklySales']
    dataframe['weeklySalesLag'] = dataframe.shift(45)['weeklySales']
    dataframe['weeklySalesDiff'] = (dataframe['weeklySales'] - dataframe['weeklySalesLag']) / dataframe['weeklySalesLag']
    dataframe.dropna(0, inplace=True)

    dataframe = dataframe.set_index(dataframe.date)
    dataframe.drop('date', axis=1, inplace=True)

    print("Scoring Data Load Finish")

    return dataframe

由於我們模型的目的是預測未來每週銷售量,因此您需要建立評分資料集來評估模型預測的成效。

此Recipe Builder筆記型電腦可將我們每週7天的銷售額提前抵銷。 請注意,每週有45個商店的測量值,因此您可以將 weeklySales 45個資料集的值向前移入新的欄位,稱為 weeklySalesAhead

df['weeklySalesAhead'] = df.shift(-45)['weeklySales']

同樣地,您也可以將45位移 weeklySalesLag 回建立欄。 使用此功能,您也可以計算每週銷售額的差值,並將它們儲存在欄中 weeklySalesDiff

df['weeklySalesLag'] = df.shift(45)['weeklySales']
df['weeklySalesDiff'] = (df['weeklySales'] - df['weeklySalesLag']) / df['weeklySalesLag']

由於您要向前偏移45 weeklySales 個資料集,並向後偏移45個資料集以建立新欄,因此前45個和後45個資料點將有NaN值。 您可以使用函式從資料集中移除這些點, df.dropna() 此函式可移除所有具有NaN值的列。

df.dropna(0, inplace=True)

計分 load() 資料載入器中的函式應以計分資料集作為輸出。

管線檔案

該檔 pipeline.py 案包含訓練和計分的邏輯。

培訓

訓練的目的是使用訓練資料集中的功能和標籤來建立模型。

注意

功能是指機器學習模型用來預測標籤的輸入變數。

功能 train() 應包括訓練模型和返回訓練模型。 scikit-learn使用指南文檔中提供 了一些不同型號的示例

在選擇您的訓練模型後,您會將x和y訓練資料集符合模型,而函式會傳回已訓練的模型。 顯示此情況的範例如下:

def train(configProperties, data):

    print("Train Start")

    #########################################
    # Extract fields from configProperties
    #########################################
    learning_rate = float(configProperties['learning_rate'])
    n_estimators = int(configProperties['n_estimators'])
    max_depth = int(configProperties['max_depth'])


    #########################################
    # Fit model
    #########################################
    X_train = data.drop('weeklySalesAhead', axis=1).values
    y_train = data['weeklySalesAhead'].values

    seed = 1234
    model = GradientBoostingRegressor(learning_rate=learning_rate,
                                      n_estimators=n_estimators,
                                      max_depth=max_depth,
                                      random_state=seed)

    model.fit(X_train, y_train)

    print("Train Complete")

    return model

請注意,視您的應用程式而定,函式中會有引數 GradientBoostingRegressor()xTrainingDataset 應包含您用於訓練的功能,但應 yTrainingDataset 包含您的標籤。

計分

score() 數應包含計分演算法並傳回測量,以指出模型執行的成效。 該函 score() 數使用計分資料集標籤和訓練的模型來生成一組預測特徵。 然後,將這些預測值與計分資料集中的實際特徵進行比較。 在此範例中,函 score() 數使用訓練好的模型,使用計分資料集的標籤來預測特徵。 會傳回預計的功能。

def score(configProperties, data, model):

    print("Score Start")

    X_test = data.drop('weeklySalesAhead', axis=1).values
    y_test = data['weeklySalesAhead'].values
    y_pred = model.predict(X_test)

    data['prediction'] = y_pred
    data = data[['store', 'prediction']].reset_index()
    data['date'] = data['date'].astype(str)

    print("Score Complete")

    return data

求值器檔案

evaluator.py 案包含您如何評估訓練方式以及如何分割訓練資料的邏輯。 在零售銷售範例中,將包含載入和準備培訓資料的邏輯。 我們將詳細介紹以下兩節。

分割資料集

訓練的資料準備階段需要分割資料集以用於訓練和測試。 這 val 些資料在訓練後會隱含使用來評估模型。 此程式與計分不同。

本節將顯示首 split() 先將資料載入到筆記本中,然後通過刪除資料集中不相關的列來清除資料的函式。 在此之後,您將能夠執行功能工程,即從資料中現有的原始功能建立其他相關功能的程式。 此程式的範例如下,以及說明。

函式 split() 如下所示。 參數中提供的資料幀將被拆分為要 train 返回 val 的和變數。

def split(self, configProperties={}, dataframe=None):
    train_start = '2010-02-12'
    train_end = '2012-01-27'
    val_start = '2012-02-03'
    train = dataframe[train_start:train_end]
    val = dataframe[val_start:]

    return train, val

評估訓練好的模型

函式 evaluate() 是在模型訓練後執行,並會傳回量度,以指出模型執行的成效。 此函 evaluate() 數使用測試資料集標籤和訓練模型來預測一組特徵。 然後,將這些預測值與測試資料集中的實際特徵進行比較。 常見的計分演算法包括:

零售 evaluate() 銷售範例中的函式如下所示:

def evaluate(self, data=[], model={}, configProperties={}):
    print ("Evaluation evaluate triggered")
    val = data.drop('weeklySalesAhead', axis=1)
    y_pred = model.predict(val)
    y_actual = data['weeklySalesAhead'].values
    mape = np.mean(np.abs((y_actual - y_pred) / y_actual))
    mae = np.mean(np.abs(y_actual - y_pred))
    rmse = np.sqrt(np.mean((y_actual - y_pred) ** 2))

    metric = [{"name": "MAPE", "value": mape, "valueType": "double"},
                {"name": "MAE", "value": mae, "valueType": "double"},
                {"name": "RMSE", "value": rmse, "valueType": "double"}]

    return metric

請注意,函式會傳回包 metric 含評估度量陣列的物件。 這些量度將用來評估受訓練模型的效能。

資料保護程式檔案

檔案 datasaver.py 包含在測試計 save() 分時儲存預測的函式。 函 save() 數會擷取您的預測,並使用 Experience Platform Catalog API,將資料寫入您 scoringResultsDataSetId 在檔案中指定的 scoring.conf 位置。

此處顯示零售銷售範例配方中使用的範例。 請注意,使用程 DataSetWriter 式庫將資料寫入平台:

from data_access_sdk_python.writer import DataSetWriter

def save(configProperties, prediction):
    print("Datasaver Start")
    print("Setting up Writer")

    catalog_url = "https://platform.adobe.io/data/foundation/catalog"
    ingestion_url = "https://platform.adobe.io/data/foundation/import"

    writer = DataSetWriter(catalog_url=catalog_url,
                           ingestion_url=ingestion_url,
                           client_id=configProperties['ML_FRAMEWORK_IMS_USER_CLIENT_ID'],
                           user_token=configProperties['ML_FRAMEWORK_IMS_TOKEN'],
                           service_token=configProperties['ML_FRAMEWORK_IMS_ML_TOKEN'])

    print("Writer Configured")

    writer.write(data_set_id=configProperties['scoringResultsDataSetId'],
                 dataframe=prediction,
                 ims_org=configProperties['ML_FRAMEWORK_IMS_TENANT_ID'])

    print("Write Done")
    print("Datasaver Finish")
    print(prediction)

訓練與計分

當您變更筆記型電腦並想要訓練配方時,可以按一下列上方的相關按鈕,在儲存格中建立訓練執行。 按一下該按鈕後,培訓指令碼中的命令和輸出日誌將顯示在筆記本中(單元格 evaluator.py 下)。 Conda首先安裝所有相依項,然後開始培訓。

請注意,您必須至少執行一次培訓,才能執行計分。 按一下「執 行計分 」按鈕,將對培訓期間產生的已訓練模型評分。 計分指令碼將出現在下方 datasaver.py

為了進行除錯,如果您想查看隱藏的輸出,請將 debug 其新增至輸出儲存格的結尾,然後重新執行。

建立方式

編輯完配方並滿意培訓/計分輸出後,您可以按右上方導覽中的「建立配方 ​」,從筆記本建立配方。

按下按鈕後,系統會提示您輸入配方名稱。 此名稱代表在上建立的實際方式 Platform。

按「確 」後,您就可以導覽至 Adobe Experience Platform上的新配方。 您可以按一下「檢 視配方 」按鈕,將您帶至「ML模型」下的「配方 」標籤

一旦程式完成,配方將如下所示:

注意
  • 不要刪除任何檔案單元格
  • 不要編輯 %%writefile 檔案儲存格頂端的行
  • 不要同時在不同的筆記本中建立配方

下一步

完成本教學課程後,您就學會如何在Recipe Builder筆記型電腦中建立機器學習模型。 您還學習了如何在筆記型電腦中練習如何將筆記型電腦與配方工作流程結合,以便在其中建立配方 Data Science Workspace。

若要繼續學習如何使用資源,請造 Data Science Workspace訪配方和模 Data Science Workspace 型下拉式清單。

其他資源

以下影片旨在協助您瞭解建立和部署模型。

本頁內容