Оптимальна ціна для максимального прибутку за допомогою Amazon SageMaker PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Оптимальна ціна для максимального прибутку за допомогою Amazon SageMaker

Це гостьовий пост Віктора Енріко Джені, старшого інженера з машинного навчання Adspert.

Adspert – це берлінська компанія ISV, яка розробила інструмент керування ставками, призначений для автоматичної оптимізації ефективності маркетингових і рекламних кампаній. Основним принципом компанії є автоматизація максимізації прибутку від реклами електронної комерції за допомогою штучного інтелекту. Постійний розвиток рекламних платформ відкриває шлях до нових можливостей, які Adspert вміло використовує для успіху своїх клієнтів.

Основна мета Adspert — спростити процес для користувачів, одночасно оптимізуючи рекламні кампанії на різних платформах. Це включає використання інформації, зібраної на різних платформах, збалансованої щодо оптимального бюджету, встановленого на рівні вище кожної платформи. Adspert фокусується на оптимізації досягнення цілей клієнта, незалежно від того, яка платформа використовується. Adspert продовжує додавати платформи за потреби, щоб надати нашим клієнтам значні переваги.

У цій публікації ми розповідаємо, як Adspert створив інструмент ціноутворення з нуля, використовуючи різні сервіси AWS, наприклад Amazon SageMaker і як Adspert співпрацював із Лабораторія даних AWS щоб прискорити цей проект від проектування до будівництва в рекордно короткий час.

Інструмент ціноутворення змінює ціну вибраного продавцем продукту на ринку електронної комерції на основі видимості та норми прибутку, щоб максимізувати прибуток на рівні продукту.

Як продавцю важливо, щоб ваші продукти завжди були на видноті, оскільки це збільшить продажі. Найважливішим фактором продажів через електронну комерцію є те, що клієнти бачать вашу пропозицію, а не пропозицію конкурента.

Хоча це, звичайно, залежить від конкретної платформи електронної комерції, ми виявили, що ціна продукту є одним із найважливіших ключових показників, які можуть впливати на видимість. Однак ціни змінюються часто і швидко; з цієї причини інструмент ціноутворення повинен діяти майже в реальному часі, щоб збільшити видимість.

Огляд рішення

Наступна діаграма ілюструє архітектуру рішення.

Розчин містить такі компоненти:

  1. Служба реляційної бази даних Amazon (Amazon RDS) для PostgreSQL є основним джерелом даних, що містить інформацію про продукт, яка зберігається в базі даних RDS для Postgres.
  2. Інформація про зміни в списку продуктів надходить у режимі реального часу Служба простої черги Amazon (Amazon SQS) черга.
  3. Інформація про продукт, що зберігається в Amazon RDS, надходить майже в реальному часі в необроблений рівень за допомогою шаблону змінення даних (CDC), доступного в Служба міграції бази даних AWS (AWS DMS).
  4. Сповіщення про перелік продуктів, що надходять від Amazon SQS, майже в реальному часі завантажуються на необроблений рівень за допомогою AWS Lambda функції.
  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 для переоцінки — це реалізація Scikit-Learn Random Forest у режимі сценарію SageMaker, яка навчається за допомогою даних, доступних у сегменті S3 (аналітичний рівень).
  11. Завдання обробки даних AWS Glue готує дані для висновку в реальному часі. Завдання обробляє дані, отримані в сегменті S3 (рівень етапу), і викликає кінцеву точку висновку SageMaker. Дані підготовлені для використання в моделі переоцінки SageMaker. AWS Glue було віддано перевагу перед Lambda, оскільки висновок вимагає різних складних операцій обробки даних, таких як об’єднання та віконні функції для великого обсягу даних (мільярди щоденних транзакцій). Результати викликів моделі переоцінки зберігаються у відрі S3 (рівень висновку).
  12. Навчальне завдання SageMaker розгортається за допомогою кінцевої точки SageMaker. Цю кінцеву точку викликає процесор висновку AWS Glue, який генерує рекомендації щодо цін майже в реальному часі для підвищення видимості продукту.
  13. Прогнози, створені кінцевою точкою висновку SageMaker, зберігаються на рівні висновків Amazon S3.
  14. Функція оптимізатора лямбда-прогнозів обробляє рекомендації, створені кінцевою точкою висновку SageMaker, і генерує нову цінову рекомендацію, яка зосереджена на максимізації прибутку продавця, застосовуючи компроміс між обсягом продажів і маржою продажів.
  15. Цінові рекомендації, створені оптимізатором лямбда-прогнозів, надсилаються в API переоцінки, який оновлює ціну продукту на ринку.
  16. Оновлені цінові рекомендації, створені оптимізатором лямбда-прогнозів, зберігаються на рівні оптимізації Amazon S3.
  17. Завдання завантажувача передбачень AWS Glue перезавантажує у вихідну базу даних RDS для Postgres SQL передбачення, згенеровані моделлю ML, для цілей аудиту та звітності. Для реалізації цього компонента використовувався AWS Glue Studio; це графічний інтерфейс, який дозволяє легко створювати, запускати та контролювати завдання ETL в AWS Glue.

