Show Menu
トピック×

Jupyter ノートブックを使用したレシピの作成

このチュートリアルでは、2 つの主なセクションについて説明します。First, you will create a machine learning model using a template within JupyterLab Notebook. Next, you will exercise the notebook to recipe workflow within JupyterLab to create a recipe within Data Science Workspace.

導入された概念:

  • レシピ :レシピは、アドビ用語でモデル仕様を意味します。レシピは、トレーニング済みモデルの構築と実行に必要な特定の機械学習、AI アルゴリズムまたはアルゴリズムのアンサンブル、処理ロジック、および構成を表す最上位のコンテナであり、特定のビジネス問題の解決に役立ちます。
  • モデル :モデルは、履歴データと構成を使用してビジネスユースケースを解決するためにトレーニングされる機械学習レシピのインスタンスです。
  • トレーニング :トレーニングは、ラベル付きのデータからパターンやインサイトを学習するプロセスです。
  • スコアリング :スコアリングは、トレーニング済みモデルを使用してデータからインサイトを生成するプロセスです。

Get started with the JupyterLab notebook environment

Creating a recipe from scratch can be done within Data Science Workspace. 開始するには、 Adobe Experience Platformに移動し 、左の # タブをクリックします。 新しいノートブックを作成するには、からレシピビルダーテンプレートを選択し JupyterLab Launcherます。
The Recipe Builder notebook allows you to run training and scoring runs inside the notebook. これにより、トレーニングデータとスコアリングデータで実験を実行する間に、 train() メソッドと score() メソッドを柔軟に変更できます。Once you are happy with the outputs of the training and scoring, you can create a recipe to be used in Data Science Workspace using the notebook to recipe functionality built in to the Recipe Builder notebook.
The Recipe Builder notebook supports working with all file formats but currently the Create Recipe functionality only supports Python.
ランチャーからRecipe Builderノートブックをクリックすると、タブにノートブックが開きます。 ノートブックで使用されるテンプレートは、 こちらのパブリックリポジトリー にもある Python 小売売上予測レシピです。
You will notice that in the toolbar there are three additional actions namely – Train , Score , and Create Recipe . These icons only appear in the Recipe Builder notebook. これらのアクションに関する詳細は、ノートブックでレシピを作成した後に、 トレーニングとスコアリング の節で説明します。

レシピファイルの編集

レシピファイルを編集するには、ファイルパスに対応する Jupyter 内のセルに移動します。例えば、 evaluator.py に変更を加える場合は、 %%writefile demo-recipe/evaluator.py を探します 。
セルに必要な変更を加え、終了したらセルを実行します。 %%writefile filename.py コマンドは、セルの内容を filename.py に書き込みます。変更を加えたファイルごとに手動でセルを実行する必要があります。
該当する場合は、セルを手動で実行する必要があります。

Recipe Builder ノートブックの概要

Now that you know the basics for the JupyterLab notebook environment, you can begin looking at the files that make up a machine learning model recipe. ここで説明するファイルは次のとおりです。

要件ファイル

要件ファイルは、レシピで使用する追加のライブラリを宣言するために使用されます。依存関係がある場合は、バージョン番号を指定できます。追加のライブラリを探すには、https://anaconda.org を参照してください。既に使用されている主なライブラリのリストは次のとおりです。
python=3.5.2
scikit-learn
pandas
numpy
data_access_sdk_python

追加したライブラリまたは特定のバージョンは、上記のライブラリと互換性がない場合があります。

設定ファイル

