Пару месяцев назад друг пригласил меня присоединиться к нему в онлайн-кампании Dungeons and Dragons. Несмотря на мою респектабельную репутацию ботаника, я на самом деле никогда не играл в DnD. Не то чтобы я был против, на самом деле, это звучало весело, и мне нравилось, что это поощряло сотрудничество и сообразительность. Возможно, это поможет избавиться от монотонности, в которую превратилась моя жизнь из-за написания диссертации в одиночном заключении с COVID-19.

Я придумал персонажа, который, как мне показалось, было бы интересно сыграть - вариант aasimar hexblade warlock. Мне не очень хотелось читать множество священных фолиантов, в которых подробно описаны игровые элементы, чтобы оптимизировать моего чернокнижника, но мои новые соотечественники из DnD мягко подтолкнули меня в правильном направлении, чтобы сделать наибольшее распределение характеристик для Харизмы (увы, у меня есть настоящая харизма вспотевшего носка, чтобы отдать должное ролевой игре.)

При этом я задумался: насколько сбалансирован реальный игровой процесс? Все ли оптимизации просто приводят к одному и тому же фундаментальному построению персонажа? Или я могу определить класс персонажа на основе ограниченного набора информации о персонаже?

Каждому классификатору нужны данные

Чтобы построить классификатор и ответить на этот вопрос, мне понадобился набор данных символов DnD. Я нашел один, составленный Б. Оганом Манчарчи, доступный на его Github. Он содержит более 7900 знаков, представленных пользователями через созданную им форму веб-приложения. Он перечисляет несколько потенциальных предостережений в отношении набора данных, ни одно из которых, похоже, не является препятствием для простого исследования, которое я пытаюсь провести. Я буду использовать python с библиотеками pandas и sklearn в качестве стандартного набора инструментов. Записную книжку (запутанную) Jupyter с этим анализом можно найти в этом репозитории git, если вы хотите продолжить.

Данные содержат множество различных функций, включая пользовательские метаданные отправленной записи, а также актуальные символьные данные, представляющие интерес. Большая часть этой информации не понадобится, поскольку нас в первую очередь интересуют характеристики и жизненные показатели персонажа, а именно:

  1. Показатели способностей или атрибуты, то есть Cha (risma), Con (stitution), Dex (terity), Int (интеллект), Str (ength) и Wis (dom).
  2. Хиты (HP)
  3. Класс брони (AC)
  4. Статистика кастинга (категориальная функция, одно из {Cha, Con, Dex, Int, Str, Wis})

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

Исследование данных

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

Немедленно заметна нехватка образцов Artificer в наборе данных по сравнению с другими дюжинами классов и потенциальная причина для беспокойства. Как оказалось, класс Artificer является недавним дополнением к канону DnD 5e и, как таковой, не был доступен достаточно долго, чтобы игроки могли выбирать в значительном количестве. Этот дисбаланс менее процента от полного набора данных может стать проблемой позже. Для упрощения мы проигнорируем Artificer до конца этого исследования - по крайней мере, до тех пор, пока не будет доступно больше данных Artificer. Остальные, хотя и не идеально сбалансированы, по-прежнему могут действовать без дальнейших корректировок.

DnD предлагает персонажам возможность заниматься несколькими классами при соблюдении определенных условий. Для этого упражнения это добавляет дополнительный уровень сложности, когда класс персонажа не определен четко, а двусмысленность вносится из-за того, что игрок развивает своего персонажа в потенциально нескольких разных направлениях. Чтобы улучшить нашу чувствительность, мы будем рассматривать только сборки персонажей с ровно одним классом, в результате чего у нас останется чуть менее 7000 персонажей. Теперь давайте исследуем распределения для различных характеристик персонажей, упомянутых ранее, и посмотрим, существуют ли какие-либо корреляции, которые могут различать классы.

Из тепловой карты видно, что определенные атрибуты могут коррелировать с некоторыми классами больше, чем с другими. С другой стороны, некоторые атрибуты, например, статистика каста Con / Str / Dex, кажутся почти одинаковыми для всех классов, что может быть интересно отметить.

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

Мы видим, что HP персонажа коррелирует с уровнем персонажа с показателем Пирсона 0,93, с гораздо меньшей тенденцией от других атрибутов. Чтобы учесть это, мы будем использовать HP персонажа, разделенные на уровень персонажа, а не только HP.

При изучении некоторых из этих распределений было обнаружено несколько выбросов, которые, по-видимому, имеют неестественно большие значения по сравнению с основной массой населения. Хотя существует множество вариантов обработки выбросов, мы применим знакомое правило 1,5 * IQR для функции HP / level, удалив 79 наблюдений.

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

Бинарное моделирование

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

