Amazon SageMaker PlatoBlockchain Data Intelligence を使用して、最大の利益を得るための最適な価格設定。 垂直検索。 あい。

Amazon SageMaker を使用して最大の利益を得るための最適な価格設定

これは、Adspert のシニア機械学習エンジニアである Viktor Enrico Jeney によるゲスト投稿です。

アドスペル はベルリンを拠点とする ISV で、パフォーマンス マーケティングと広告キャンペーンを自動的に最適化するように設計された入札管理ツールを開発しました。 同社の核となる原則は、人工知能の助けを借りて、e コマース広告の利益の最大化を自動化することです。 広告プラットフォームの継続的な開発は、Adspert が顧客の成功のために巧みに利用する新しい機会への道を開きます。

Adspert の主な目標は、さまざまなプラットフォームで広告キャンペーンを最適化しながら、ユーザーのプロセスを簡素化することです。 これには、さまざまなプラットフォームにわたって収集された情報を、各プラットフォームの上位レベルで設定された最適な予算に対してバランスをとって使用することが含まれます。 Adspert の焦点は、使用されるプラットフォームに関係なく、顧客の目標達成を最適化することです。 Adspert は、お客様に大きな利点を提供するために、必要に応じてプラットフォームを追加し続けています。

この投稿では、Adspert が次のようなさまざまな AWS サービスを使用して価格設定ツールをゼロから作成した方法を共有します アマゾンセージメーカー また、Adspert と AWSデータラボ このプロジェクトを設計から構築まで記録的な速さで加速します。

価格設定ツールは、製品レベルでの利益を最大化するために、可視性と利益率に基づいて e コマース マーケットプレイスで売り手が選択した製品の価格を再設定します。

売り手として、商品が常に見えるようにすることは不可欠です。これにより売上が増加します。 e コマースの販売で最も重要な要素は、競合他社のオファーではなく、自社のオファーが顧客に表示されるかどうかです。

確かに特定の e コマース プラットフォームに依存しますが、商品の価格は、ビジビリティに影響を与える可能性がある最も重要な重要な数値の XNUMX つです。 ただし、価格は頻繁に急速に変化します。 このため、価格設定ツールは、可視性を高めるためにほぼリアルタイムで動作する必要があります。

ソリューションの概要

次の図は、ソリューションのアーキテクチャを示しています。

このソリューションには、次のコンポーネントが含まれています。

  1. PostgreSQL用のAmazonリレーショナルデータベースサービス(Amazon RDS) RDS for Postgres データベースに保存されている製品情報を含むデータの主なソースです。
  2. 商品の出品変更情報がリアルタイムで届く Amazon シンプル キュー サービス (Amazon SQS)キュー。
  3. Amazon RDS に保存された製品情報は、で利用可能な変更データ キャプチャ (CDC) パターンを使用して、ほぼリアルタイムで raw レイヤーに取り込まれます。 AWSデータベース移行サービス (AWS DMS)。
  4. Amazon SQS からの商品リスト通知は、 AWSラムダ 機能。
  5. 元のソース データは、 Amazon シンプル ストレージ サービス (Amazon S3) Parquet データ形式を使用した生レイヤー バケット。 このレイヤーは、データ レイクの信頼できる唯一の情報源です。 このストレージで使用されるパーティショニングは、データの増分処理をサポートします。
  6. AWSグルー 抽出、変換、ロード (ETL) ジョブは、製品データをクリーンアップし、重複を削除し、特定のビジネス ケースに関連付けられていないデータ統合と一般的な変換を適用します。
  7. Amazon S3 ステージレイヤーは、さらに処理するために Apache Parquet 形式で保存された準備済みデータを受け取ります。 ステージ ストアで使用されるパーティショニングは、データの増分処理をサポートします。
  8. このレイヤーで作成された AWS Glue ジョブは、Amazon S3 ステージ レイヤーで利用可能なデータを使用します。 これには、ユース ケース固有のビジネス ルールと必要な計算の適用が含まれます。 これらのジョブの結果データは、Amazon S3 分析レイヤーに保存されます。
  9. Amazon S3 分析レイヤーは、トレーニング目的で ML モデルによって使用されるデータを保存するために使用されます。 キュレートされたストアで使用されるパーティショニングは、予想されるデータ使用量に基づいています。 これは、ステージ レイヤーで使用されるパーティショニングとは異なる場合があります。
  10. 再価格設定 ML モデルは、SageMaker スクリプト モードでの Scikit-Learn Random Forest 実装であり、S3 バケット (分析レイヤー) で利用可能なデータを使用してトレーニングされます。
  11. AWS Glue データ処理ジョブは、リアルタイムの推論のためにデータを準備します。 このジョブは、S3 バケット (ステージレイヤー) に取り込まれたデータを処理し、SageMaker 推論エンドポイントを呼び出します。 データは、SageMaker の価格変更モデルで使用できるように準備されています。 AWS Glue が Lambda より好まれました。これは、大量のデータ (数十億の毎日のトランザクション) に対する結合やウィンドウ関数など、さまざまな複雑なデータ処理操作が推論に必要なためです。 価格改定モデルの呼び出しの結果は、S3 バケット (推論レイヤー) に保存されます。
  12. SageMaker トレーニング ジョブは、SageMaker エンドポイントを使用してデプロイされます。 このエンドポイントは AWS Glue 推論プロセッサによって呼び出され、ほぼリアルタイムの価格推奨を生成して製品の可視性を高めます。
  13. SageMaker 推論エンドポイントによって生成された予測は、Amazon S3 推論レイヤーに保存されます。
  14. Lambda 予測オプティマイザ関数は、SageMaker 推論エンドポイントによって生成された推奨事項を処理し、販売量と販売マージンの間のトレードオフを適用して、販売者の利益を最大化することに焦点を当てた新しい価格推奨事項を生成します。
  15. Lambda 予測オプティマイザーによって生成された価格の推奨事項は、市場での製品価格を更新する価格変更 API に送信されます。
  16. Lambda 予測オプティマイザーによって生成された更新された価格の推奨事項は、Amazon S3 最適化レイヤーに保存されます。
  17. AWS Glue 予測ローダー ジョブは、監査とレポートの目的で ML モデルによって生成された予測をソース RDS for Postgres SQL データベースに再読み込みします。 このコンポーネントの実装には AWS Glue Studio が使用されました。 これは、AWS Glue で ETL ジョブを簡単に作成、実行、モニタリングできるグラフィカル インターフェイスです。

データの準備

Adspert の可視性モデルのデータセットは SQS キューから作成され、Lambda を使用してリアルタイムでデータ レイクの raw レイヤーに取り込まれます。 その後、生データは、重複の削除などの単純な変換を実行してサニタイズされます。 このプロセスは AWS Glue に実装されています。 結果は、データ レイクのステージング レイヤーに保存されます。 通知は、特定の製品の競合他社に、価格、フルフィルメント チャネル、配送時間、その他多くの変数を提供します。 また、プラットフォームに依存する可視性の尺度も提供します。これは、ブール変数 (可視または不可視) として表すことができます。 オファーの変更が発生するたびに通知を受け取ります。これにより、顧客のすべての製品で毎月数百万のイベントが追加されます。

このデータセットから、次のようにトレーニング データを抽出します。通知ごとに、表示されているオファーと表示されていないすべてのオファーをペアにし、その逆も行います。 すべてのデータ ポイントは、明確な勝者と敗者が存在する 3 つの売り手間の競争を表しています。 この処理ジョブは、Spark を使用して AWS Glue ジョブに実装されています。 準備されたトレーニング データセットは、SageMaker で使用される分析 SXNUMX バケットにプッシュされます。

モデルを訓練する

特定のオファーが表示される場合、モデルはオファーの各ペアを分類します。 このモデルにより、お客様にとって最適な価格を計算し、競争に基づいて可視性を高め、利益を最大化することができます。 それに加えて、この分類モデルは、リストが表示されているか表示されていないかについて、より深い洞察を提供してくれます。 次の機能を使用します。

  • 競合他社の価格に対する当社の価格の比率
  • フルフィルメント チャネルの違い
  • 各売り手のフィードバックの量
  • 各販売者のフィードバック評価
  • 最短発送時間の違い
  • 最大配送時間の違い
  • 各販売者の製品の在庫状況

Adspert は、SageMaker を使用してモデルのトレーニングとホストを行います。 Scikit-Learn ランダム フォレストの実装を使用します。 SageMaker スクリプトモード. また、トレーニング スクリプトの Scikit-Learn パイプラインに、いくつかの機能の前処理を直接含めています。 次のコードを参照してください。

import numpy as np

def transform_price(X):
    X = X.to_numpy()
    return np.log(
        X[:, 0] / np.nanmin([X[:, 1], X[:, 2]], axis=0),
    ).reshape(-1, 1)

def difference(X):
    X = X.to_numpy()
    return (X[:, 0] - X[:, 1]).reshape(-1, 1)

def fulfillment_difference(X):
    X = X.astype(int)
    return difference(X)

