Это третья статья из четырех, описывающих мой рабочий процесс в конкурсе Driven Data Pump it Up. Нажмите здесь, чтобы прочитать первую статью об EDA, или здесь, если хотите узнать больше о работе с отсутствующими данными. В этой третьей статье мы рассмотрим выбор функций и разработку функций.

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

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

Парные корреляции Пирсона

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

Но что, если переменную можно вычислить из группы других переменных? Например, не могли бы вы рассчитать высоту по GPS, если бы знали и долготу, и широту?

Обнаружение мультиколлинеарности с помощью VIF

Вот тут-то и появляется VIF (коэффициент инфляции дисперсии). VIF — это один из методов, обычно используемых для обнаружения мультиколлинеарности, и он выражается по шкале от 1 до бесконечности. Говорят, что переменные с VIF выше 5–10 имеют сильную мультиколлинеарность с другими переменными в вашем наборе данных. VIF, равный 10, соответствует R2, равному 0,9, что означает, что 90% вариаций одной переменной можно объяснить другой переменной. VIF, равный 100, соответствует R2, равному 0,99.

VIF можно легко рассчитать с помощью модуля variance_inflation_factor в пакете Statsmodels.

После нескольких итераций, в которых я удаляю 1 или 2 переменные в зависимости от их значений VIF, у меня остается 21 некоррелированная переменная.

Сравнение стратегий выбора функций

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

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

Почему я так думаю? Что ж, давайте посмотрим на графики важности признаков каждой из трех моделей.

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

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

Интересно, что модель VIF также придает большое значение этим характеристикам высокой кардинальности.

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

А как насчет методов на основе оболочки?

Так что насчет методов выбора признаков типа обертки, таких как RFECV? RFECV охватывает вашу модель и итеративно исключает переменные с наименьшей важностью, пока не останется желаемое количество переменных. Используя RFECV, я смог удалить 3 функции с низким рейтингом. Не так много, как хотелось бы. Конечно, существует множество других методов выбора признаков. Эта статья Zixuan Zhang, безусловно, дает хороший обзор.

Какое здесь сообщение на вынос?

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

Разработка функций

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

Создание новых переменных

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

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

Работа с переменными большого количества элементов

Немного поэкспериментировав с переменными спонсора и установщика, я решил оставить 500 наиболее распространенных категорий и сгруппировать редкие категории вместе. Перед группировкой я подчистил переменную установщика с помощью пакета Python Dirty Cat. Вы можете использовать этот пакет для кодирования категориальных функций на основе того, насколько похожи их строковые имена, но я использовал его для обнаружения потенциальных опечаток. Согласны ли вы с тем, что данид и данида или коммуна и сообщество, вероятно, отражают одни и те же категории?

Затем я решил округлить долготу и широту до двух знаков после запятой. Координаты выражаются с точностью до 6 знаков после запятой, что соответствует точности 0,111 метра. Этот уровень точности предоставляет информацию только о точном положении каждой точки подачи воды, но не дает информации об общем местоположении насоса. Используя 2 знака после запятой, я могу определить местоположение точки воды с точностью до 1,1 км и значительно снизить кардинальность этих переменных.

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

Кодирование моих категориальных переменных

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

Весь код, использованный в этой статье, конечно же, можно найти на Github.

В следующей статье мы рассмотрим компонент машинного обучения конкурса.

Ссылки и дополнительная литература

· Бхандари, А. 2020. Что такое мультиколлинеарность? Вот все, что вам нужно знать. https://www.analyticsvidhya.com/blog/2020/03/what-is-multicollinearity/

· Фрост, Дж. 2021. Факторы инфляции дисперсии (VIF). https://statisticsbyjim.com/regression/variance-inflation-factors/

· Quora, 2021. Является ли мультиколлинеарность проблемой в деревьях решений? https://www.quora.com/Is-multicollinearity-a-problem-in-decision-trees

· Рой, Б. 2019. Все о кодировании категориальных переменных. https://towardsdatascience.com/all-about-categorical-variable-encoding-305f3361fd02

· Чжан, 2019. Почему и как объясняется выбор функций. https://towardsdatascience.com/explaining-feature-importance-by-example-of-a-random-forest-d9166011959e