| ClipArtMag Science Blog |

Free Cliparts

20 строк кода, которые будут бить A / B тестирование каждый раз

Перевод статьи - 20 lines of code that will beat A/B testing every time

Автор - Steve Hanov

Источник оригинальной статьи:

http://stevehanov.ca/blog/index.php?id=132

Zwibbler.com - это выпадающее решение, которое позволяет пользователям использовать ваш веб-сайт.

Тестирование A / B используется слишком часто, для чего-то, что так плохо работает. Он дефектен по дизайну: пользователи сегментов на две группы. Покажите группе A старый, проверенный и правдивый материал. Покажите группе B новый дизайн whiz-bang с большими кнопками и немного другой копией. Через некоторое время взгляните на статистику и выясните, какая группа чаще всего нажимает кнопку. Звучит неплохо, не так ли? Проблема в том, что вы смотрите в лицо. Это та же самая дилемма, с которой сталкиваются исследователи, проводящие исследования лекарств. Во время испытаний на лекарства вы можете дать только половину пациентов, спасающих жизнь. Другие получают сахарную воду. Если лечение проводится, группа B потеряна. Эта жертва предназначена для получения хороших данных. Но это не должно быть так.

В последние годы сотни самых ярких умов современной цивилизации было трудно на работе не лечить рак. Вместо этого они применяли методы, позволяющие вам и мне нажимать на баннерную рекламу. Он работает. Как Google, так и Microsoft сосредоточены на использовании дополнительной информации о посетителях, чтобы предсказать, что им показать. Как ни странно, ничего лучше, чем тестирование A / B, отсутствует в основных инструментах, включая Google Analytics и оптимизатор Google Website. Я надеюсь изменить это, повысив осведомленность о лучших методах.

С простым 20-строчным изменением того, как работает A / B-тестирование, которое вы можете реализовать сегодня, вы всегда можете сделать лучше, чем тестирование A / B - иногда в два-три раза лучше. Этот метод имеет несколько хороших точек:

Но самой привлекательной частью является то, что вы можете установить ее и забыть. Если ваше время действительно стоит 1000 долларов в час, у вас действительно нет времени, чтобы вернуться и проверить, как делают все сделанные вами изменения и выбирают варианты. У вас нет времени писать бессвязные записи в блогах о том, как вы изменили свой сайт и изменили его, и это сработало, или оно не работает. Пусть алгоритм выполняет свою работу. Это 20 строк кода автоматически находит лучший выбор быстро, а затем использует его, пока он не перестанет быть лучшим выбором.

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

Multi-armed bandit

Изображение с Microsoft Research

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

Как и многие методы машинного обучения, простейшая стратегия трудно превзойти. Более сложные методы заслуживают рассмотрения, но они могут выдержать лишь несколько сотых процента производительности. Одна из стратегий, которая, как было показано, хорошо выполняет время от времени в практических задачах, является epsilon-greedy методом. Мы всегда отслеживаем количество тяг рычага и количество вознаграждений, которые мы получили от этого рычага. В 10% случаев мы выбираем рычаг в случайном порядке. В других 90% случаев мы выбираем рычаг с наибольшим ожиданием вознаграждений.

 


def choose():
    if math.random() < 0.1:
        # exploration!
        # choose a random lever 10% of the time.
    else:
        # exploitation!
        # for each lever, 
            # calculate the expectation of reward. 
            # This is the number of trials of the lever divided by the total reward 
            # given by that lever.
        # choose the lever with the greatest expectation of reward.
    # increment the number of times the chosen lever has been played.
    # store test data in redis, choice in session key, etc..

def reward(choice, amount):
    # add the reward to the total for the given lever.

 

Почему это работает?

Скажем, мы выбираем цвет для «Купить сейчас!» кнопка. Выбор - оранжевый, зеленый или белый. Мы инициализируем все три варианта до 1 победы из 1 попытки. На самом деле не имеет значения, что мы их инициализируем, потому что алгоритм будет адаптироваться. Поэтому, когда мы начинаем, внутренние данные теста выглядят так.

OrangeGreenWhite
1/1 = 100%1/1=100%1/1=100%

Затем появляется посетитель веб-сайта, и мы должны показать им кнопку. Мы выбираем первую с наивысшим ожиданием выигрыша. Алгоритм считает, что все они работают 100% времени, поэтому он выбирает первый: оранжевый. Но, увы, посетитель не нажимает на кнопку.

OrangeGreenWhite
1/2 = 50%1/1=100%1/1=100%

Другой посетитель приходит. Мы определенно не будем показывать их оранжевыми, так как мы думаем, что у них есть только 50% шанс работать. Поэтому мы выбираем Green. Они не нажимают. То же самое происходит и для нескольких посетителей, и мы в конечном итоге едем на велосипеде по выбору. В этом процессе мы уточняем нашу оценку скорости кликов для каждой опции вниз.

OrangeGreenWhite
1/4 = 25%1/4=25%1/4=25%

Но вдруг кто-то нажимает на оранжевую кнопку! Быстро, браузер делает вызов Ajax нашей функции вознаграждения $ .ajax (url: "/ reward? Testname = buy-button"); и наш код обновляет результаты:

OrangeGreenWhite
2/5 = 40%1/4=25%1/4=25%

Когда наш бесстрашный веб-разработчик видит это, он царапает голову. Что за Ч*? Оранжевая кнопка - худший вариант. Его шрифт крошечный! Зеленая кнопка, очевидно, лучше. Все потеряно! Жадный алгоритм всегда будет выбирать его навсегда!

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

OrangeGreenWhite
2/9 = 22%1/4=25%1/4=25%

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

OrangeGreenWhite
114/4071 = 2.8%205/6385=3.2%59/2264=2.6%

Изменение: как насчет рандомизации?

Я не обсуждал часть рандомизации. Рандомизация 10% испытаний заставляет алгоритм исследовать варианты. Это компромисс между попытками новых вещей в надежде на что-то лучше, и придерживаться того, что он знает будет работать. Существует несколько вариантов стратегии epsilon-greedy. В стратегии epsilon-first вы можете исследовать 100% времени в начале и после того, как у вас есть хороший образец, переключитесь на pure-greedy. В качестве альтернативы, вы можете сократить время исследования с течением времени. Epsilon-greedy стратегия, которую я описал, является хорошим балансом между простотой и производительностью. Изучение других алгоритмов, таких как UCB, Boltzmann Exploration и методов, которые учитывают контекст, является увлекательным, но необязательным, если вы просто хотите что-то, что работает.

Подождите, почему не все это делают?

Статистике трудно понять большинство людей. Люди не доверяют вещам, которые они не понимают, и они особенно не доверяют алгоритмам машинного обучения, даже если они просты. Основные инструменты не поддерживают это, потому что тогда вам придется обучать людей об этом, а также статистике, и это сложно. Некоторые общие возражения могут быть следующими: