Прогнозирование скорости усыновления домашних животных с помощью Python — часть II

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

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

Изучение данных

В нашем наборе данных есть два столбца для категории породы. BreedName_breed_1 для основной породы и BreedName_breed_2, если питомец не чистокровный.

Интересно, что в обеих характеристиках столбца «Смешанная порода» является наиболее распространенным и предпочтительным значением.

Для кошек это в основном значение «Домашняя короткая шерсть» и «Домашняя средняя шерсть».

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

Потрясающий! Мы видим, что «Смешанная порода» является наиболее распространенной ценностью породы в признаке породы 1.

Переходим к следующей функции. Есть три столбца для функции цвета.

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

Далее, давайте посмотрим на функцию State:

Интересно, что около 85% рекламы домашних животных поступает из штатов Селангор и Куала-Лумпур. Стоит отметить, что процесс усыновления в этих двух штатах идет очень медленно. Таким образом, название штата, похоже, не увеличивает скорость принятия.

Сюжет показывает, что больше фотографий собак не означает более быстрое усыновление. Но в то же время отсутствие фотографий будет иметь минимальное распространение. Судя по графику, лучше выбрать от 1 до 5 фотографий.

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

Давайте посмотрим на функцию RescuerID:

Только спасатели из первой восьмерки спасли питомцев >100. Остальные значения имеют очень низкую частоту.

Давайте посмотрим на функцию имени:

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

Давайте создадим WordCloud, чтобы определить наиболее часто используемое имя.

Стоит отметить, что часто люди записывают общие имена, такие как Котенок, Китти, Мими, Уайт и т. д., просто чтобы заполнить какое-то значение в этом поле.

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

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

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

Очистка данных: пропущенные значения

Нам нужно обработать недостающие значения в нашем наборе данных, прежде чем мы запустим регрессионный анализ. Если пропущенные значения не обрабатываются должным образом, это повлияет на точность прогнозной модели машинного обучения. Имеются различные варианты заполнения отсутствующих значений. Мы будем использовать метод .fillna() и заменим отсутствующие значения наиболее часто встречающимся значением в функции. Причина выбора наиболее частого значения для заполнения пропущенного значения заключается просто в том, что у них нет разнообразия для прогнозирования. Следующий шаг — узнать количество пропущенных значений в каждой из функций в нашем наборе данных. Мы будем использовать функцию Pandas .isnull() для обнаружения пропущенных значений:

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

Вот как мы узнаем наиболее часто встречающееся значение в характеристике «Порода 1» для категории «Собака»:

И замените отсутствующие значения на «Смешанная порода». Давай сделаем это:

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

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

Категорические признаки

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

Пол – пол питомца (1 = мужской, 2 = женский, 3 = смешанный, если в профиле указана группа питомцев)

в то время как другие имеют текстовые значения, хранящиеся для представления различных признаков. Например:

Color1 — Цвет 1 питомца, представленный названием цвета (белый, серый, кремовый, черный, коричневый и т. д.)

Другими столбцами со слишком большим количеством уровней значений являются ColorName, ColorName_2, ColorName_3, BreedName_breed_1, BreedName_breed_2, StateName, Name, Fee, Quantity, PhotoAmt и Description.

Самая большая проблема состоит в том, чтобы выяснить, как манипулировать значениями, чтобы преобразовать их в числовые значения или номинальные категориальные значения для регрессионного анализа. Мы преобразуем категориальные значения в число. Один из подходов заключается в использовании метода кодирования Label для преобразования нечисловой категориальной переменной в числовые значения. Например, функция ColorName переменной основного цвета имеет семь различных значений:

Если мы используем метод кодировщика меток для этой функции, то он будет представлять каждый цвет числовым значением в диапазоне от 0 до 7. Это будет неправильно истолковано, что кремовый цвет в три раза лучше, чем черный. Другая проблема с кодированием меток заключается в том, что если мы используем этот метод для категориального признака, такого как BreedName_breed_2, то он преобразует признак в 134 числовых значения и создаст 134 новых столбца числовых значений, поскольку в этой переменной присутствует 134 уникальных значения. Мы этого не хотим! Это снизит производительность нашей модели машинного обучения.