Підготовка даних

Набір даних для моделі видимості Adspert створюється з черги SQS і завантажується в необроблений шар нашого озера даних у режимі реального часу за допомогою Lambda. Після цього необроблені дані очищаються шляхом виконання простих перетворень, як-от видалення дублікатів. Цей процес реалізовано в AWS Glue. Результат зберігається на проміжному рівні нашого озера даних. Сповіщення надають інформацію про конкурентів для певного продукту з їхніми цінами, каналами виконання, часом доставки та багатьма іншими змінними. Вони також забезпечують залежну від платформи міру видимості, яка може бути виражена як логічна змінна (видима чи невидима). Ми отримуємо сповіщення кожного разу, коли відбувається зміна пропозиції, що додає до кількох мільйонів подій на місяць для всіх продуктів наших клієнтів.

З цього набору даних ми витягуємо навчальні дані таким чином: для кожного сповіщення ми поєднуємо видимі пропозиції з кожною невидимою пропозицією, і навпаки. Кожна точка даних означає змагання між двома продавцями, у якому є явні переможець і переможений. Це завдання обробки реалізовано в завданні AWS Glue за допомогою Spark. Підготовлений навчальний набір даних надсилається в аналітичне відро S3 для використання SageMaker.

Тренуйте модель

Наша модель класифікує кожну пару пропозицій, якщо дана пропозиція буде видимою. Ця модель дозволяє нам розрахувати найкращу ціну для наших клієнтів, підвищити видимість на основі конкуренції та максимізувати їхній прибуток. Крім того, ця модель класифікації може дати нам глибше розуміння причин того, чому наші списки є видимими або невидимими. Ми використовуємо такі функції:

  • Співвідношення нашої ціни до цін конкурентів
  • Різниця в каналах виконання
  • Кількість відгуків для кожного продавця
  • Рейтинг відгуків кожного продавця
  • Різниця в мінімальному терміні доставки
  • Різниця в максимальному терміні доставки
  • Наявність товару кожного продавця

Adspert використовує SageMaker для навчання та розміщення моделі. Ми використовуємо реалізацію Scikit-Learn Random Forest у Режим сценарію 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)

Однією з найважливіших функцій попередньої обробки є 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, визначаємо конвеєр ColumnTranformer і RandomForestClassifierі навчіть модель. Після цього модель серіалізується за допомогою 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'))

У навчальному сценарії ми також маємо реалізувати функції для висновку:

  • input_fn – Відповідає за аналіз даних із тіла запиту корисного навантаження
  • model_fn – Завантажує та повертає модель, яку було вивантажено в навчальний розділ сценарію
  • predict_fn – Містить нашу реалізацію для запиту передбачення від моделі, використовуючи дані з корисного навантаження
  • predict_proba – Щоб намалювати прогнозовані криві видимості, ми повертаємо ймовірність класу за допомогою 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. Вертикальний пошук. Ai.

За допомогою 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})

Артефакт моделі зберігається в Amazon S3 за допомогою функції підгонки. Як видно з наступного коду, модель може бути завантажена як a 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. Вертикальний пошук. Ai.

У цьому прикладі видимість відносно конкурента 1 є майже кусково-постійною функцією, що свідчить про те, що нам, головним чином, потрібно знизити ціну нижче певного порогу, приблизно ціни конкурента, щоб стати видимими. Однак видимість проти Конкурента 2 не зменшується так різко. Крім того, ми все ще маємо 50% шансів бути помітними навіть за дуже високої ціни. Аналіз вхідних даних виявив, що конкурент має низьку кількість рейтингів, які бувають дуже низькими. Наша модель дізналася, що ця специфічна платформа електронної комерції ставить продавців у невигідне становище з низькими оцінками відгуків. Ми виявили подібні ефекти для інших функцій, як-от канал виконання та час доставки.

Необхідні перетворення даних і висновки щодо кінцевої точки SageMaker реалізовані в AWS Glue. Завдання AWS Glue працює мікропакетами з даними в реальному часі, отриманими з Lambda.

