Покемон, группа милых животных, мирно населяющих планету, пока люди не придут и не заставят их сражаться друг с другом, чтобы получить блестящие значки и право называть себя мастерами покемонов, звучит безумно, правда?
В этом мире существует группа редких и часто могущественных покемонов, известных как Легендарные покемоны.
К сожалению, нет четких критериев, которые определяют этих покемонов.
Единственный способ идентифицировать легендарного покемона - это заявления официальных СМИ, таких как игра или аниме.
Тогда мне в голову пришёл вопрос.
Что, если бы мы могли использовать машинное обучение для определения легендарных покемонов?
Чтобы ответить на этот вопрос, мы будем использовать алгоритм Случайный лес.
Случайные леса
Random Forest - это гибкий, простой в использовании алгоритм машинного обучения, который, как известно, дает отличные результаты даже без настройки гиперпараметров.
Это ансамблевый классификатор, который создается путем объединения множества деревьев решений. Каждое дерево строится на случайном подмножестве данных. Этот метод известен как упаковка.
Классификатор ансамбля объединяет индивидуальные прогнозы каждого дерева и объединяет их, чтобы сделать окончательный прогноз с использованием большинства голосов.
Случайный лес обычно предотвращает переоснащение и снижает дисперсию из-за его случайного характера (каламбур).
Набор данных
Для этого проекта мы будем использовать набор данных Покемон со статистикой.
Он содержит данные о 800 покемонах, включая их имена, характеристики и, самое главное, легендарные они или нет.
Перво-наперво, давайте посмотрим, как выглядит типичный покемон в наборе данных.
dataset = pd.read_csv("../input/Pokemon.csv") # Display first row of dataset dataset.head(1)
Тип покемона указывает, какими свойствами он обладает (он может иметь один или два типа). В настоящее время в игре 18 типов, от огня и воды до драконов и фей.
Статистика (статистика), связанная с покемонами, определяет аспекты внутриигровой битвы.
Например, статистика скорости определяет порядок действий покемонов в бою, например. Покемон с более высокой скоростью обычно будет двигаться первым, прежде чем другие с более низкой скоростью.
Мы будем использовать типы и статистику в качестве входных данных для случайного леса, эти входные данные известны как функции.
Одно горячее кодирование
Затем необходимые данные будут предварительно обработаны в подходящий формат для классификатора случайного леса. Большинство алгоритмов машинного обучения не могут работать со значениями меток и требуют ввода числовых значений. Это связано с эффективной реализацией этих алгоритмов, а не с жесткими ограничениями.
Поэтому мы обычно кодируем эти значения меток в двоичную форму, используя горячее кодирование.
В этом наборе данных необходимо кодировать две функции: Тип 1 и Тип 2.
Как упоминалось ранее, Тип может принимать 18 различных значений.
Одно горячее кодирование преобразует каждую функцию типа в 18 отдельных функций, таких как «is_grass», «is_poison» и т. Д.
Каждой из этих новых функций будет присвоено значение 1 или 0.
К счастью, мы можем использовать встроенную функцию pandas под названием get_dummies для выполнения кодирования.
dataset = pd.get_dummies(dataset)
Это двоичное кодирование данных позволяет модели лучше интерпретировать наши данные в числовом виде и более точно прогнозировать. Теперь у нас есть в общей сложности 42 функции, которые вводятся в алгоритм.
Разделить на набор данных для поездов и испытаний
После кодирования данных нам нужно разделить данные на поезд и тестовый набор. Перед этим было бы очень полезно ответить на следующий вопрос:
Сколько легендарных покемонов на самом деле в наборе данных !?
Как мы видим выше, в данных содержится 65 легендарных покемонов, что составляет всего 7% от набора данных!
Этот дисбаланс данных не поможет при обучении нашего леса, поскольку он может привести к переобучению.
Переобучение - это когда наша модель плохо обобщает наши обучающие данные до невидимых данных. Это происходит из-за чрезмерного представления определенного класса в данных, что, в свою очередь, затрудняет моделирование узнать основной сигнал в данных.
Чтобы решить эту проблему, я использовал два распространенных статистических метода уменьшения дисбаланса:
- недостаточная выборка большинства класса (нормальные покемоны)
- чрезмерная выборка класса меньшинства (легендарный покемон)
Недостаточная выборка обычных покемонов
Чтобы недооценить класс большинства, я уменьшил количество обычных покемонов в наборе данных до 100.
Затем я применил к набору данных тестовое разделение поездов 70/30. x
- особенности каждого Покемона и y
соответствующие метки истинности (Истинно, если Легендарный).
X_train, X_test, y_train, y_test = train_test_split(x,y, random_state = 47, test_size = 0.30)
Передозировка легендарных покемонов с помощью SMOTE
Чтобы передискретизировать легендарного покемона, я использовал алгоритм SMOTE (хорошо объясненный здесь).
Алгоритм SMOTE может синтезировать новых легендарных покемонов, используя существующие данные примеров. Это означает, что мы можем увеличить количество легенд в наших обучающих данных, получив коэффициент 1.0 в обучающих данных!
from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=12, sampling_strategy= = 1.0)
X_train_res, y_train_res = sm.fit_sample(X_train, y_train)
Этот метод избыточной выборки был применен к обучающей выборке только , чтобы предотвратить попадание тестовых данных в алгоритм SMOTE. Это гарантирует, что модель проверена на данных, которые не использовались для создания синтезированных данных.
Тренировка случайного леса
Подготовив данные для обучения, мы можем строить лес!
from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators=100,max_depth=7) model.fit(training_data,training_labels)
Аргумент n_estimators
определяет количество деревьев решений, используемых в лесу. Для max_depth
каждого дерева в лесу установлено 7 уровней, в основном для целей визуализации. Мы не хотим смотреть на огромные деревья!
Оценка
Итак, как лес работает с данными?
Accuracy Score on train data: 0.99 Accuracy Score on test data: 0.96
Мы видим, что лес достиг точности 96% по тестовым данным, и это потрясающе! Это указывает на то, что лес избежал переобучения и может хорошо обобщать невидимые примеры!
Важность функции
Из-за жадной природы деревьев решений они могут выделять функции, которые являются важными решающими факторами при классификации. Это называется выбором функций.
Это поможет нам понять, какие функции относительно важны при принятии решения о том, что делает покемона легендарным.
В Sk-learn есть удобная функция под названием feature_importances_
, которая может измерить важность функции, посмотрев, насколько эта функция в среднем снижает энтропию в лесу. Он масштабирует результаты так, чтобы сумма всех значений была равна 1.
Характеристики, получившие наибольшее количество баллов, показаны ниже.
Интересно, что наиболее решающей характеристикой является Итого ( общая сумма всех базовых характеристик).
Легендарные покемоны, как известно, более могущественны, чем обычные покемоны, поэтому логично, что атрибут Всего будет большим показателем легендарного статуса.
Кроме того, мы видим, что значение важности быстро снижается от общего к менее важным функциям. Это показывает нам, что некоторые функции, такие как Типы, на самом деле не дают нам много информации для идентификации легендарных покемонов. (Тип 1_Bug снижает энтропию только в 0,6% случаев!)
Так что их, возможно, можно удалить из нашего набора данных, поскольку они просто шум.
Давайте визуализируем случайное дерево из леса, чтобы увидеть, как оно использует эти функции для прогнозирования!
В этом конкретном дереве в качестве решающих факторов используются статистика «Тотал», «Атака» и «Защита». Мы видим, что дерево научилось избегать ошибочной классификации покемонов с высоким общим, но низким уровнем атаки и защиты как легендарных, что довольно круто!
Вывод
В этой статье мы узнали, что можем точно идентифицировать легендарных покемонов, используя исключительно статистические данные!
В мире покемонов не так много легендарных персонажей, что, к сожалению, означает, что у нас меньше данных для работы. Однако по мере того, как время идет и количество легендарных предметов увеличивается, это также означает, что критерии для легендарных предметов могут измениться. Значит, важность некоторых функций тоже изменится!
С случайными лесами интересно работать, но из-за их размера их трудно визуализировать и анализировать. Несмотря на это, использование атрибута леса features_importances_
позволило нам понять, какие полезные индикаторы легендарных покемонов можно найти на основе данных.
Спасибо за чтение! Я надеюсь, что эта статья показала вам, как машинное обучение можно применить к самым надуманным вопросам. Если у вас есть вопросы или вы просто хотите пообщаться, оставьте комментарий ниже!
Мой блокнот на Python можно найти здесь
Мир до следующего раза :)