Как мы должны решить, удалось ли нам разработать прогнозную модель? Нам нужна метрика успеха как средство оценки наших результатов. В общих чертах, это позволяет нам сравнивать производительность одной модели с другой и показывает, перемещают ли внесенные в модель уточнения прогноз в правильном направлении. Одним из способов может быть показатель точности. Наши данные не сильно разбалансированы, так что этого может быть достаточно, но мы также можем добиться большего и попытаться преуспеть как в точности, так и в запоминании, оптимизируя оценку F1. Как правило, это связано с конкретной проблемой, и нужно решить, что является более важным, минимизировать ли вероятность того, что прогноз отрицательно или положительно неверно идентифицирует случай. В нашей ситуации ничто не обязательно зависит от того, ошибочно ли мы идентифицируем так или иначе, но мы можем попытаться наказать ложные срабатывания и попытаться достичь по крайней мере 80% истинно положительных результатов (TPR), допуская только 5% ложных срабатываний. ставка (FPR).

Сначала мы попробуем использовать классификатор логистической регрессии с разделением набора данных для обучения и тестирования на 75% -25% и использовать подход 10-кратной перекрестной проверки. Мы можем оценить производительность на тестовой выборке, оценить наши показатели успеха и изучить матрицу путаницы.

Это очень хорошо! Нам удалось добиться 87% TPR и около 10% FPR. Мы можем глубже погрузиться в это с помощью кривой ROC, чтобы увидеть, сможем ли мы с небольшой корректировкой границы принятия решения достичь показателей 80/5.

Оказывается, при определенной интерпретации порога вероятности мы действительно можем достичь точно 5% FPR с TPR 80,4%. Мы потеряли несколько истинных идентификаций, поскольку этот порог немного более консервативен при назначении положительного идентификатора для подавления FPR. Мы можем попробовать другую модель машинного обучения, дерево решений (DT), чтобы увидеть, позволит ли оно нам улучшить наше моделирование и обеспечить лучшее соотношение TPR / FPR. Для улучшения моделирования гиперпараметры DT были настроены с использованием метода перекрестной проверки поиска по сетке.

Сразу же у нас есть TPR / FPR 92,6% / 6,3%, это уже свидетельствует о потенциальном улучшении! Выполняя то же упражнение и исследуя кривую ROC, мы действительно находим порог, при котором мы можем получить 5% FPR с колоссальным TPR 90%!

Мультиклассовое моделирование

Это здорово, но теперь мы должны снять обучающие колеса и обратиться к исходной проблеме классификации двенадцати отдельных классов. Мы можем начать с той же логистической регрессии и техник DT. Существуют различные способы вычисления общей числовой оценки для мультиклассовой классификации, но в целом DT, похоже, преуспел в классификации большинства отдельных классов лучше, чем логистическая регрессия и другая модель, поддерживающая векторные машины (SVM). Ниже приводится (несколько более сложная) матрица путаницы вместе с несколькими показателями успеха для мультиклассового DT.

Это многообещающе, однако возможности моделирования для каждого класса сильно различаются: от успешного (Клерик) до довольно ужасного (Чернокнижник).

Ансамблевое обучение

Возможно, мы можем попробовать добавить немного больше сложности с помощью методов ансамбля, которые расширяют DT-моделирование, например XGBoost и случайные леса (РФ). Сам по себе XGBoost существенно не улучшился по сравнению с DT. С другой стороны, с RF, похоже, мы все же смогли выжать немного больше возможностей распознавания, чтобы улучшить классификацию.

На данный момент мы, возможно, приближаемся к пределу с точки зрения того, сколько информации мы можем извлечь из ограниченных данных, которые мы выбрали для использования. Для некоторых классов, а именно Барда, Колдуна и Чернокнижника, похоже, что модели не могут различить трех заклинателей из-за схожих оптимизированных сборок. Изначально мы пренебрегли использованием заклинаний как функции, поскольку они эффективно идентифицируют свои соответствующие классы, но, возможно, мы можем ввести косвенную информацию о заклинаниях, не прибегая к самим заклинаниям. В частности, мы можем включить количество заклинаний, которые выучил конкретный персонаж, как особенность. Однако, как и в случае с HP, количество заклинаний, которые знает персонаж, зависит от уровня, где новые заклинания приобретаются по мере их продвижения. Таким образом, мы добавим в наш набор данных функцию заклинаний для каждого уровня.

Мы можем повторно запустить нашу модель RF с этим недавно добавленным столбцом.

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

Это кажется разумным, вспомните, что статистика приведения Con / Dex / Str из корреляционной матрицы показывала единообразие для всех классов. Это отражено на этом графике соответственно с уменьшенным значением, когда дело доходит до категоризации классов.

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

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

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

Большое спасибо Lance McDiffett, который изначально подключил меня к DnD и оказал неоценимую помощь в этом анализе, а также из своего опыта работы в качестве специалиста по данным.