8.2 Criação e operacionalização de modelos

No Exercício 8.1 você gerou os dados de treinamento necessários para potencializar seu modelo de aprendizado de máquina. Nesta lição, você aprenderá como usar esses dados para criar um modelo de aprendizado de máquina. No mundo real, criar um conjunto de dados e um modelo de aprendizado de máquina será um processo iterativo.

O URL para fazer logon no Adobe Experience Platform é: https://experience.adobe.com/platform.

Objetivos

  • Analise seus dados de treinamento usando notebooks
  • Explore a receita do Recommendations do produto
  • Saiba como a Receita Recommendations do Produto pode ser criada

8.2.1 Analisar os dados

Em Notebooks de Júpiter, abra a página Iniciador clicando no ícone + na barra de tarefas.

DSW

Você verá isso:

DSW

Abra um bloco de anotações em branco Python 3 clicando no botão Em branco no Iniciador.

DSW

Você terá um novo notebook Python 3 vazio. Antes de continuar, dê um nome descritivo ao seu bloco de anotações. Clique com o botão direito do mouse no arquivo Untitled.ipynb e clique em Renomear.

DSW

Insira luma-recommendations-data-extraction.ipynb como o nome do seu notebook e pressione Enter. Você terá isso:

DSW

Carregar bibliotecas

Clique na primeira célula vazia do bloco de notas.

DSW

Copie o código abaixo e cole-o na primeira célula do notebook.

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

A variável de ambiente aepRecommendationsInputDatasetId refere-se a uma ID de conjunto de dados de um conjunto de dados que foi criado em sua instância do Adobe Experience Platform.

aepRecommendationsInputDatasetIdrefere-se à ID do conjunto de dados do Sistema de demonstração do conjunto de dados - Conjunto de dados de eventos para entrada do modelo Recommendations (Global v1.1). Substitua a variável de ambiente por essas IDs de conjunto de dados quando você colar o código na primeira célula do notebook.

Você terá isso na célula 1:

DSW

Clique no botão Reproduzir para executar essa célula.

DSW

Aguarde até que o indicador fique assim antes de continuar:

DSW

O resultado tem esta aparência:

DSW

Carregar dados

Clique na próxima célula vazia do bloco de anotações.

DSW

Copie o código abaixo e cole-o na primeira célula do notebook.

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)

Você terá isso na célula:

DSW

Clique no botão Reproduzir para executar essa célula.

DSW

A execução dessa célula pode levar de 1 a 2 minutos.

Aguarde até que o indicador fique assim antes de continuar:

DSW

Este é o resultado:

DSW

Resumir os dados

Clique na próxima célula vazia do bloco de anotações.

DSW

Copie o código abaixo e cole-o na primeira célula do notebook.

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

Você terá isso na célula:

DSW

Clique no botão Reproduzir para executar essa célula.

DSW

Este é o resultado:

DSW

Resumo estatístico

Clique na próxima célula vazia do bloco de anotações.

DSW

Copie o código abaixo e cole-o na primeira célula do notebook.

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

Você terá isso na célula:

DSW

Clique no botão Reproduzir para executar essa célula.

DSW

Em seguida, clique na próxima célula vazia do bloco de anotações.

DSW

Copie o código abaixo e cole-o na primeira célula do notebook.

df.describe()

Você terá isso na célula:

DSW

Clique no botão Reproduzir para executar essa célula.

DSW

Este é o resultado:

DSW

Agrupar itens por ID de item

Clique na próxima célula vazia do bloco de anotações.

DSW

Copie o código abaixo e cole-o na primeira célula do notebook.

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

Você terá isso na célula:

DSW

Clique no botão Reproduzir para executar essa célula.

DSW

Este é o resultado:

DSW

Notebook do Criador de receita 8.2.2