設定ファイル( training.conf および scoring.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

トレーニングデータローダー

トレーニングデータローダーの目的は、機械学習モデルの作成に使用するデータをインスタンス化することです。通常、トレーニングデータローダーが達成するタスクは 2 つあります。
  • Load data from Platform
  • データの準備と特徴量エンジニアリング
以下の 2 つの節で、データの読み込みとデータの準備について説明します。

データの読み込み

この手順では、 pandas データフレーム を使用します。Data can be loaded from files in Adobe Experience Platform using either the Platform SDK ( platform_sdk ), or from external sources using pandas' read_csv() or read_json() functions.
Recipe Builder ノートブックでは、データは platform_sdk データローダーを介して読み込まれます。

Platform SDK

platform_sdk データローダーの使用に関する詳細なチュートリアルについては、『 Platform SDK ガイド 』を参照してください。このチュートリアルでは、認証の構築、データの基本読み取り、およびデータの基本的な書き込みに関する情報を提供します。

外部ソース

この節では、JSON または CSV ファイルを pandas オブジェクトにインポートする方法を示します。Pandas ライブラリの公式ドキュメントについては、次の URL を参照してください。
まず、CSV ファイルのインポート例を示します。 data 引数は CSV ファイルへのパスです。この変数は、 前の節 configProperties からインポートされました。
df = pd.read_csv(data)

また、JSON ファイルからインポートすることもできます。 data 引数は CSV ファイルへのパスです。この変数は、 前の節 configProperties からインポートされました。
df = pd.read_json(data)

これで、データはデータフレームオブジェクトに含まれ、 次の節 で分析および操作できます。

データアクセス SDK(非推奨)

data_access_sdk_python が推奨されなくなりました。 データローダーの使用に関するガイドについては、「 データアクセスコードの Platform SDK への変換 platform_sdk 」を参照してください。
データアクセス SDK を使用してデータを読み込むことができます。ライブラリは、次の行を含めることで、ページの上部にインポートできます。
from data_access_sdk_python.reader import DataSetReader
次に、 load() メソッドを使用して、設定( recipe.conf )ファイルに設定されたとおりに trainingDataSetId からトレーニングデータセットを取得します。
prodreader = DataSetReader(client_id=configProperties['ML_FRAMEWORK_IMS_USER_CLIENT_ID'],
                           user_token=configProperties['ML_FRAMEWORK_IMS_TOKEN'],
                           service_token=configProperties['ML_FRAMEWORK_IMS_ML_TOKEN'])

df = prodreader.load(data_set_id=configProperties['trainingDataSetId'],
                     ims_org=configProperties['ML_FRAMEWORK_IMS_TENANT_ID'])

As mentioned in the Configuration File section , the following configuration parameters are set for you when you access data from Experience Platform:
  • ML_FRAMEWORK_IMS_USER_CLIENT_ID
  • ML_FRAMEWORK_IMS_TOKEN
  • ML_FRAMEWORK_IMS_ML_TOKEN
  • ML_FRAMEWORK_IMS_TENANT_ID
データが揃ったら、データの準備と特徴のエンジニアリングから始めます。

データの準備と特徴量エンジニアリング

データは読み込み後に準備されて、 train データセットと val データセットに分割されます。サンプルコードを以下に示します。
#########################################
# 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 データセットに分割する
First, week and year columns are created and the original date column converted to Python datetime . 週と年の値は、datetime オブジェクトから抽出されます。
次に、 storeType が 3 つの異なる店舗タイプ( A B C )を表す 3 つの列に変換されます。それぞれにはどちらの storeType が true かを示すブール値が含まれます。 storeType 列が削除されます。
同様に、 weeklySales isHoliday ブール値を数値表現(1 または 0)に変更します。
このデータは、 train val データセットの間で分割されます。
load() 関数は train val データセットを出力として完了する必要があります。

スコアリングデータローダー

スコアリングのデータを読み込む手順は、 split() 関数でトレーニングデータを読み込む手順と似ています。データアクセス SDK を使用して、 recipe.conf ファイルにある scoringDataSetId からデータを読み込みます。
def load(configProperties):

    print("Scoring Data Load Start")

    #########################################
    # Load Data
    #########################################
    prodreader = DataSetReader(client_id=configProperties['ML_FRAMEWORK_IMS_USER_CLIENT_ID'],
                               user_token=configProperties['ML_FRAMEWORK_IMS_TOKEN'],
                               service_token=configProperties['ML_FRAMEWORK_IMS_ML_TOKEN'])

    df = prodreader.load(data_set_id=configProperties['scoringDataSetId'],
                         ims_org=configProperties['ML_FRAMEWORK_IMS_TENANT_ID'])

データの読み込み後、データの準備と特徴量エンジニアリングがおこなわれます。
#########################################
# Data Preparation/Feature Engineering
#########################################
df.date = pd.to_datetime(df.date)
df['week'] = df.date.dt.week
df['year'] = df.date.dt.year

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

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

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

print("Scoring Data Load Finish")

return df

このモデルの目的は将来の毎週の売上を予測することなので、モデルの予測がどれだけうまく機能するかを評価するために使用されるスコアリングデータセットを作成する必要があります。
この Recipe Builder ノートブックは、週間売り上げを前に 7 日間オフセットすることでこれを実現しています。毎週 45 店舗の測定値があるので、 weeklySales 値を 45 データセット分、前にシフトして、新しい列( weeklySalesAhead )に転送できます。
df['weeklySalesAhead'] = df.shift(-45)['weeklySales']

同様に、 weeklySalesLag 列を後ろに 45 シフトして作成できます。これを使用して、週別の売上高の差を計算し、 weeklySalesDiff 列に格納することもできます。
df['weeklySalesLag'] = df.shift(45)['weeklySales']
df['weeklySalesDiff'] = (df['weeklySales'] - df['weeklySalesLag']) / df['weeklySalesLag']

weeklySales データポイントを 45 データセット分前方にオフセットし、45 データセット分後方にオフセットして新しい列を作成するので、最初と最後の 45 データポイントには NaN 値が設定されます。これらのポイントは、NaN 値を持つすべての行を削除する df.dropna() 関数を使用してデータセットから削除できます。
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 ファイルには、トレーニングレシピの評価方法とトレーニングデータの分割方法に関するロジックが含まれています。小売販売の例では、トレーニングデータの読み込みと準備のロジックが含まれます。以下の 2 つの節で説明します。

データセットの分割

トレーニングのデータ準備段階では、トレーニングとテストに使用するデータセットを分割する必要があります。この 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() 関数が含まれています。The save() function will take your prediction and using Experience Platform Catalog APIs, write the data to the scoringResultsDataSetId you specified in your scoring.conf file.
小売販売のサンプルレシピでの使用例を次に示します。Platform へのデータ書き込みにおける 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 は、最初にすべての依存関係をインストールし、その後トレーニングを開始します。
スコアリングを実行する前に、少なくとも 1 回はトレーニングを実行する必要があります。「 スコアリングを実行 」ボタンをクリックすると、トレーニング中に生成されたトレーニング対象モデルに対してスコアが付けられます。スコアリングスクリプトが datasaver.py の下に表示されます。
デバッグの目的で、非表示の出力を表示する場合は、出力セルの末尾に debug を追加し、再実行します。

レシピの作成

When you are done editing the recipe and satisfied with the training/scoring output, you can create a recipe from the notebook by pressing Create Recipe in the top-right navigation.
ボタンを押すと、レシピ名の入力を求められます。 この名前は、に作成された実際のレシピを表し Platformます。
OK 」を押すと、 Adobe Experience Platform で新しいレシピに移動できます。「 レシピを表示 」ボタンをクリックすると、「 ML モデル 」の下の「 レシピ 」タブに移動できます。
処理が完了すると、レシピは次のようになります。
  • ファイルのセルを削除しないでください
  • ファイルのセルの先頭の %%writefile 行を編集しないでください
  • 異なるノートブックに同時にレシピを作成しないでください

次の手順

このチュートリアルでは、Recipe Builder ノートブックで機械学習モデルを作成する方法を学習しました。You have also learned how to exercise the notebook to recipe workflow within the notebook to create a recipe within Data Science Workspace.
To continue learning how to work with resources within Data Science Workspace, please visit the Data Science Workspace recipes and models dropdown.

その他のリソース

次のビデオは、モデルの構築とデプロイに関する理解を深めるためのものです。