Нарешті, ми хочемо обчислити агреговану криву видимості, яка є прогнозованою видимістю для кожної можливої ​​ціни. Наша пропозиція помітна, якщо вона краща за пропозиції інших продавців. Припускаючи незалежність між ймовірностями бути видимими проти кожного продавця з урахуванням нашої ціни, ймовірність бути видимими проти всіх продавців є добутком відповідних ймовірностей. Це означає, що сукупну криву видимості можна обчислити шляхом множення всіх кривих.

На наступних малюнках показано передбачувану видимість, отриману від кінцевої точки SageMaker.

Оптимальна ціна для максимального прибутку за допомогою Amazon SageMaker PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

На наступному малюнку показано агреговану криву видимості.

Оптимальна ціна для максимального прибутку за допомогою Amazon SageMaker PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Для розрахунку оптимальної ціни крива видимості спочатку згладжується, а потім множиться на маржу. Для розрахунку націнки ми використовуємо вартість товарів і комісії. Вартість проданих товарів і комісії – це статична інформація про продукт, яка синхронізується через AWS DMS. На основі функції прибутку Adspert розраховує оптимальну ціну та надсилає її на платформу електронної комерції через API платформи.

Це реалізовано в оптимізаторі прогнозування AWS Lambda.

На наступному малюнку показано співвідношення між прогнозованою видимістю та ціною.

Оптимальна ціна для максимального прибутку за допомогою Amazon SageMaker PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

На наступному малюнку показано співвідношення між ціною та прибутком.

Оптимальна ціна для максимального прибутку за допомогою Amazon SageMaker PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Висновок

Існуючий підхід Adspert до максимізації прибутку зосереджений на управлінні ставками для підвищення прибутків від реклами. Однак, щоб досягти вищої ефективності на ринках електронної комерції, продавці повинні враховувати як рекламу, так і конкурентоспроможні ціни на свої продукти. Завдяки цій новій моделі ML для прогнозування видимості ми можемо розширити наші функції, щоб також коригувати ціни клієнтів.

Новий інструмент ціноутворення повинен мати можливість автоматизованого навчання моделі ML на великому обсязі даних, а також перетворення даних у реальному часі, прогнози та оптимізацію цін. У цій публікації ми розглянули основні кроки нашого механізму оптимізації цін і архітектуру AWS, яку ми реалізували у співпраці з AWS Data Lab для досягнення цих цілей.

Перенесення моделей ML від концепції до виробництва зазвичай є складним і трудомістким. Вам потрібно керувати великими обсягами даних, щоб навчити модель, вибрати найкращий алгоритм для її навчання, керувати обчислювальною потужністю під час навчання, а потім розгорнути модель у робочому середовищі. SageMaker зменшив цю складність, зробивши набагато простішим створення та розгортання моделі ML. Після того, як ми вибрали правильні алгоритми та фреймворки з широкого діапазону доступних варіантів, SageMaker керував усією базовою інфраструктурою, щоб навчити нашу модель і розгорнути її у виробництві.

Якщо ви хочете почати знайомство з SageMaker, то Воркшоп «День занурення». може допомогти вам отримати наскрізне розуміння того, як створювати сценарії використання ML на основі розробки функцій, різноманітних вбудованих алгоритмів, а також як навчати, налаштовувати та розгортати модель ML у сценарії, схожому на виробництво. Він допоможе вам створити власну модель і виконати локальне робоче навантаження ML на платформі SageMaker. Крім того, він демонструє передові концепції, такі як налагодження моделі, моніторинг моделі та AutoML, і допомагає оцінити робоче навантаження ML через об’єктив AWS ML Well-Architected.

Якщо вам потрібна допомога в прискоренні впровадження сценаріїв використання даних, аналітики, штучного інтелекту та машинного навчання, безсерверної модернізації та модернізації контейнерів, зверніться до Лабораторія даних AWS.


Про авторів

Оптимальна ціна для максимального прибутку за допомогою Amazon SageMaker PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.Віктор Енріко Джені є старшим інженером з машинного навчання в Adspert у Берліні, Німеччина. Він створює рішення для задач прогнозування та оптимізації з метою збільшення прибутків клієнтів. Віктор має досвід у прикладній математиці та любить працювати з даними. У вільний час він любить вивчати угорську мову, займатися бойовими мистецтвами та грати на гітарі.

Оптимальна ціна для максимального прибутку за допомогою Amazon SageMaker PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.Енніо Пасторе є архітектором даних у команді AWS Data Lab. Він є ентузіастом всього, що пов’язано з новими технологіями, які позитивно впливають на бізнес і загальний рівень життя. Енніо має понад 9 років досвіду в аналітиці даних. Він допомагає компаніям визначати та впроваджувати платформи даних у таких галузях, як телекомунікації, банківська справа, ігри, роздрібна торгівля та страхування.

Часова мітка:

Більше від AWS Машинне навчання