O Notebook Recipe Builder é uma de nossas inovações recentes que modelam seu modelo para automaticamente embalá-lo e operacionalizá-lo. O bloco de notas tem várias células de modelo nas quais você pode ajustar o código do modelo:

  • Os requisitos e as células de configuração permitem adicionar bibliotecas e configurar conjuntos de dados e parâmetros de ajuste para o seu modelo
  • A célula avaliadora permite dividir seus dados e avaliar o desempenho do modelo
  • As células do carregador de dados de treinamento e pontuação permitem carregar os dados necessários para treinamento e pontuação
  • Por fim, a célula do pipeline contém a lógica necessária para treinamento e pontuação do modelo.

Simplificamos as etapas necessárias para operacionalizar um modelo, fornecendo a capacidade de treiná-lo, avaliá-lo e pontuá-lo em escala e, em seguida, compactá-lo em um fluxo contínuo no Adobe Experience Platform. O empacotamento para uma Receita também permite que você use o mesmo código com diferentes conjuntos de dados para potencializar casos de uso diferentes em suas organizações. Nosso caso de uso específico envolve o uso do código do modelo de recomendações para usuários que procuram produtos para comprar no site.

Em Notebooks de Júpiter, abra a página Iniciador clicando no ícone + na barra de tarefas.

DSW

Você verá isso:

DSW

Abra um bloco de notas Recipe Builder em branco clicando no botão Recipe Builder no Iniciador.

DSW

Em seguida, você terá um novo bloco de notas Recipe Builder vazio. Antes de continuar, dê um nome descritivo ao seu bloco de anotações. Clique com o botão direito do mouse no arquivo [Python 3] Recipe Builder.ipynb e clique em Renomear.

DSW

Insira luma-recommendations-popularidade-recipe.ipynb como o nome do seu notebook e pressione Enter. Você terá isso:

DSW

Neste bloco de anotações, você fará o seguinte:

  • Treinar um modelo
  • Pontuar um modelo
  • Criar uma receita do modelo

Vamos configurar todas as etapas em detalhes.

Arquivos de configuração

Role para baixo no bloco de notas do Recipe Builder até visualizar Arquivos de configuração.

DSW

Agora é necessário atualizar as células para Configuração de treinamento e Configuração de pontuação.

Configuração de treinamento

Clique na célula para Configuração de Treinamento.

Antes de fazer alguma coisa, por favor, prestem atenção!! Seja o que for que você faça, não exclua ou substitua a linha que começa com %%writefile. Esta linha é exigida pelo notebook Recipe Builder.

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

DSW

Você também verá um código semelhante nessa mesma célula:

{
   "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"
}

Substitua esse código por este código:

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

As variáveis de ambiente aepRecommendationsInputDatasetId e aepRecommendationsInputSchemaRef referem-se às IDs do conjunto de dados de conjuntos de dados que foram criados em sua instância do Adobe Experience Platform.

aepRecommendationsInputDatasetIdrefere-se à ID do conjunto de dados do Sistema de demonstração do conjunto de dados - Conjunto de dados de evento para entrada do modelo do Recommendations (Global v1.1), ​aepRecommendationsInputSchemaRefrefere-se à ID de referência do esquema do sistema de demonstração do esquema - Esquema de evento para entrada do modelo do Recommendations (Global v1.1). Substitua as variáveis de ambiente pela ID do conjunto de dados e pela ID de referência do esquema quando você colar o código na célula Configuração de treinamento no seu notebook.

Agora você deve ter algo semelhante na célula Configuração de treinamento:

DSW

Configuração de pontuação

Clique na célula para Configuração de Pontuação.

Antes de fazer alguma coisa, por favor, prestem atenção!! Seja o que for que você faça, não exclua ou substitua a linha que começa com %%writefile. Esta linha é exigida pelo notebook Recipe Builder.

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

DSW

Você também verá um código semelhante nessa mesma célula:

{
   "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>"
}

Substitua esse código por este código:

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

As variáveis de ambiente aepRecommendationsInputDatasetId, aepMlPredictionsDatasetId e aepMlPredictionsSchemaRef referem-se às IDs do conjunto de dados dos conjuntos de dados e à ID de referência do esquema que foram criadas na sua instância do Adobe Experience Platform.

