Быть специалистом по данным.

[Машинное обучение] Как выбирать функции

Важный вопрос для вашей первой работы, связанной с наукой о данных

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

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

Вернемся к нашему вопросу:

Учитывая большой набор данных (более 1000 столбцов с 10000 строками (записями)), как выбрать полезные функции для построения (контролируемой) модели?

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

Блокнот Kaggle загружен сюда, где набор данных, который я использую, представляет собой данные андеррайтинга пруденциального страхования жизни:



Данная задача направлена ​​на прогнозирование уровня риска (андеррайтинга) заявителя на страхование жизни. Для более подробной реализации выбора функций вы также можете проверить статью Scikit-learn.

Сначала мы читаем данные:

Здесь я собираюсь провести простую очистку данных. Большинство реализаций моделей машинного обучения не принимают строковые входные данные, и, следовательно, мы должны преобразовать их в числовые значения. Поскольку наша цель - порядковая цель (то есть контролируемое обучение), преобразование категориальной переменной с помощью базового OneHotEncoder страдает от «проклятия размерности» (обычно это также занимает больше времени при обучении модели).

Вместо этого для категориального столбца мы делаем следующее: на основе его категориального значения мы вычисляем соответствующие средние значения цели Y (по «GroupBy») и ранжируем их от 0 до количества уникальных категориальных значений, которые этот столбец минус 1. Такое отображение доступно для тестирования данных или производства позже.

Затем мы заполняем недостающее значение как стандартная процедура:

0. Аналогия с подбором футбольной команды.

Предположим, у вас есть 200 футболистов, и вы хотите выбрать 11 из них, чтобы сформировать лучшую футбольную команду. Как бы вы их выбрали?

1. Неконтролируемый подход

По аналогии с отбором футболистов, при неконтролируемом подходе оценивается основная информация о каждом игроке, такая как рост, ИМТ, возраст и другие показатели здоровья. Они не привязаны к футболу (без присмотра), но у большинства отличных футболистов должна быть хорошая физическая база.

  • Удаление столбцов с высоким коэффициентом пропуска
    Первый и самый простой способ - удалить столбцы без присмотра. Мы можем удалить столбцы, в которых слишком много пропущенных значений.
(59381, 127)
(59381, 126)
  • Удаление столбцов с небольшой дисперсией
    Другой способ - удалить столбцы со слишком малой дисперсией, поскольку эти столбцы обычно не содержат информации.
number of columns after dropping by variance threshold: 16
  • PCA
    PCA - это более продвинутый способ выбора функций. Основное преимущество состоит в том, что преобразованные элементы теперь независимы; однако трансформированные черты трудно интерпретировать. Вы можете проверить эту статью для PCA-реализации Scikit-learn.

2. Подход под наблюдением

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

В первом раунде мы оцениваем футбольные навыки (под присмотром), такие как пенальти, броски, шорт-пасы, для каждого игрока и оцениваем их. Предположим, теперь мы можем выбрать 50 лучших игроков из 200.

Во втором раунде, поскольку мы хотим найти лучшую комбинацию 11 игроков из 50 игроков, нам нужно оценить, как эти 50 игроков будут сотрудничать. Наконец-то мы найдем 11 лучших игроков. (Почему мы не проводим второй раунд напрямую? Выполнение каждой итерации занимает много времени, поэтому нам понадобится предварительный тест в первом раунде.)

Технически говоря, первый раунд - это «выбор функции по модели», а второй раунд - это «рекурсивное исключение характеристик» (RFE). Вернемся к машинному обучению и программированию.

  • Выбор функций по модели
    Некоторые модели машинного обучения предназначены для выбора функций, например линейная регрессия на основе L1 и Ext с учетом Ra ndomized Деревья (модель Extra-tree). По сравнению с регуляризацией L2, регуляризация L1 имеет тенденцию обнулять параметры неважных функций. (Вы знаете, почему?) Чрезвычайно рандомизированные деревья разбивают лист случайным образом (не за счет получения информации или энтропии). Важные особенности все равно должны быть более важными, чем неважные (измеряемые по важности свойств на основе примесей).

    Мы оцениваем это с помощью трех моделей:
CPU times: user 15.9 s, sys: 271 ms, total: 16.2 s
Wall time: 14.3 s
========== LogisticRegression ==========
Accuracy in training: 0.4138598854833277
Accuracy in valid: 0.41020945163666983
Show top 10 important features:

========== ExtraTreesClassifier ==========
Accuracy in training: 0.3467497473896935
Accuracy in valid: 0.3467213977476055
Show top 10 important features:

========== RandomForestClassifier ==========
Accuracy in training: 0.3473391714381947
Accuracy in valid: 0.34581622987053995
Show top 10 important features:

Мы также строим рейтинг важности моделей для каждой модели:

Поскольку логистическая регрессия на основе L1 имеет наивысшую точность, мы выберем только 60 лучших характеристик (из графика) с помощью логистической регрессии:

selected_model = «LogisticRegression»
number_of_features = 60
selected_features_by_model = important_fatures_sorted_all [important_fatures_sorted_all [‘model’] == selected_model] .index [: number_of_features] .tolist ()

  • Рекурсивное исключение функций (RFE)
    Вторая часть - выбрать наилучшую комбинацию функций. Мы делаем это с помощью «Рекурсивного исключения функций» (RFE). Вместо построения одной модели мы строим n моделей (где n = количество функций). На первой итерации мы обучаем модель по всем 60 характеристикам и вычисляем точность перекрестной проверки и важность характеристик всех столбцов. Затем мы отбрасываем наименее важную функцию, и теперь у нас есть 59 функций. Основываясь на этих 59 функциях, мы повторяем описанный выше процесс и заканчиваем на последней отдельной функции. Этот метод требует времени, но даст вам надежный рейтинг важности функций. Если для большого набора данных время не отведено, можно рассмотреть возможность сделать это путем выборки или удаления большего количества функций на каждой итерации.

CPU times: user 7min 2s, sys: 334 ms, total: 7min 2s
Wall time: 26min 32s

Как видите, точность проверки, наконец, станет насыщенной (около 0,475) по мере обучения с большим количеством функций. Теперь мы можем проверить наш рейтинг важности функций:

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