Эксперимент

Оптимизация производительности игры с помощью экспериментов: руководство для начинающих

Понимание случайных экспериментов, квазислучайных экспериментов и многоруких бандитов для игровых экспериментов

Разработка игр — это быстрорастущая область, которая в значительной степени зависит от принятия решений на основе данных. Дизайнеры и разработчики игр используют эксперименты для оценки и оптимизации функций и механизмов своих игр. Однако разработка экспериментов, позволяющих эффективно собирать данные, может быть сложной задачей. Случайные эксперименты, квазислучайные эксперименты и многорукие бандиты — три популярные стратегии, которые можно использовать для разработки экспериментов для игр. В этом сообщении блога мы подробно рассмотрим эти три стратегии, включая их математические основы, практические приложения и реализации Python.

Случайные эксперименты

Случайные эксперименты включают случайное назначение лечения группе участников и измерение результата. Цель случайных экспериментов состоит в том, чтобы свести к минимуму предвзятость и гарантировать, что группы лечения сопоставимы во всех аспектах, кроме самого лечения.

Планирование случайных экспериментов

Случайные эксперименты могут быть спланированы несколькими способами, в том числе:

  • Простая случайная выборка: это включает в себя случайный выбор участников из популяции и распределение их по группам лечения.
  • Стратифицированная случайная выборка: это включает в себя разделение населения на подгруппы на основе характеристик, таких как возраст или пол, а затем случайный выбор участников из каждой подгруппы.
  • Кластерная случайная выборка: это включает в себя случайный выбор кластеров, таких как школы или районы, а затем распределение участников внутри кластера по лечебным группам.

Самый распространенный метод анализа случайных экспериментов – проверка гипотез. Это включает в себя сравнение результатов лечения и контрольной группы с использованием статистических тестов, чтобы определить, имело ли лечение значительный эффект.

Реализация Python

Чтобы проиллюстрировать, как провести случайный эксперимент в Python, мы будем использовать следующий пример:

Предположим, мы хотим проверить, увеличивает ли новая игровая функция, например обучение, удержание игроков. Мы можем случайным образом распределить участников в лечебную группу, где они получают обучающее пособие, или в контрольную группу, где они этого не делают. Затем мы можем измерить коэффициент удержания каждой группы и сравнить их с помощью проверки гипотез.

Вот пример кода Python для проведения случайного эксперимента:

import numpy as np
from scipy.stats import ttest_ind

# Generate random data for treatment and control groups
treatment = np.random.normal(10, 2, size=100)
control = np.random.normal(8, 2, size=100)
# Calculate the mean and standard deviation of each group
treatment_mean = np.mean(treatment)
control_mean = np.mean(control)
treatment_std = np.std(treatment)
control_std = np.std(control)
# Conduct a two-sample t-test to compare the means of the two groups
t_stat, p_value = ttest_ind(treatment, control, equal_var=False)
# Print the results
print("Treatment Mean:", treatment_mean)
print("Control Mean:", control_mean)
print("Treatment Std:", treatment_std)
print("Control Std:", control_std)
print("T-Statistic:", t_stat)
print("P-Value:", p_value)

Квазислучайные эксперименты

Квазислучайные эксперименты подобны случайным экспериментам, но в них используется более систематический подход к назначению лечения. Вместо случайного распределения участников по группам лечения в квазислучайных экспериментах используется заранее определенный метод, чтобы гарантировать, что каждая группа лечения похожа во всех аспектах, кроме самого лечения.

Планирование квазислучайных экспериментов

Существует несколько методов планирования квазислучайных экспериментов, в том числе:

  • Стратифицированная выборка: это включает в себя разделение населения на подгруппы на основе характеристик, таких как возраст или пол, а затем распределение участников из каждой подгруппы по лечебным группам.
  • Сопоставление: это включает в себя сопоставление участников экспериментальной группы с участниками контрольной группы на основе схожих характеристик, таких как возраст, пол или уровень навыков.
  • Рандомизация блоков: это включает в себя разделение населения на блоки на основе характеристик, таких как местоположение или время, а затем случайное назначение лечения в каждом блоке.

Анализ квазислучайных экспериментов аналогичен анализу случайных экспериментов. Проверка гипотез может быть использована для сравнения результатов лечения и контрольной группы и определения того, имело ли лечение значительный эффект.

Реализация Python

Чтобы проиллюстрировать, как проводить квазислучайный эксперимент в Python, мы будем использовать следующий пример:

Предположим, мы хотим проверить, повышает ли вовлеченность игроков новая функция игры, например система вознаграждений. Мы можем использовать рандомизацию блоков, чтобы разделить игроков на блоки в зависимости от их местоположения, а затем случайным образом назначить лечение в каждом блоке. Затем мы можем измерить уровень вовлеченности каждой группы и сравнить их с помощью проверки гипотез.

Вот пример кода Python для проведения квазислучайного эксперимента:

import numpy as np
from scipy.stats import ttest_ind

# Generate random data for treatment and control groups
locations = np.array(['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'])
treatment = np.array([1, 0, 1, 0, 0, 0, 1, 0, 1])
control = np.array([0, 1, 0, 1, 1, 1, 0, 1, 0])

# Calculate the mean and standard deviation of each group
treatment_mean = np.mean(treatment)
control_mean = np.mean(control)
treatment_std = np.std(treatment)
control_std = np.std(control)

# Conduct a two-sample t-test to compare the means of the two groups
t_stat, p_value = ttest_ind(treatment, control, equal_var=False)
# Print the results
print("Treatment Mean:", treatment_mean)
print("Control Mean:", control_mean)
print("Treatment Std:", treatment_std)
print("Control Std:", control_std)
print("T-Statistic:", t_stat)
print("P-Value:", p_value)

if p_value < 0.05:
    print('Treatment & control group are different')

Многорукие бандиты

Многорукие бандиты — это тип дизайна эксперимента, который позволяет динамически распределять лечение для максимизации желаемого результата. В многоруких бандитах участников случайным образом распределяют по разным видам лечения, а распределение лечения корректируется на основе результатов предыдущих участников.

Проектирование многоруких бандитов

Существует несколько методов конструирования многоруких бандитов, в том числе:

  • Эпсилон-жадный: этот метод включает случайный выбор лечения с вероятностью 1 эпсилон и выбор наиболее эффективного лечения с вероятностью эпсилон.
  • Верхняя доверительная граница (UCB): этот метод включает выбор обработок на основе верхней доверительной границы эффективности обработки, которая уравновешивает разведку и эксплуатацию.
  • Выборка Томпсона: этот метод включает моделирование распределения вероятностей эффективности каждого лечения и случайный выбор лечения на основе распределения вероятностей.

Анализ многоруких бандитов включает в себя измерение эффективности стратегии распределения в максимизации желаемого результата, такого как удержание или вовлеченность игроков.

Реализация Python

Чтобы проиллюстрировать, как провести эксперимент с многоруким бандитом в Python, мы будем использовать следующий пример:

Предположим, мы хотим протестировать несколько различных функций игры, таких как обучение, система вознаграждений и система чата, чтобы определить, какая функция максимально удерживает игроков. Мы можем использовать эпсилон-жадный метод для динамического распределения процедур на основе результатов предыдущих участников.

Вот пример кода Python для проведения эксперимента с многорукими бандитами:

import numpy as np
# Define the treatments
treatments = ['Tutorial', 'Reward System', 'Chat System']
# Define the epsilon value
epsilon = 0.2
# Initialize the rewards and counts for each treatment
rewards = [0] * len(treatments)
counts = [0] * len(treatments)
# Define the function for selecting a treatment
def select_treatment():
    if np.random.rand() < epsilon:
        # Select a random treatment
        return np.random.choice(len(treatments))
    else:
        # Select the treatment with the highest expected reward
        expected_rewards = [rewards[i] / counts[i] if counts[i] > 0 else 0 for i in range(len(treatments))]
        return np.argmax(expected_rewards)
# Simulate the experiment for 100 participants
for i in range(100):
    # Select a treatment and record the outcome
    treatment = select_treatment()
    if treatment == 0:
        outcome = np.random.binomial(1, 0.9)
    elif treatment == 1:
        outcome = np.random.binomial(1, 0.7)
    else:
        outcome = np.random.binomial(1, 0.5)
    # Update the rewards and counts for the selected treatment
    rewards[treatment] += outcome
    counts[treatment] += 1
# Print the results
for i in range(len(treatments)):
    print(treatments[i], "Reward:", rewards[i], "Count:", counts[i])

Связанная записная книжка Kaggle -



Заключение

Проведение экспериментов в играх имеет решающее значение для повышения вовлеченности игроков, удержания и общей производительности игры. Случайные эксперименты — это самый простой тип дизайна эксперимента, в то время как квазислучайные эксперименты и многорукие бандиты позволяют более динамично распределять методы лечения. Каждый метод имеет свои сильные и слабые стороны, и выбор плана эксперимента зависит от вопроса исследования и доступных ресурсов. Тщательно разрабатывая и анализируя эксперименты, разработчики игр могут оптимизировать свои игры и обеспечить лучший игровой опыт для своих игроков.

Рекомендации

  1. https://en.wikipedia.org/wiki/Эксперимент_(теория_вероятности)
  2. https://en.wikipedia.org/wiki/Квази-эксперимент
  3. https://en.wikipedia.org/wiki/Многорукий_бандит
  4. https://booking.ai/how-booking-com-increases-the-power-of-online-experiments-with-cuped-995d186fff1d

Если вы дочитали до сих пор, большое спасибо за чтение! Надеюсь, эта статья окажется для вас полезной.Если хотите, добавьте меня в LinkedIn!

Удачи на этой неделе,
Пратюш