aepRecommendationsInputDatasetIdrefere-se à ID do conjunto de dados do Sistema de demonstração do conjunto de dados - Conjunto de dados de evento para entrada do modelo do Recommendations (Global v1.1), ​aepMlPredictionsDatasetIdrefere-se à ID do conjunto de dados do sistema de demonstração do conjunto de dados - Conjunto de dados de perfil para previsões ML (Global v1.1)1, ​aepMlPredictionsSchemaRefrefere-se à ID de Referência do Esquema do Sistema de Demonstração do Esquema - Esquema de Perfil para Previsões ML (Global v1.1). Substitua as variáveis de ambiente pela ID do conjunto de dados e pela ID de referência do esquema quando você colar o código na célula Configuração de pontuação no seu bloco de anotações.

Agora você deve ter algo semelhante na célula Configuração de pontuação:

DSW

Arquivo de Carregador de Dados de Treinamento

Role para baixo no bloco de notas do Recipe Builder até visualizar Arquivo do carregador de dados de treinamento.

DSW

Agora é necessário atualizar o código para Arquivo do carregador de dados de treinamento.

Antes de fazer alguma coisa, por favor, prestem atenção!! Seja o que for que você faça, não exclua ou substitua a linha que começa com %%writefile. Esta linha é exigida pelo notebook Recipe Builder.

DSW

Nessa célula, você encontrará um código semelhante a este:

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

Substitua esse código (sem substituir a linha %%writefile) por este código:

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

Agora você deve ter algo semelhante na célula Training Data Loader File:

DSW

Arquivo do carregador de dados de pontuação

Role para baixo no bloco de notas do Recipe Builder até visualizar Arquivo do carregador de dados de pontuação.

DSW

Agora é necessário atualizar o código para Arquivo do carregador de dados de pontuação.

Antes de fazer alguma coisa, por favor, prestem atenção!! Seja o que for que você faça, não exclua ou substitua a linha que começa com %%writefile. Esta linha é exigida pelo notebook Recipe Builder.

DSW

Nessa célula, você encontrará um código semelhante a este:

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

Substitua esse código (sem substituir a linha %%writefile) por este código:

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

Agora você deve ter algo semelhante na célula Scoring Data Loader File:

DSW

Arquivo de pipeline

Role para baixo no bloco de notas do Recipe Builder até visualizar Arquivo de pipeline.

DSW

Agora é necessário atualizar o código para Arquivo de pipeline.

Antes de fazer alguma coisa, por favor, prestem atenção!! Seja o que for que você faça, não exclua ou substitua a linha que começa com %%writefile. Esta linha é exigida pelo notebook Recipe Builder.

DSW

Nessa célula, você encontrará um código semelhante a este:

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

Substitua esse código (sem substituir a linha %%writefile) por este código:

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

Agora você deve ter algo semelhante na célula Arquivo de pipeline:

DSW

Arquivo do avaliador

Role para baixo no bloco de notas do Recipe Builder até visualizar Arquivo do Avaliador.

DSW

Agora é necessário atualizar o código para Arquivo do Avaliador.

Antes de fazer alguma coisa, por favor, prestem atenção!! Seja o que for que você faça, não exclua ou substitua a linha que começa com %%writefile. Esta linha é exigida pelo notebook Recipe Builder.

DSW

Nessa célula, você encontrará um código semelhante a este:

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

Substitua esse código (sem substituir a linha %%writefile) por este código:

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

Agora você deve ter algo semelhante na célula Arquivo do Avaliador:

DSW

Arquivo do Data Saver

Role para baixo no bloco de notas do Recipe Builder até visualizar Arquivo do Data Saver.

DSW

Agora é necessário atualizar o código para Arquivo do Data Saver.

Antes de fazer alguma coisa, por favor, prestem atenção!! Seja o que for que você faça, não exclua ou substitua a linha que começa com %%writefile. Esta linha é exigida pelo notebook Recipe Builder.

