8.2模型创作和操作化

在练习8.1中,您生成了为机器学习模型提供支持所需的培训数据。 在本课程中,您将学习如何使用此数据来创作机器学习模型。 在现实世界中,创建数据集和机器学习模型将是一个迭代过程。

登录Adobe Experience Platform的URL是:https://experience.adobe.com/platform

目标

  • 使用笔记本分析培训数据
  • 探索产品Recommendations方法
  • 了解如何创建产品Recommendations方法

8.2.1分析数据

在Jupyter Notebooks中,单击任务栏中的​+​图标,打开​启动器​页面。

DSW

然后您将看到:

DSW

单击启动器上的“Blank(空白)”按钮,打开空白的​Python 3​笔记本。

DSW

然后,你将有一个空的Python 3笔记本。 在继续之前,请为笔记本提供一个描述性名称。 右键单击​Untitled.ipynb​文件,然后单击​重命名

DSW

输入​luma-recommendations-data-exploration.ipynb​作为笔记本的名称,然后按​Enter。 然后,您将拥有:

DSW

加载库

在笔记本的第一个空单元格中单击。

DSW

复制以下代码,并将其粘贴到笔记本的第一个单元格中。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import model_selection, linear_model, tree
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.neighbors import KNeighborsRegressor
import warnings; warnings.simplefilter('ignore')
%matplotlib inline
sns.set()
seed = 1234
inputDataset="--aepRecommendationsInputDatasetId--" # Demo System - Event Dataset for Recommendations Model Input (Global v1.1)
重要

环境变量​aepRecommendationsInputDatasetId​是指在您的Adobe Experience Platform实例中创建的数据集的数据集ID。

aepRecommendationsInputDatasetIdreder是指数据集演示系统的数据集ID — 用于Recommendations模 型输入的事件数据集(全局v1.1)。将代码粘贴到笔记本的第一个单元格中时,会将环境变量替换为该数据集ID。

然后,在单元1中将此内容:

DSW

单击播放按钮以执行此单元格。

DSW

请等到指示器如下所示,然后再继续:

DSW

结果如下所示:

DSW

加载数据

在笔记本的下一个空单元格中单击。

DSW

复制以下代码,并将其粘贴到笔记本的第一个单元格中。

from platform_sdk.dataset_reader import DatasetReader
from datetime import date
dataset_reader = DatasetReader(PLATFORM_SDK_CLIENT_CONTEXT, dataset_id=inputDataset)
df = dataset_reader.limit(100).read()

df.head(20)

然后,您将在该单元格中看到此内容:

DSW

单击播放按钮以执行此单元格。

DSW

执行此单元格可能需要1-2分钟。

请等到指示器如下所示,然后再继续:

DSW

结果是:

DSW

汇总数据

在笔记本的下一个空单元格中单击。

DSW

复制以下代码,并将其粘贴到笔记本的第一个单元格中。

print("You'll see the number of lines and the number of columns:", df.shape)

然后,您将在该单元格中看到此内容:

DSW

单击播放按钮以执行此单元格。

DSW

结果是:

DSW

统计摘要

在笔记本的下一个空单元格中单击。

DSW

复制以下代码,并将其粘贴到笔记本的第一个单元格中。

user_id = '--aepTenantId--.recommendationsInput.ecid'
item_id = '--aepTenantId--.recommendationsInput.productSku'
interaction_type = '--aepTenantId--.interactionType'
timestamp = '--aepTenantId--.timestamp'

然后,您将在该单元格中看到此内容:

DSW

单击播放按钮以执行此单元格。

DSW

然后,在笔记本的下一个空单元格中单击。

DSW

复制以下代码,并将其粘贴到笔记本的第一个单元格中。

df.describe()

然后,您将在该单元格中看到此内容:

DSW

单击播放按钮以执行此单元格。

DSW

结果是:

DSW

按项目ID对项目进行分组

在笔记本的下一个空单元格中单击。

DSW

复制以下代码,并将其粘贴到笔记本的第一个单元格中。

df[[user_id, item_id]].groupby([item_id]).agg(['count'])