最も重要な前処理関数の XNUMX つは、 transform_price、競合他社の価格と外部価格列の最小値で価格を割ります。 これは、モデルの精度に関連する影響がある機能であることがわかりました。 また、対数を適用して、モデルが絶対的な価格差ではなく、相対的な価格差に基づいて決定できるようにします。

training_script.py スクリプトでは、まず Scikit-Learn のビルド方法を定義します ColumnTransformer 指定されたトランスフォーマーをデータフレームの列に適用するには:

import argparse
import os
from io import StringIO

import joblib
import numpy as np
import pandas as pd
from custom_transformers import difference
from custom_transformers import fulfillment_difference
from custom_transformers import transform_price
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import FunctionTransformer
from sklearn.preprocessing import OneHotEncoder

def make_preprocessor():
    return ColumnTransformer([
        ('price_by_smallest_cp', FunctionTransformer(transform_price),
         ['price', 'competitor_price', 'external_price']),
        (fulfillment_difference, FunctionTransformer(fulfillment_difference),
         ['fulfillment', 'competitor_'fulfillment']),
        ('feedback_count', 'passthrough',
         ['feedback_count', 'competitor_feedback_count']),
        ('feedback_rating', 'passthrough',
         ['feedback_rating', 'competitor_feedback_rating']),
        (
            'availability_type',
            OneHotEncoder(categories=[['NOW'], ['NOW']],
                          handle_unknown='ignore'),
            ['availability_type', 'competitor_availability_type'],
        ),
        ('min_shipping', FunctionTransformer(difference),
         ['minimum_shipping_hours', 'competitor_min_shipping_hours']),
        ('max_shipping', FunctionTransformer(difference),
         ['maximum_shipping_hours', 'competitor_max_shipping_hours']),
    ], remainder='drop')

トレーニング スクリプトでは、Parquet から Pandas データフレームにデータを読み込み、 ColumnTranformerRandomForestClassifier、モデルをトレーニングします。 その後、モデルは次を使用してシリアル化されます joblib:

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--output-data-dir', type=str,
                        default=os.environ['SM_OUTPUT_DATA_DIR'])
    parser.add_argument('--model-dir', type=str,
                        default=os.environ['SM_MODEL_DIR'])
    parser.add_argument('--train', type=str,
                        default=os.environ['SM_CHANNEL_TRAIN'])

    args = parser.parse_args()

    # load training data
    input_files = [os.path.join(args.train, file)
                   for file in os.listdir(args.train)]
    if len(input_files) == 0:
        raise ValueError
    raw_data = [pd.read_parquet(file) for file in input_files]
    train_data = pd.concat(raw_data)

    # split data set into x and y values
    train_y = train_data.loc[:, 'is_visible']

    if train_y.dtype != 'bool':
        raise ValueError(f'Label 'is_visible' has to be dtype bool but is'
                         f' {train_y.dtype}')

    train_X = train_data.drop('is_visible', axis=1)

    # fit the classifier pipeline and store the fitted model
    clf = Pipeline([
        ('preprocessor', make_preprocessor()),
        ('classifier', RandomForestClassifier(random_state=1)),
    ])
    clf.fit(train_X, train_y)
    joblib.dump(clf, os.path.join(args.model_dir, 'model.joblib'))

トレーニング スクリプトでは、推論用の関数も実装する必要があります。

  • 入力_fn – ペイロードのリクエストボディからのデータを解析する責任があります
  • モデル_fn – スクリプトのトレーニング セクションでダンプされたモデルをロードして返します
  • 予測_fn – ペイロードからのデータを使用してモデルから予測を要求するための実装が含まれています
  • 予測プロバ – 予測された可視性曲線を描くために、クラス確率を predict_proba 関数、分類子のバイナリ予測の代わりに

次のコードを参照してください。

def input_fn(request_body, request_content_type):
    """Parse input data payload"""
    if request_content_type == 'text/csv':
        df = pd.read_csv(StringIO(request_body))
        return df
    else:
        raise ValueError(f'{request_content_type} not supported by script!')


def predict_fn(input_data, model):
    """Predict the visibilities"""
    classes = model.classes_

    if len(classes) != 2:
        raise ValueError('Model has more than 2 classes!')

    # get the index of the winning class
    class_index = np.where(model.classes_ == 1)[0][0]

    output = model.predict_proba(input_data)
    return output[:, class_index]


def model_fn(model_dir):
    """Deserialized and return fitted model

    Note that this should have the same name as the serialized model in the
    main method
    """
    clf = joblib.load(os.path.join(model_dir, 'model.joblib'))
    return clf

次の図は、 ランダムフォレスト分類子.

Amazon SageMaker PlatoBlockchain Data Intelligence を使用して、最大の利益を得るための最適な価格設定。 垂直検索。 あい。

SageMaker を使用すると、既存のインスタンスに負荷をかけたり、十分なリソースを備えた別のマシンをセットアップしたりすることなく、大量のデータ (最大 14 億の毎日のトランザクション) でモデルをトレーニングすることができました。 さらに、インスタンスはトレーニングジョブの直後にシャットダウンされるため、SageMaker を使用したトレーニングは非常に費用対効果が高くなりました。 SageMaker を使用したモデルのデプロイは、追加のワークロードなしで機能しました。 モデルを推論エンドポイントとしてホストするには、Python SDK での単一の関数呼び出しで十分であり、SageMaker Python SDK を使用して他のサービスからも簡単にリクエストできます。 次のコードを参照してください。

from sagemaker.sklearn.estimator import SKLearn

FRAMEWORK_VERSION = "0.23-1"
script_path = 'training_script.py'
output_location = f's3://{bucket}/{folder}/output'
source_dir = 'source_dir'

sklearn = SKLearn(
    entry_point=script_path,
    source_dir=source_dir,
    framework_version=FRAMEWORK_VERSION,
    instance_type='ml.m5.large',
    role=role,
    sagemaker_session=sagemaker_session,
    output_path=output_location)

sklearn.fit({'train': training_path})

モデル アーティファクトは、fit 関数によって Amazon S3 に保存されます。 次のコードに見られるように、モデルは SKLearnModel モデル アーティファクト、スクリプト パス、およびその他のパラメータを使用してオブジェクトを作成します。 その後、目的のインスタンス タイプとインスタンス数にデプロイできます。

model = sagemaker.sklearn.model.SKLearnModel(
    model_data=f'{output_location}/sagemaker-scikit-learn-2021-02-23-11-13-30-036/output/model.tar.gz',
    source_dir=source_dir,
    entry_point=script_path,
    framework_version=FRAMEWORK_VERSION,
    sagemaker_session=sagemaker_session,
    role=role
)
ENDPOINT_NAME = 'visibility-model-v1'
model.deploy(
    initial_instance_count=1,
    instance_type='ml.m5.large',
    endpoint_name=ENDPOINT_NAME
)

モデルをリアルタイムで評価する

いずれかの製品について新しい通知が送信されるたびに、最適な価格を計算して送信したいと考えています。 最適な価格を計算するために、可能な価格の範囲について、自社のオファーと各競合他社のオファーを比較する予測データセットを作成します。 これらのデータポイントは SageMaker エンドポイントに渡され、特定の価格ごとに各競合他社に対して表示される予測確率が返されます。 目に見える確率を 予測可視性. 結果は、次の図に示すように、価格と可視性の関係を表す各競合他社の曲線として視覚化できます。

Amazon SageMaker PlatoBlockchain Data Intelligence を使用して、最大の利益を得るための最適な価格設定。 垂直検索。 あい。

この例では、競合他社 1 に対する可視性はほぼ区分定数関数であり、可視化するには主に特定のしきい値 (ほぼ競合他社の価格) よりも価格を下げる必要があることを示唆しています。 ただし、競合他社 2 に対する可視性はそれほど急激には低下しません。 その上、非常に高い価格でも 50% の確率で表示される可能性があります。 入力データを分析すると、競合他社の評価が低く、たまたま非常に低いことがわかりました。 私たちのモデルは、この特定の e コマース プラットフォームが、フィードバック評価の低い販売者に不利になることを学習しました。 フルフィルメント チャネルや配送時間など、他の機能についても同様の効果があることを発見しました。

SageMaker エンドポイントに対する必要なデータ変換と推論は、AWS Glue に実装されています。 AWS Glue ジョブは、Lambda から取り込まれたリアルタイム データに対してマイクロバッチで動作します。

最後に、考えられる各価格の予測可視性である、集約された可視性曲線を計算します。 当社のオファーは、他のすべての販売者のオファーよりも優れている場合に表示されます。 与えられた価格で各売り手に対して表示される確率の間の独立性を仮定すると、すべての売り手に対して表示される確率は、それぞれの確率の積になります。 つまり、すべての曲線を乗算することで、集約された可視性曲線を計算できます。

次の図は、SageMaker エンドポイントから返される予測された可視性を示しています。

Amazon SageMaker PlatoBlockchain Data Intelligence を使用して、最大の利益を得るための最適な価格設定。 垂直検索。 あい。

次の図は、集約された可視性曲線を示しています。

Amazon SageMaker PlatoBlockchain Data Intelligence を使用して、最大の利益を得るための最適な価格設定。 垂直検索。 あい。

最適な価格を計算するには、可視性曲線を最初に平滑化し、次にマージンを掛けます。 マージンを計算するには、商品のコストと手数料を使用します。 売上原価と手数料は、AWS DMS を介して同期される静的な製品情報です。 Adspert は利益関数に基づいて最適な価格を計算し、プラットフォームの API を介して e コマース プラットフォームに送信します。

これは、AWS Lambda 予測オプティマイザーに実装されています。

次の図は、予測される可視性と価格の関係を示しています。

Amazon SageMaker PlatoBlockchain Data Intelligence を使用して、最大の利益を得るための最適な価格設定。 垂直検索。 あい。

次の図は、価格と利益の関係を示しています。

Amazon SageMaker PlatoBlockchain Data Intelligence を使用して、最大の利益を得るための最適な価格設定。 垂直検索。 あい。

まとめ

Adspert の利益最大化に対する既存のアプローチは、広告からの収益を増やすための入札管理に重点を置いています。 ただし、eコマース市場で優れたパフォーマンスを達成するには、売り手は広告と自社製品の競争力のある価格設定の両方を考慮する必要があります. 可視性を予測するこの新しい ML モデルを使用すると、機能を拡張して顧客の価格を調整することもできます。

新しい価格設定ツールは、リアルタイムのデータ変換、予測、および価格の最適化だけでなく、大量のデータで ML モデルの自動トレーニングを実行できる必要があります。 この投稿では、価格最適化エンジンの主な手順と、AWS Data Lab と協力してこれらの目標を達成するために実装した AWS アーキテクチャについて説明しました。

ML モデルをコンセプトから本番環境に移行することは、通常、複雑で時間がかかります。 モデルをトレーニングするために大量のデータを管理し、トレーニングに最適なアルゴリズムを選択し、トレーニング中にコンピューティング能力を管理してから、モデルを運用環境にデプロイする必要があります。 SageMaker は、ML モデルの構築とデプロイをより簡単にすることで、この複雑さを軽減しました。 利用可能な幅広い選択肢から適切なアルゴリズムとフレームワークを選択した後、SageMaker は、モデルをトレーニングして本番環境にデプロイするために、基盤となるすべてのインフラストラクチャを管理しました。

SageMaker に慣れ始めたい場合は、 イマージョンデイ ワークショップ 機能エンジニアリング、さまざまな組み込みアルゴリズムから ML ユースケースを構築する方法、および本番環境のようなシナリオで ML モデルをトレーニング、調整、デプロイする方法についてエンドツーエンドの理解を得るのに役立ちます。 独自のモデルを持ち込み、オンプレミスの ML ワークロードを SageMaker プラットフォームにリフトアンドシフトする方法を説明します。 モデルのデバッグ、モデルのモニタリング、AutoML などの高度な概念をさらに示し、AWS ML Well-Architected レンズを通して ML ワークロードを評価するのに役立ちます。

データ、分析、AI と ML、サーバーレス、コンテナーのモダナイゼーションを含むユースケースの実装を加速するための支援が必要な場合は、 AWSデータラボ.


著者について

Amazon SageMaker PlatoBlockchain Data Intelligence を使用して、最大の利益を得るための最適な価格設定。 垂直検索。 あい。ヴィクトル・エンリコ・ジェニー は、ドイツのベルリンに拠点を置く Adspert のシニア機械学習エンジニアです。 彼は、顧客の利益を増やすために、予測および最適化の問題のソリューションを作成します。 Viktor は応用数学のバックグラウンドがあり、データを扱うのが大好きです。 余暇には、ハンガリー語の学習、格闘技の練習、ギターの演奏を楽しんでいます。

Amazon SageMaker PlatoBlockchain Data Intelligence を使用して、最大の利益を得るための最適な価格設定。 垂直検索。 あい。エンニオ・パストーレ AWS Data Lab チームのデータアーキテクトです。 彼は、ビジネスや一般的な生活にプラスの影響を与える新しいテクノロジーに関連するすべてのことに熱心です。 Ennio は、データ分析で 9 年以上の経験があります。 彼は、企業が通信、銀行、ゲーム、小売、保険などの業界全体でデータ プラットフォームを定義および実装するのを支援しています。

タイムスタンプ:

より多くの AWS機械学習