AI-персонализация в beauty-ритейле
Beauty-ритейл — одна из наиболее персонализированных категорий: оттенок тонального крема, который подходит одному человеку, не подойдёт другому. AI в beauty решает задачи подбора оттенка по фото, предсказания совместимости продуктов и создания персональных рутин ухода.
import pandas as pd
import numpy as np
from sklearn.neighbors import NearestNeighbors
class BeautyPersonalizationEngine:
"""Персонализация в beauty на основе тона кожи и предпочтений"""
def match_foundation_shade(self, user_skin_tone: dict,
product_catalog: pd.DataFrame) -> list[dict]:
"""
Подбор оттенка тонального крема по параметрам тона кожи.
user_skin_tone: {'l': 65.0, 'a': 12.0, 'b': 18.0} (LAB цветовое пространство)
"""
# LAB цвет: L=светлота, a=красный/зелёный, b=жёлтый/синий
user_lab = np.array([
user_skin_tone.get('l', 65),
user_skin_tone.get('a', 12),
user_skin_tone.get('b', 18),
])
foundations = product_catalog[product_catalog['category'] == 'foundation'].copy()
if foundations.empty:
return []
shade_lab = foundations[['shade_l', 'shade_a', 'shade_b']].fillna(0).values
# Евклидово расстояние в LAB (перцептуально равномерное)
distances = np.linalg.norm(shade_lab - user_lab, axis=1)
foundations['color_distance'] = distances
foundations['match_score'] = 1 / (1 + distances / 10) # Нормализация
top_matches = foundations.nsmallest(5, 'color_distance')
return [
{
'product_id': row['product_id'],
'shade_name': row.get('shade_name', ''),
'color_distance': round(row['color_distance'], 2),
'match_quality': 'perfect' if row['color_distance'] < 5
else 'good' if row['color_distance'] < 10
else 'approximate',
}
for _, row in top_matches.iterrows()
]
def build_beauty_routine(self, skin_profile: dict,
available_products: pd.DataFrame,
budget: float = 200.0) -> dict:
"""
Составление персональной бьюти-рутины в рамках бюджета.
Оптимизирует покрытие проблем при минимальном количестве шагов.
"""
concerns = skin_profile.get('concerns', ['hydration'])
skin_type = skin_profile.get('skin_type', 'normal')
routine_steps = ['cleanser', 'toner', 'serum', 'moisturizer', 'spf']
routine = {}
remaining_budget = budget
for step in routine_steps:
step_products = available_products[
available_products['routine_step'] == step
].copy()
if step_products.empty:
continue
# Фильтр по типу кожи
step_products = step_products[
step_products['suitable_skin_types'].apply(
lambda t: skin_type in t if isinstance(t, list) else True
)
]
# Приоритет по покрытию целей ухода
def concern_coverage(row):
product_benefits = row.get('targets_concerns', [])
if not isinstance(product_benefits, list):
return 0
return len(set(concerns) & set(product_benefits)) / max(len(concerns), 1)
step_products['coverage'] = step_products.apply(concern_coverage, axis=1)
# Выбор лучшего в рамках бюджета
affordable = step_products[step_products['price'] <= remaining_budget]
if affordable.empty:
continue
affordable = affordable.copy()
affordable['value_score'] = (
affordable['coverage'] * 0.5 +
affordable['avg_rating'].fillna(3.5) / 5.0 * 0.3 +
(1 - affordable['price'] / remaining_budget) * 0.2
)
best = affordable.nlargest(1, 'value_score').iloc[0]
routine[step] = {
'product_id': best['product_id'],
'name': best.get('name', ''),
'price': best['price'],
'concern_coverage': round(best['coverage'], 2),
}
remaining_budget -= best['price']
return {
'routine': routine,
'total_cost': round(budget - remaining_budget, 2),
'budget_remaining': round(remaining_budget, 2),
'steps_count': len(routine),
}
AI-персонализация в beauty увеличивает средний чек на 22-38% за счёт кросс-продаж совместимых продуктов и снижает возвраты на 30% благодаря точному подбору оттенков. Ключевые технологии: LAB-цветовое пространство для shade matching, NLP для анализа отзывов по типу кожи, ingredient graph для совместимости.