然后,您将在该单元格中看到此内容:

DSW

单击播放按钮以执行此单元格。

DSW

结果是:

DSW

8.2.2配方生成器笔记本

Recipe Builder笔记本是我们最新的创新之一,它可模拟您的模型,以自动打包并运行该模型。 笔记本具有多个模板单元格,可将模型代码放入:

  • 通过要求和配置单元格,您可以添加其他库,配置数据集并调整模型的参数
  • 计算器单元格允许您拆分数据并评估模型的性能
  • 利用培训和评分数据加载器单元,可加载培训和评分所需的数据
  • 最后,管道单元格包含培训和打分模型所需的逻辑。

我们简化了操作模型所需的步骤,让您能够大规模培训、评估和评分,然后在Adobe Experience Platform上将其打包到一个无缝流程中。 打包到方法还允许您将相同的代码与不同的数据集一起使用,以便为组织中的不同用例提供支持。 我们的特定用例围绕如何使用推荐模型代码,以便用户在网站上搜索要购买的产品。

在Jupyter Notebooks中,单击任务栏中的​+​图标,打开​启动器​页面。

DSW

然后您将看到:

DSW

单击启动器上的“方法生成器”按钮,打开空白的​方法生成器​笔记本。

DSW

然后,您将拥有一个空白的新“方法生成器”笔记本。 在继续之前,请为笔记本提供一个描述性名称。 右键单击​[Python 3]方法生成器.ipynb​文件,然后单击​重命名

DSW

输入​luma-recommendations-procepy-recipe.ipynb​作为笔记本的名称,然后按​Enter。 然后,您将拥有:

DSW

在此笔记本中,您将执行以下操作:

  • 训练模型
  • 为模型打分
  • 从模型创建方法

让我们详细配置所有步骤。

配置文件

在配方生成器笔记本中向下滚动,直到您看到​配置文件

DSW

现在,您需要更新​培训配置​和​评分配置​的单元格。

培训配置

单击​培训配置​的单元格。

你做任何事之前,请注意!! 无论您做什么,都不要删除或覆盖以​%%writefile​开头的行。 此行是Recipe Builder笔记本的必需行。

%%writefile ~/my-workspace/.recipes/recipe-pt9c03C_w/training.conf

DSW

您还会在同一单元格中看到类似的代码:

{
   "trainingDataSetId": "<replace with training dataset id>",
   "ACP_DSW_TRAINING_XDM_SCHEMA": "<replace with training xdm schema id>",
   "tenantId": "_<tenant_id>", 
   "learning_rate": "0.1",
   "n_estimators": "100",
   "max_depth": "3"
}

将该代码替换为以下代码:

{
   "tenant_id": "--aepTenantId--",
   "trainingDataSetId": "--aepRecommendationsInputDatasetId--",
   "ACP_DSW_TRAINING_XDM_SCHEMA": "https://ns.adobe.com/--aepTenantIdSchema--/schemas/--aepRecommendationsInputSchemaRef--",
   "num_recommendations": "5",
   "sampling_fraction": "0.5"
}
重要

环境变量​aepRecommendationsInputDatasetId​和​aepRecommendationsInputSchemaRef​是指在Adobe Experience Platform实例中创建的数据集的数据集ID。

aepRecommendationsInputDatasetIdreder指向数据集演示系统的数据集ID — 用于Recommendations模型输入的事件数据集(全局v1.1) , aepRecommendationsInputSchemaRefer指向模式演示系统的 ​架构参考ID — 用于Recommendations模型输入的事件架构(全局v1.1) 。将代码粘贴到笔记本的​培训配置​单元格中时,会将环境变量替换为数据集ID和架构参考ID。

现在,您应该在​培训配置​单元格中具有类似的内容:

DSW

评分配置

单击​评分配置​的单元格。

你做任何事之前,请注意!! 无论您做什么,都不要删除或覆盖以​%%writefile​开头的行。 此行是Recipe Builder笔记本的必需行。

%%writefile ~/my-workspace/.recipes/recipe-pt9c03C_w/scoring.conf

DSW

