Введение

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

Конвейер обработки данных
Создание непрерывного конвейера обработки данных для конкретной проблемы - это итеративный процесс, который включает в себя комбинацию различных процессов, рисунок [1]. Сначала специалисты по обработке данных загружают данные из различных источников и готовят их к этапу предварительной обработки. Выполнение EDA, также известного как «Исследовательский анализ данных», является важным шагом для ознакомления с данными. Более того, EDA очень помогает при создании новых функций. На первой итерации мы выбираем простой и эффективный по времени метод обучения первой базовой модели. Процесс оценки помогает выяснить, где находится базовая модель в отношении точности и ценности для бизнеса. Развертывание модели на ранних этапах помогает отслеживать ее производительность в производственной среде и собирать отзывы для улучшения модели в следующих итерациях.

Разработка функций
В этой статье я собираюсь «поцарапать поверхность» процесса разработки функций. В Википедии мы можем найти определение функциональной инженерии следующим образом:

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

Исходя из приведенного выше определения, я хочу выделить следующие моменты:
1. Разработка функций дорогостоящая и требует много времени, поскольку зависит от проблемы и знания предметной области.
2. Разработка функций может выполняться вручную но в некоторых случаях…
3. Процесс разработки функций можно автоматизировать.

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

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

Что вы собираетесь здесь прочитать?
В первой части этой серии я исследую технику преобразования признаков, чтобы показать, как повысить точность простой модели линейной регрессии более чем на 2 %. Я собираюсь использовать набор данных из конкурса Kaggle Цены на недвижимость: расширенные методы регрессии, чтобы изучить некоторые простые методы автоматического создания новых функций. В конце концов, я собираюсь представить простую идею, которая поможет оценить новые функции. В этой статье я сосредоточусь только на непрерывных числовых функциях. Набор данных можно найти здесь.
Код для этой статьи написан на Python. Важно отметить, что эта статья не посвящена методам получения лучшей модели.

Преобразование функции

Связь между функцией и целью
Редко бывает линейная связь между функцией и целью, которую я хочу предсказать. Если я использую линейную модель для представления нелинейных отношений, у меня может возникнуть проблема с недостаточной подгонкой. Это означает, что модель недостаточно сложна, чтобы представить взаимосвязь между объектом и целью. Прежде чем перейти к более сложным моделям, таким как модели на основе деревьев или модели нейронных сетей, я могу попытаться ввести возможную нелинейную связь между функциями и целью в исходные данные, не увеличивая сложность модели. Здесь возникает множество вопросов и проблем.

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

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

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

где a - действительное число, но не 0 a! = 0.

Еще одно преобразование, которое стоит попробовать, - это «журнал»:

Применение проектирования функций к набору данных "Цены на жилье"

Чтение данных
При загрузке данных по ссылке выше я получаю два набора данных: поезд и тестовые наборы данных. Набор данных поезда содержит 81 столбец и 1460 выборок (строк), в то время как тестовый набор данных содержит 80 столбцов и 1459 строк. Дополнительный столбец в наборе данных поезда - это целевая (метка) «SalePrice», которую я хочу предсказать, решив задачу регрессии.

Набор данных содержит как числовые, так и категориальные характеристики. Имеется 43 категориальных объекта со строковыми метками. Остальные функции числовые. Кроме того, описание функций дается в текстовом файле, который можно загрузить вместе с данными. Здесь я сосредоточусь только на наборе обучающих данных. Перед отправкой в ​​Kaggle мне нужно применить следующие шаги и к тестируемому набору данных. В приведенном ниже коде я загружаю набор обучающих данных, используя платформу Pandas.

Цель и критерии оценки

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

Поэтому я извлек целевой «SalePrice» из фрейма данных поезда, а затем применил преобразование журнала. Я удалил целевой столбец и столбец Id, который является уникальным для каждого образца, из кадра данных поезда.

Функции
Числовые функции могут иметь непрерывные значения, такие как длина и площадь. Категориальные числовые признаки имеют дискретные числовые значения. Например, в наборе данных здесь есть функция под названием «MSSubClass», которая имеет только 15 категорий (значения = 20, 30, 40 и т. Д.), Которые определяют тип жилья, участвующего в продаже дома. Однако есть некоторые числовые категориальные особенности, которые имеют большое количество категорий. В этом случае трудно различить непрерывные числовые и категориальные числовые признаки. Я определил порог, который относится к максимальным категориям, которые должна иметь категориальная функция. Если категориальный признак имеет больше категорий, чем пороговое значение, я рассматриваю его как непрерывный числовой признак. Для этой статьи я установил порог = 30. В этом случае я учитываю только следующие числовые функции в следующих шагах:

Предварительная обработка
Перед обучением модели или применением преобразования функций данные нормализуются с помощью StandardScaler из Scikit-learn framework. После нормализации функции имеют нулевое среднее значение и 1 в качестве стандартного отклонения. Я решил заменить отсутствующие значения (NaN) средними значениями, которые после нормализации должны быть нулями. Возможно, это не лучшая установка для текущего набора данных, но ее достаточно для целей эксперимента в этой статье. Если вы заинтересованы в тестировании различных настроек, например, с использованием модели другого типа или заполнения отсутствующих значений другими значениями, пожалуйста, продолжайте.

Преобразование элементов
Я использую функцию «apply_transformation» ниже, чтобы автоматически применить преобразование, указанное выше, ко всем элементам. После применения каждого преобразования я вычисляю корреляцию между функциями и целью и сравниваю ее с исходным случаем, когда я не применяю никаких преобразований. Таблица 1 показывает, что применение некоторых преобразований к конкретным функциям значительно улучшает взаимосвязь - в качестве примеров проверьте «LotArea: улучшение корреляции на 13%» и «OpenPorchSF: улучшение корреляции на 9%». Напротив, применение преобразования к другим функциям не улучшило корреляцию, или даже, в некоторых случаях, корреляция уменьшилась - проверьте «BsmtFinSF1» и «GarageArea» в качестве примеров.

Оценить преобразование функции

Базовая модель
Я использую простую линейную модель для прогнозирования целевой SalePrice. Фреймворк Scikit-learn имеет другую реализацию линейной модели. Чтобы избежать чрезмерной подгонки, я выбрал линейную модель, известную как Ridge, которая поддерживает регуляризацию.

Процесс проверки

Здесь я использую как R², так и MSE для оценки модели. Когда я говорю о точности модели, я имею в виду R².

Поскольку размер набора данных невелик, разбиение наборов данных на наборы данных для обучения и тестирования может оказаться недостаточным для надежной оценки точности. Причина в том, что набор данных тестирования в этом случае невелик и не может представлять весь набор данных. Поэтому для оценки качества модели я использую метод KFold, который реализован в Scikit-learn. Качество резко меняется каждый раз, когда у меня появляется новый раскол, что подтверждают результаты KFold ниже. Я собираюсь использовать средние значения R² и среднеквадратичную ошибку, рассчитанную из 5 значений, чтобы оценить точность модели до и после добавления новых функций. После выполнения приведенного ниже кода я получаю следующую точность базовой модели:

foldnr. 1
Mean squared error linear: 0.0310
R2 linear: 82.2
foldnr. 2
Mean squared error linear: 0.0672
R2 linear: 62.0
foldnr. 3
Mean squared error linear: 0.0282
R2 linear: 81.0
foldnr. 4
Mean squared error linear: 0.0335
R2 linear: 77.1
foldnr. 5
Mean squared error linear: 0.0238
R2 linear: 84.1
mean R2 5 Folds:  77.27
mean MSE 5 Folds:  0.0368

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

Обучите модель с помощью преобразования элемента
Из таблицы 1 выше я выбрал только те преобразования, которые улучшили корреляцию между элементом и целью, как показано в таблице 2 ниже. Сначала я применил преобразование к каждому элементу в отдельности, чтобы наблюдать за изменением точности модели, если каждый раз я преобразовываю только конкретный элемент. На втором этапе я применяю некоторые из этих преобразований вместе, чтобы получить максимальную точность. Я представляю результаты в таблице 2 ниже. Значение «1» в таблице означает, что преобразование не применялось, и принималось исходное значение (нормализованное).

Очевидно, что большинство функций, которые показали лучшую корреляцию с целью после применения преобразований, способствовали повышению качества модели. С другой стороны, применение преобразования к некоторым элементам снижает точность модели. Такие интересные результаты не могут быть легко интерпретированы, поскольку многие факторы влияют на результаты. Некоторые из этих факторов могут заключаться в том, что градиентный спуск застрял в локальном минимуме или зависимость между функциями увеличилась после применения преобразования. Это означает, что преобразование не дает модели новой информации. Более того, коэффициент регуляризации резко меняется после применения преобразований. Если преобразование значительно улучшает точность модели (более чем на 1%), коэффициент регуляризации «альфа» мал по сравнению с другими случаями.

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

foldnr. 1
Mean squared error linear: 0.0321
R2 linear: 81.5
foldnr. 2
Mean squared error linear: 0.0561
R2 linear: 68.3
foldnr. 3
Mean squared error linear: 0.0257
R2 linear: 82.7
foldnr. 4
Mean squared error linear: 0.0288
R2 linear: 80.3
foldnr. 5
Mean squared error linear: 0.0226
R2 linear: 84.9
mean R2 5 Folds:  79.52
mean MSE 5 Folds:  0.0331

Вывод

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

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

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