DSW

Nessa célula, você encontrará um código semelhante a este:

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)

Substitua esse código (sem substituir a linha %%writefile) por este código:

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

Agora você deve ter algo semelhante na célula Arquivo do Data Saver:

DSW

Agora você configurou todo o código necessário para executar seu notebook.

Notebook do Construtor de receitas de execução 8.2.3

Treinar um modelo

O treinamento de um modelo é feito clicando no botão Treinar.

DSW

Clique em Treinar na barra de ferramentas superior para criar uma execução de treinamento na célula. Isso executa as células do carregador de dados de treinamento, pipeline e avaliador e gera métricas de avaliação para medir o desempenho do modelo. Um registro de comandos e saídas do script de treinamento aparecerá no bloco de notas (na célula Avaliador -).

Depois de clicar em Treinar, o Programa de Treinamento começará e precisará de alguns minutos para ser concluído.

DSW

DSW

DSW

Ao clicar em Treinar, as seguintes células são executadas:

  • Arquivo de requisitos
  • Arquivos de configuração - Treinamento
  • Arquivo de Carregador de Dados de Treinamento
  • Arquivo de pipeline
  • Arquivo do avaliador

Pontuar um modelo

A pontuação de um modelo é feita clicando no botão Score.

DSW

Clique em Score na barra de ferramentas superior para criar uma execução de pontuação na célula. Isso executa o carregador de dados de pontuação, o pipeline e as células do avaliador e gera métricas de avaliação para medir o desempenho do modelo. Um log de comandos e saídas do script de pontuação aparecerá no bloco de notas (na célula pipeline.py).

Depois de clicar em Pontuação, a Execução de Pontuação será iniciada e precisará de alguns minutos para ser concluída.

DSW

DSW

DSW

DSW

Ao clicar em Score, as seguintes células são executadas:

  • Arquivo de requisitos
  • Arquivos de configuração - Pontuação
  • Arquivo do carregador de dados de pontuação
  • Arquivo de pipeline
  • Arquivo do avaliador

Além disso, no final da Execução de pontuação, a saída com recomendações é armazenada no Adobe Experience Platform, no Sistema de demonstração - Conjunto de dados do perfil para previsões ML (Global v1.1).

Você pode verificar isso abrindo o Demo System - Profile Dataset for ML Predictions (Global v1.1) no Adobe Experience Platform.

DSW

Criar uma receita do modelo

A criação de uma receita é feita clicando no botão Create Recipe.

DSW

Quando estiver satisfeito com os resultados do treinamento e da pontuação, você poderá criar uma receita. Clique no botão Create Recipe para iniciar o processo.

Criar uma receita permite testar seu modelo em escala.

Depois de clicar no botão Create Recipe, é necessário inserir um nome para a receita.

DSW

Como convenção de nomenclatura, use:

  • ldapRecommendations

Substitua ldap pelo seu ldap.

Exemplo: para ldap vangeluw, o nome da sua receita deve ser: vangeluwRecommendations.

DSW

Depois de inserir um Nome de receita, clique em OK.

DSW

Um segundo pop-up é exibido informando que sua Receita está sendo criada. Isso pode levar até 5 minutos. Aguarde até que o processo termine.

DSW

Por enquanto, clique no botão Dismiss.

DSW

Você pode visualizar o progresso do processo de criação de receita no canto superior direito dos notebooks Júpiter.

DSW

DSW

Após alguns minutos, a criação da receita é concluída e você pode encontrar sua receita em Models > Recipes. Para chegar lá, clique em Recipes no menu Modelos.

DSW

Você encontrará sua receita na lista.

Agora que você criou sua receita, vamos continuar com o próximo exercício, no qual você iniciará treinamento e experimentação escaláveis.

Próxima etapa: 8.3 - Treinamento e Experiência do Modelo

Voltar ao Módulo 8

Voltar para todos os módulos

Nesta página