8.2 모델 작성 및 운영

연습 8.1에서는 기계 학습 모델을 실행하는 데 필요한 교육 데이터를 생성했습니다. 이 단원에서는 이 데이터를 사용하여 기계 학습 모델을 만드는 방법을 알아봅니다. 실제 환경에서는 데이터 세트와 기계 학습 모델을 만드는 것이 반복적인 과정입니다.

Adobe Experience Platform에 로그인할 URL은 다음과 같습니다. https://experience.adobe.com/platform

목표

  • 전자 필기장을 사용하여 교육 데이터 분석
  • 제품 Recommendations 레서피 살펴보기
  • 제품 Recommendations 레서피를 만드는 방법을 알아봅니다

8.2.1 데이터 분석

Jupiter Notebook에서 작업 표시줄의 + 아이콘을 클릭하여 시작 관리자 페이지를 엽니다.

DSW

그러면 다음 내용이 표시됩니다.

DSW

시작 관리자에서 빈 단추를 클릭하여 빈 Python 3 전자 필기장을 엽니다.

DSW

그러면 비어 있는 새 Python 3 전자 필기장이 제공됩니다. 계속하기 전에 전자 필기장에 설명 이름을 지정합니다. 제목 없음.iphynb 파일을 마우스 오른쪽 단추로 클릭하고 이름 바꾸기​를 클릭합니다.

DSW

전자 필기장의 이름으로 luma-recommendations-data-experience.iphnib​을 입력하고 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를 참조합니다.

aepRecommendationsInputDatasetId는 Recommendations 모델 입력에 대한 데이터 세트 데모 시스템 - 이벤트 데이터 세트 ID를 나타냅니다(글로벌 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 레서피 빌더 노트북

레서피 빌더 노트북은 모델을 자동으로 패키징하고 조작하는 데 템플릿화하는 최신 혁신 기능 중 하나입니다. 수첩에는 모델 코드에 맞는 여러 템플릿 셀이 있습니다.

  • 요구 사항 및 구성 셀을 사용하면 추가 라이브러리를 추가하고 모델에 대한 데이터 세트 및 조정 매개 변수를 구성할 수 있습니다
  • 평가기 셀을 사용하면 데이터를 분할하고 모델의 성능을 평가할 수 있습니다
  • 교육 및 점수 데이터 로더 셀을 통해 교육 및 점수 책정에 필요한 데이터를 로드할 수 있습니다
  • 마지막으로 파이프라인 셀에는 교육 및 모델 점수 책정 모두에 필요한 로직이 포함되어 있습니다.

Adobe는 모델을 교육, 평가 및 점수에 맞게 학습하고 Adobe Experience Platform에서 원활한 흐름을 통해 패키징할 수 있는 기능을 제공하여 모델을 운영 관리하는 데 필요한 단계를 간소화했습니다. 레서피에 패키징을 사용하면 다른 데이터 세트와 함께 동일한 코드를 사용하여 조직의 다양한 사용 사례를 수행할 수도 있습니다. Adobe의 특정 사용 사례는 웹 사이트에서 구매할 제품을 검색하는 사용자를 위한 권장 사항 모델 코드를 사용하는 것과 관련이 있습니다.

Jupiter Notebook에서 작업 표시줄의 + 아이콘을 클릭하여 시작 관리자 페이지를 엽니다.

DSW

그러면 다음 내용이 표시됩니다.

DSW

시작 관리자에서 레서피 빌더 단추를 클릭하여 빈 레서피 빌더 전자 필기장을 엽니다.

DSW

그러면 비어 있는 새 레서피 빌더 전자 필기장이 제공됩니다. 계속하기 전에 전자 필기장에 설명 이름을 지정합니다. [Python 3] Recipe Builder.ippinb 파일을 마우스 오른쪽 단추로 클릭하고 이름 바꾸기​를 클릭합니다.

DSW

전자 필기장의 이름으로 luma-recommendations-inposive-recipe.ipynb​을 입력하고 Enter​를 누릅니다. 그러면 다음 항목이 제공됩니다.

DSW

이 전자 필기장에서 다음을 수행합니다.

  • 모델 교육
  • 모델 점수 책정
  • 모델에서 레서피 생성

모든 단계를 자세히 구성하겠습니다.

구성 파일

구성 파일​이 표시될 때까지 레서피 빌더 노트북에서 아래로 스크롤합니다.

DSW

이제 교육 구성점수 구성​에 대한 셀을 업데이트해야 합니다.

교육 구성

교육 구성​에 대한 셀을 클릭합니다.

어떤 일을 하기 전에 주의하십시오!! 어떤 작업을 하든 %%writefile​로 시작하는 행을 삭제하거나 덮어쓰지 마십시오. 이 라인은 레서피 빌더 수첩에 필요합니다.

%%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"
}
중요