Вместо этого мы будем использовать фиктивное кодирование или создадим фиктивные переменные — переменные только с двумя значениями — 0 и 1. По сути, мы создаем дубликат переменной. Мой наставник прислал мне эту ссылку. В нем есть хорошее объяснение того, почему мы должны использовать фиктивные переменные. Здесь цифры не имеют отношения друг к другу. Для нашей переменной ColorName будет создана фиктивная переменная для каждого из присутствующих цветов. Будет создан новый столбец Кремовый, и ему будет присвоено значение 1, чтобы предположить, что кремовый цвет присутствует, и 0, если его нет. Мы будем использовать метод pandas .get_dummies(), чтобы присвоить 1 значение True или 0 значение False для переменной. Проверьте результат:

В научном наборе есть метод двоичного кодирования переменной. Это называется One-Hot Encoding. Эта статья дает вам отличное объяснение One-Hot Encoding в Python. Обязательно проверьте это. Мы не будем использовать этот метод для создания фиктивной переменной, поскольку у нас много уровней значений в наших категориальных переменных. Например, наша первичная переменная породы BreedName_breed_1 имеет 174 уникальных значения. Тогда должны ли мы создать 174 фиктивные переменные? По этой причине мы будем использовать альтернативный подход к кодированию наших переменных, который называется пользовательским кодированием.

Во-первых, мы найдем самое часто используемое значение в этой функции.

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

После этого мы будем использовать метод pandas .fillna() для заполнения 0 там, где 1 нет. Другими словами, отсутствию этой конкретной породы будет присвоено значение 0.

Результирующий кадр данных выглядит следующим образом (показывая только подмножество столбцов):

Мы продолжим делать это со всеми остальными нашими переменными. Они есть :

Затем мы удалим исходные столбцы вместе с такими столбцами, как Dewormed, ColorName_3, Sterilized, VideoAmt, PetID, RescuerID, которые я не включаю в первый раунд регрессионного анализа. Поскольку функция AdoptionSpeed ​​является нашей целевой переменной, мы не создавали фиктивные переменные для этой функции. Мы также не будем удалять этот столбец, так как он нам нужен для нашей модели машинного обучения.

Последняя проверка, которую мы хотим сделать, — это посмотреть, какие столбцы теперь у нас есть после пользовательского подхода к кодированию:

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

Импорт библиотек

Выбор функций

Давайте создадим наш объект:

Разделить данные с помощью Train_Test_Split

Нам нужно разделить наш набор данных на два набора — обучающий набор и тестовый набор. Мы обучим нашу модель машинного обучения на нашем тренировочном наборе, а затем протестируем модели на нашем тестовом наборе, чтобы проверить, насколько точно она может предсказывать. 0,25 означает, что 75 % набора данных выделено обучающему набору, а остальные 25 % — тестовому набору.

Подобрать модель, используя обучающие данные

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

Тестирование модели с использованием данных тестирования

Проверим точность нашей модели

Модель точности

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

Представим точность модели в виде таблицы.

Матрица путаницы

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

Значения по оси X представляют прогнозы, тогда как значения по оси Y являются истинными значениями наших тестовых данных. Количество истинных и предсказанных классов должно быть равным. Однако, глядя на приведенную выше таблицу, мы можем легко обнаружить, что наша модель не работает точно. Прогнозируемые классы по оси X находятся в диапазоне от 1 до 4, тогда как предполагается, что он находится в диапазоне от 0 до 4, поскольку диапазон переменной AdoptionSpeed ​​(целевая переменная) составляет 0–4. Мы можем видеть этот диапазон на оси Y. Наша модель не смогла предсказать ни одного случая скорости принятия = 0. Скорее всего, это связано с тем, что это меньшинство.

Если вы хотите узнать больше о матрице путаницы, перейдите по ссылке эта.

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