您还会在同一单元格中看到类似的代码:

{
   "scoringDataSetId": "<replace with scoring input dataset id>",
   "scoringResultsDataSetId": "<replace with scoring results dataset id>",
   "ACP_DSW_SCORING_RESULTS_XDM_SCHEMA": "<replace with scoring results xdm schema id>",
   "tenantId": "_<tenant_id>"
}

将该代码替换为以下代码:

{
   "tenant_id": "--aepTenantId--",
   "scoringDataSetId": "--aepRecommendationsInputDatasetId--",
   "scoringResultsDataSetId": "--aepMlPredictionsDatasetId--",
   "ACP_DSW_SCORING_RESULTS_XDM_SCHEMA": "https://ns.adobe.com/--aepTenantIdSchema--/schemas/--aepMlPredictionsSchemaRef--" 
}
重要

环境变量​aepRecommendationsInputDatasetIdaepMlPrectisDatasetId​和​aepMlPrecisationsSchemaRef​是指在Adobe Experience Platform实例中创建的数据集的数据集ID和架构的架构参考ID。

aepRecommendationsInputDatasetIdred指向数据集演示系统的数据集ID — 用于Recommendations模型输入的事件数据集(全局v1.1) , aepMlPrectionsDatasetIdre指向数据集演示系统的数据集ID — 用于ML预测的配置文件数据集(全局v1.1) ​, aepMlPrecessiationSchemaRef向用于模式​的ID架构 — Demo系统模式 ​ML预测(全局v1.1) 。将代码粘贴到笔记本的​Scoring Configuration​单元格中时,会将环境变量替换为数据集ID和架构参考ID。

现在,您应该在​评分配置​单元格中具有类似的内容:

DSW

培训数据加载器文件

在方法生成器笔记本中向下滚动,直到您看到​培训数据加载器文件

DSW

现在,您需要更新​培训数据加载器文件​的代码。

你做任何事之前,请注意!! 无论您做什么,都不要删除或覆盖以​%%writefile​开头的行。 此行是Recipe Builder笔记本的必需行。

DSW

在该单元格中,您会找到类似以下代码:

import pandas as pd
from datetime import datetime, timedelta
from platform_sdk.dataset_reader import DatasetReader
from .utils import get_client_context

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")
    
    if (timeframe is not None):
        date_before = datetime.utcnow().date()
        date_after = date_before - timedelta(minutes=int(timeframe))
        dataframe = dataset_reader.where(dataset_reader[tenant_id + '.date'].gt(str(date_after)).And(dataset_reader[tenant_id + '.date'].lt(str(date_before)))).read()
    else:
        dataframe = dataset_reader.read()

    if '_id' in dataframe.columns:
        #Rename columns to strip tenantId
        dataframe = dataframe.rename(columns = lambda x : str(x)[str(x).find('.')+1:])
        #Drop id and timestamp
        dataframe.drop(['_id', 'timestamp'], axis=1, inplace=True)
    
    #########################################
    # 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)

    print("Training Data Load Finish")
    return dataframe

将该代码(不覆盖​%%writefile​行)替换为以下代码:

import numpy as np
import pandas as pd
from platform_sdk.dataset_reader import DatasetReader
from .utils import get_client_context

def load(configProperties):
    print("Training Data Load Start")
    print(configProperties)
    client_context = get_client_context(configProperties)

    dataset_reader = DatasetReader(client_context, configProperties['trainingDataSetId'])
    df = dataset_reader.read()
    df.head()

    print("Training Data Load Finish")
    return df

现在,您应该在​Training Data Loader File​单元格中具有类似的内容:

DSW

评分数据加载器文件

在方法生成器笔记本中向下滚动,直到您看到​评分数据加载器文件

DSW

现在,您需要更新​评分数据加载器文件​的代码。

你做任何事之前,请注意!! 无论您做什么,都不要删除或覆盖以​%%writefile​开头的行。 此行是Recipe Builder笔记本的必需行。

DSW

在该单元格中,您会找到类似以下代码:

import pandas as pd
from datetime import datetime, timedelta
from .utils import get_client_context
from platform_sdk.dataset_reader import DatasetReader

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")

    if (timeframe is not None):
        date_before = datetime.utcnow().date()
        date_after = date_before - timedelta(minutes=int(timeframe))
        dataframe = dataset_reader.where(dataset_reader[tenant_id + '.date'].gt(str(date_after)).And(dataset_reader[tenant_id + '.date'].lt(str(date_before)))).read()
    else:
        dataframe = dataset_reader.read()
        print(dataframe)

    #########################################
    # 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 and timestamp
        dataframe.drop(['_id', '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

将该代码(不覆盖​%%writefile​行)替换为以下代码:

import numpy as np
import pandas as pd
from platform_sdk.dataset_reader import DatasetReader
from .utils import get_client_context

def load(configProperties):

    print("Scoring Data Load Start")

    #########################################
    # Load Data
    #########################################
    client_context = get_client_context(configProperties)
    dataset_reader = DatasetReader(client_context, configProperties['scoringDataSetId'])
    df = dataset_reader.read()

    print("Scoring Data Load Finish")

    return df

现在,您应该在​Scoring Data Loader File​单元格中具有类似的内容:

DSW

管道文件

在方法生成器笔记本中向下滚动,直到您看到​管道文件

DSW

现在,您需要更新​管道文件​的代码。

你做任何事之前,请注意!! 无论您做什么,都不要删除或覆盖以​%%writefile​开头的行。 此行是Recipe Builder笔记本的必需行。

DSW

在该单元格中,您会找到类似以下代码:

from sklearn.ensemble import GradientBoostingRegressor

def train(config_properties, data):

    print("Train Start")

    #########################################
    # Extract fields from configProperties
    #########################################
    learning_rate = float(config_properties['learning_rate'])
    n_estimators = int(config_properties['n_estimators'])
    max_depth = int(config_properties['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

def score(config_properties, 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

将该代码(不覆盖​%%writefile​行)替换为以下代码:

import pandas as pd
import numpy as np
from collections import Counter

class PopularityBasedRecommendationModel():
    def __init__(self, num_to_recommend, configProperties):
        self.num_to_recommend = num_to_recommend
        self.recommendations = ['dummy']

        tenant_id='--aepTenantId--'

        self.user_id_column = '%s.recommendationsInput.ecid' % tenant_id
        self.recommendations_column = '%s.individualScoring.product.recommendations' % tenant_id
        self.item_id_column = '%s.recommendationsInput.productSku' % tenant_id
        self.user_id_output_column = '%s.identification.core.ecid' % tenant_id

    def fit(self, df):
        df = df[df[self.item_id_column].notnull()]
        self.recommendations = [item for item, freq in
                                Counter(list(df[self.item_id_column].values)).most_common(self.num_to_recommend)]


    def predict(self, df):
        # remove columns having none
        df = df[df[self.item_id_column].notnull()]

        df_grouped_by_user = df.groupby(self.user_id_column).agg(
            {self.item_id_column: lambda x: ','.join(x)})\
        .rename(columns={self.item_id_column:'interactions'}).reset_index()

        df_grouped_by_user[self.recommendations_column] = '#'.join(self.recommendations)
        df_grouped_by_user[self.user_id_output_column] = df_grouped_by_user[self.user_id_column]
        df_grouped_by_user = df_grouped_by_user.drop(['interactions'],axis=1)
        df_grouped_by_user = df_grouped_by_user.drop([self.user_id_column],axis=1)

        return df_grouped_by_user

def train(configProperties, data):

    print("Train Start")

    #########################################
    # Extract fields from configProperties
    #########################################
    num_recommendations = int(configProperties['num_recommendations'])

    #########################################
    # Fit model
    #########################################
    print('in train')
    print(configProperties)

    model = PopularityBasedRecommendationModel(num_recommendations, configProperties)

    model.fit(data)

    print("Train Complete")

    return model

def score(configProperties, data, model):

    print("Score Start")

    result = model.predict(data)

    print("Score Complete")

    return result

现在,Pipeline File​单元格中应包含类似内容:

DSW

计算器文件

在配方生成器笔记本中向下滚动,直到您看到​计算器文件

DSW

现在,您需要更新​计算器文件​的代码。

你做任何事之前,请注意!! 无论您做什么,都不要删除或覆盖以​%%writefile​开头的行。 此行是Recipe Builder笔记本的必需行。

DSW

在该单元格中,您会找到类似以下代码:

from ml.runtime.python.core.regressionEvaluator import RegressionEvaluator
import numpy as np

class Evaluator(RegressionEvaluator):
    def __init__(self):
        print ("Initiate")

    def split(self, config={}, 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

    def evaluate(self, data=[], model={}, config={}):
        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"}]
        
        print(metric)
        return metric

将该代码(不覆盖​%%writefile​行)替换为以下代码:

from ml.runtime.python.Interfaces.AbstractEvaluator import AbstractEvaluator
from platform_sdk.dataset_reader import DatasetReader
import numpy as np
import pandas as pd

class Evaluator(AbstractEvaluator):

    def split(self, configProperties={}, dataframe=None):
        #########################################
        # Load Data
        #########################################
        train = dataframe[:]
        test = dataframe[:]

        return train, test

    def evaluate(self, data=[], model={}, configProperties={}):
        print ("Evaluation evaluate triggered")

        tenant_id='--aepTenantId--'

        self.user_id_column = '%s.recommendationsInput.ecid' % tenant_id
        self.recommendations_column = '%s.individualScoring.product.recommendations' % tenant_id
        self.item_id_column = '%s.recommendationsInput.productSku' % tenant_id
        self.user_id_output_column = '%s.identification.core.ecid' % tenant_id

        # remove columns having none
        data = data[data[self.item_id_column].notnull()]

        data_grouped_by_user = data.groupby(self.user_id_column).agg(
            {self.item_id_column: lambda x: '#'.join(x)})\
        .rename(columns={self.item_id_column:'interactions'}).reset_index()

        data_recommendations = model.predict(data)
        
        data_recommendations[self.user_id_column] = data_recommendations[self.user_id_output_column]
        data_recommendations = data_recommendations.drop([self.user_id_output_column],axis=1)
        
        merged_df = pd.merge(data_grouped_by_user, data_recommendations, on=[self.user_id_column]).reset_index()

        def compute_recall(row):
            set_interactions = set(row['interactions'].split('#'))
            set_recommendations = set(row[self.recommendations_column].split('#'))
            inters = set_interactions.intersection(set_recommendations)
            if len(inters) > 0:
                return 1
            return 0

        def compute_precision(row):
            set_interactions = set(row['interactions'].split('#'))
            list_recommendations = row[self.recommendations_column].split('#')
            score = 0
            weight = 0.5
            for rec in list_recommendations:
                if rec in set_interactions:
                    score = score + weight
                weight = weight / 2

            return score


        merged_df['recall'] = merged_df.apply(lambda row: compute_recall(row), axis=1)
        merged_df['precision'] = merged_df.apply(lambda row: compute_precision(row), axis=1)

        recall = merged_df['recall'].mean()
        precision = merged_df['precision'].mean()

        metric = [{"name": "Recall", "value": recall, "valueType": "double"},
                 {"name": "Precision", "value": precision, "valueType": "double"}]

        print(metric)

        return metric

现在,您应该在​Evaluator File​单元格中具有类似的内容:

DSW

数据保护程序文件

在配方生成器笔记本中向下滚动,直到您看到​数据保护程序文件

DSW

现在,您需要更新​数据保护程序文件​的代码。

你做任何事之前,请注意!! 无论您做什么,都不要删除或覆盖以​%%writefile​开头的行。 此行是Recipe Builder笔记本的必需行。

DSW

在该单元格中,您会找到类似以下代码:

import pandas as pd
from .utils import get_client_context
from platform_sdk.models import Dataset
from platform_sdk.dataset_writer import DatasetWriter

def save(config_properties, prediction):
  print("Datasaver Start")

  client_context = get_client_context(config_properties)
  tenant_id = config_properties.get("tenantId")
  prediction = prediction.add_prefix(tenant_id+".")

  prediction = prediction.join(pd.DataFrame(
      {
          '_id': "",
          'timestamp': '2019-01-01T00:00:00',
          'eventType': ""
      }, index=prediction.index))

  dataset = Dataset(client_context).get_by_id(config_properties['scoringResultsDataSetId'])
  dataset_writer = DatasetWriter(client_context, dataset)
  dataset_writer.write(prediction, file_format='json')

  print("Datasaver Finish")
  print(prediction)

将该代码(不覆盖​%%writefile​行)替换为以下代码:

from platform_sdk.models import Dataset
from platform_sdk.dataset_writer import DatasetWriter
from .utils import get_client_context
from functools import reduce
import json

def save(configProperties, prediction):

    print(prediction)
    client_context = get_client_context(configProperties)
    dataset = Dataset(client_context).get_by_id(configProperties['scoringResultsDataSetId'])
    dataset_writer = DatasetWriter(client_context, dataset)
    dataset_writer.write(prediction, file_format='json')
    print("Data written successfully to platform")

现在,您应该在​Data Saver File​单元格中具有类似的内容:

DSW

现在,您已配置了执行笔记本所需的所有代码。

8.2.3执行方法生成器笔记本

训练模型

通过单击​培训​按钮,可完成模型培训。

DSW

单击顶部工具栏上的​培训​以在单元格中创建培训运行。 这执行训练数据加载器、管道和评估器单元,并生成评估量度以评估模型性能。 培训脚本的命令和输出日志将显示在笔记本(在“计算器 — ”单元格下)中。

单击​培训​后,培训运行将开始,并且需要几分钟才能完成。

DSW

DSW

DSW

单击​Train​时,将执行以下单元格:

  • 要求文件
  • 配置文件 — 培训
  • 培训数据加载器文件
  • 管道文件
  • 计算器文件

为模型打分

通过单击​Score​按钮,可对模型进行评分。

DSW

单击顶部工具栏中的​得分​以在单元格中创建得分运行。 这执行评分数据加载器、管道和评估器单元,并生成评估量度以评估模型性能。 记分脚本的命令和输出日志将显示在笔记本(位于pipeline.py单元格下)中。

单击​Score​后,将开始进行评分运行,并且需要几分钟才能完成。

DSW

DSW

DSW

DSW

单击​Score​时,将执行以下单元格:

  • 要求文件
  • 配置文件 — 评分
  • 评分数据加载器文件
  • 管道文件
  • 计算器文件

此外,在评分运行结束时,包含推荐的输出将存储在Adobe Experience Platform的​演示系统 — 用于ML预测的用户档案数据集(全局v1.1)​中。

您可以通过在Adobe Experience Platform中打开演示系统 — ML预测(全局v1.1)🔗配置文件数据集来验证此。

DSW

从模型创建方法

通过单击​创建方法​按钮,可创建方法。

DSW

如果您对培训和评分的结果满意,则可以创建方法。 单击​创建方法​按钮以开始该过程。

通过创建方法,您可以大规模测试模型。

单击​创建方法​按钮后,必须输入方法的名称。

DSW

作为命名规范,请使用:

  • ldapRecommendations

将​ldap​替换为ldap。

示例:对于ldap vangeluw,方法的名称应为:vangeluwRecommendations

DSW

在输入方法名称后,单击​确定

DSW

此时会显示第二个弹出窗口,告诉您正在创建方法。 最长可能需要5分钟,请等到过程完成。

DSW

现在,单击​关闭​按钮。

DSW

您可以在Jupyter Notebooks的右上角查看方法创建过程的进度。

DSW

DSW

几分钟后,方法创建完成,您可以在​模型>方法​下找到方法。 要转到此处,请单击​模型​菜单中的​方法

DSW

你会在列表中找到你的食谱。

现在,您已经创建了方法,接下来让我们继续下一个练习,在该练习中,您将开始可扩展的培训和实验。

下一步:8.3 — 模型培训和实验

返回模块8

返回到所有模块

在此页面上