환경 변수 aepRecommendationsInputDatasetIdaepRecommendationsInputSchemaRef​는 Adobe Experience Platform 인스턴스에서 만들어진 데이터 세트의 데이터 세트 ID를 참조합니다.

aepRecommendationsInputDatasetId는 데이터 세트 데모 시스템 - Recommendations 모델 입력에 대한 이벤트 데이터 세트 ID(전역 v1.1), ​aepRecommendationsInputSchema스키마 데모 시스템 - Recommendations 모델 입력에 대한 이벤트 스키마 참조 ID(전역 v1.1)​를 나타냅니다. 전자 필기장의 교육 구성 셀에 코드를 붙여넣을 때 환경 변수를 데이터 세트 ID 및 스키마 참조 ID로 바꿉니다.

이제 교육 구성 셀에서 유사한 것이 있어야 합니다.

DSW

점수 구성

점수 구성​에 대한 셀을 클릭합니다.

어떤 일을 하기 전에 주의하십시오!! 어떤 작업을 하든 %%writefile​로 시작하는 행을 삭제하거나 덮어쓰지 마십시오. 이 라인은 레서피 빌더 수첩에 필요합니다.

%%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--"
}
중요

환경 변수 aepRecommendationsInputDatasetId, aepMlPredictionsDatasetIdaepMlPredictionsSchemaRef​는 Adobe Experience Platform 인스턴스에 생성된 데이터 세트 ID 및 스키마 Ref ID를 참조합니다.

aepRecommendationsInputDatasetId는 데이터 세트 데모 시스템 - Recommendations 모델 입력에 대한 이벤트 데이터 세트 ID(전역 v1.1), ​aepMlPredictionDataset데이터 세트 ID를 데모 시스템 - ML 예측을 위한 프로필 데이터 세트 ID(전역 v1.1), ​aepRefSchemaReprediction은 스키마 에 대한 스키마 ML 스키마 ID 를 나타냅니다. 예측(글로벌 v1.1). 전자 필기장의 점수 구성 셀에 코드를 붙여넣을 때 환경 변수를 데이터 세트 ID와 스키마 참조 ID로 바꿉니다.

이제 점수 구성 셀에서 유사한 항목이 있어야 합니다.

DSW

교육 데이터 로더 파일

교육 데이터 로더 파일​이 표시될 때까지 레서피 빌더 노트북에서 아래로 스크롤합니다.

DSW

이제 교육 데이터 로더 파일​에 대한 코드를 업데이트해야 합니다.

어떤 일을 하기 전에 주의하십시오!! 어떤 작업을 하든 %%writefile​로 시작하는 행을 삭제하거나 덮어쓰지 마십시오. 이 라인은 레서피 빌더 수첩에 필요합니다.

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

이제 교육 데이터 로더 파일 셀에 유사한 항목이 있어야 합니다.

DSW

점수 데이터 로더 파일

점수 데이터 로더 파일​이 표시될 때까지 레서피 빌더 노트북에서 아래로 스크롤합니다.

DSW

이제 점수 데이터 로더 파일​에 대한 코드를 업데이트해야 합니다.

어떤 일을 하기 전에 주의하십시오!! 어떤 작업을 하든 %%writefile​로 시작하는 행을 삭제하거나 덮어쓰지 마십시오. 이 라인은 레서피 빌더 수첩에 필요합니다.

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

이제 점수 데이터 로더 파일 셀에서 유사한 항목이 있어야 합니다.

DSW

파이프라인 파일

파이프라인 파일​이 표시될 때까지 레서피 빌더 노트북에서 아래로 스크롤합니다.

DSW

이제 파이프라인 파일​에 대한 코드를 업데이트해야 합니다.

어떤 일을 하기 전에 주의하십시오!! 어떤 작업을 하든 %%writefile​로 시작하는 행을 삭제하거나 덮어쓰지 마십시오. 이 라인은 레서피 빌더 수첩에 필요합니다.

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

이제 파이프라인 파일 셀에 유사한 항목이 있어야 합니다.

DSW

평가기 파일

레서피 빌더 전자 필기장에서 평가기 파일​이 표시될 때까지 아래로 스크롤합니다.

DSW

이제 평가기 파일​에 대한 코드를 업데이트해야 합니다.

어떤 일을 하기 전에 주의하십시오!! 어떤 작업을 하든 %%writefile​로 시작하는 행을 삭제하거나 덮어쓰지 마십시오. 이 라인은 레서피 빌더 수첩에 필요합니다.

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

이제 평가기 파일 셀에 비슷한 항목이 있어야 합니다.

DSW

데이터 절약 파일

데이터 절약 파일​이 표시될 때까지 레서피 빌더 노트북에서 아래로 스크롤합니다.

DSW

이제 데이터 보호기 파일​에 대한 코드를 업데이트해야 합니다.

어떤 일을 하기 전에 주의하십시오!! 어떤 작업을 하든 %%writefile​로 시작하는 행을 삭제하거나 덮어쓰지 마십시오. 이 라인은 레서피 빌더 수첩에 필요합니다.

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

이제 데이터 보호기 파일 셀에서 유사한 항목이 있어야 합니다.

DSW

이제 전자 필기장을 실행하는 데 필요한 모든 코드를 구성했습니다.

8.2.3 Execute Recipe Builder 노트북

모델 교육

모델 교육은 기차 단추를 클릭하여 수행됩니다.

DSW

위쪽 도구 모음에서 Train 을 클릭하여 셀에서 교육 실행을 만듭니다. 이렇게 하면 교육 데이터 로더, 파이프라인 및 평가기 셀을 실행하고 모델 성과를 측정하는 평가 지표를 생성합니다. 교육 스크립트의 명령 및 출력 로그가 전자 필기장(평가기 - 셀 아래)에 표시됩니다.

Train​을 클릭하면 교육 실행이 시작되며 완료되려면 2분이 필요합니다.

DSW

DSW

DSW

Train​을 클릭하면 다음 셀이 실행됩니다.

  • 요구 사항 파일
  • 구성 파일 - 교육
  • 교육 데이터 로더 파일
  • 파이프라인 파일
  • 평가기 파일

모델 점수 책정

모델 점수는 점수 단추를 클릭하여 수행됩니다.

DSW

상단 도구 모음에서 점수​를 클릭하여 셀에서 점수 실행을 만듭니다. 이렇게 하면 점수 데이터 로더, 파이프라인 및 평가기 셀을 실행하고 모델 성과를 측정하는 평가 지표를 생성합니다. 점수부여 스크립트의 명령 및 출력 로그가 수첩(pipeline.py 셀 아래)에 표시됩니다.

점수​를 클릭하면 점수 실행이 시작되며 완료하려면 2분이 필요합니다.

DSW

DSW

DSW

DSW

점수​를 클릭하면 다음 셀이 실행됩니다.

  • 요구 사항 파일
  • 구성 파일 - 점수 책정
  • 점수 데이터 로더 파일
  • 파이프라인 파일
  • 평가기 파일

또한 점수부여 실행이 끝나면 추천이 있는 출력이 Adobe Experience Platform의 데모 시스템 - ML 예측을 위한 프로필 데이터 세트(글로벌 v1.1)​에 저장됩니다.

Adobe Experience Platform에서 Demo System - Profile Dataset for ML Prediction (Global v1.1) 🔗을 열어 이 을 확인할 수 있습니다.

DSW

모델에서 레서피 생성

레서피 만들기는 레서피 만들기 단추를 클릭하여 수행됩니다.

DSW

교육 및 점수 결과에 만족하면 배합식을 생성할 수 있습니다. 레서피 생성 단추를 눌러 프로세스를 시작합니다.

배합식을 만들면 모델을 규모에 맞게 테스트할 수 있습니다.

레서피 만들기 단추를 클릭한 후 레서피 이름을 입력해야 합니다.

DSW

명명 규칙으로, 다음을 사용하십시오.

  • ldapRecommendations

ldap​을 ldap로 바꿉니다.

예: ldap vangeluw​의 경우, 배합식의 이름은 다음과 같습니다. vangeluwRecommendations

DSW

배합식 이름을 입력한 후 확인​을 클릭합니다.

DSW

두 번째 팝업이 표시되며, 레서피가 만들어지고 있음을 알려줍니다. 최대 5분 정도 걸릴 수 있습니다. 프로세스가 완료될 때까지 기다리십시오.

DSW

지금은 Dismisse 단추를 클릭하십시오.

DSW

Jupiter Notebook의 오른쪽 상단 모서리에서 레서피 작성 프로세스의 진행 상황을 볼 수 있습니다.

DSW

DSW

2분 후에 레서피 만들기가 완료되어 모델 > 레서피 아래에서 레서피 조리법을 찾을 수 있습니다. 이동하려면 모델 메뉴에서 레서피​를 클릭합니다.

DSW

그 목록에 당신의 조리법이 있습니다.

이제 조리법을 만들었으니, 다음 연습을 계속합시다. 그러면 스케일러블 훈련과 실험을 시작할 것입니다.

다음 단계: 8.3 - 모델 교육 및 실험

모듈 8로 돌아가기

모든 모듈로 돌아가기

이 페이지에서는