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

Существуют различные методы выбора функций, некоторые из которых также поддерживаются аналитическим механизмом Apache Spark. Поскольку в Insider наша собственная платформа AutoML Delphi работает на базе Spark, давайте рассмотрим их одномерный селектор функций.

Одномерный выбор признаков — это процесс оценки каждого признака по отдельности в сравнении с переменной отклика, чтобы определить взаимосвязь между ними. Для проверки силы этой связи можно использовать многочисленные статистические подходы. ChiSqSelector существовал как преобразователь функций с выпуска 1.6.0, а в выпуске 3.1.0 Spark представил некоторые одномерные селекторы функций, названные в честь базового теста, например ANOVASelector.

В выпусках 3.1.1 и 3.2.0 Spark решил отказаться от поддержки этих отдельных классов селекторов и вместо этого объединить их в один класс с именем UnivariateFeatureSelector. Класс принимает режим и критерий выбора от пользователя и применяет подходящие тесты "под капотом".

UnivariateFeatureSelector работает с категориальными/непрерывными метками с категориальными/непрерывными функциями. Получив информацию featureType и labelType, Spark затем выбирает функцию оценки на основе этих конкретных типов.

Пример инициализации селектора:

val selector = new UnivariateFeatureSelector()
  .setFeatureType("continuous")
  .setLabelType("categorical")
  .setSelectionMode("numTopFeatures")
  .setSelectionThreshold(1)
  .setFeaturesCol("features")
  .setLabelCol("label")
  .setOutputCol("selectedFeatures")

В настоящее время выбор можно сделать с помощью одного из пяти поддерживаемых режимов.

  • numTopFeatures : выбирает N лучших функций, заданных параметром setSelectionThreshold. Значение этого параметра по умолчанию — 50. Это был не лучший режим для нашего варианта использования, потому что это потребовало бы оптимизации этого параметра для каждой модели машинного обучения, обученной для разных задач клиента и бизнеса.
  • percentile : очень похоже на numTopFeatures, но вместо фиксированного количества функций, часть из них выбирается через заданный процент (по умолчанию верхние 10%). Поскольку у нас есть различное количество входных параметров для наших моделей для каждого клиента, этот метод более динамичен по сравнению с numTopFeatures. Тем не менее, нам также необходимо оптимизировать этот порог.

Прежде чем обсуждать следующие режимы, будет полезно взглянуть на концепцию p-value. Существует множество формальных объяснений p-значения, большинство из которых часто вызывает споры среди статистиков вплоть до каждого слова. [пример здесь: «P ‹ 0,05 может означать не то, что вы думаете: Американская статистическая ассоциация уточняет значения P»]

Самым простым объяснением в неформальных терминах было бы то, что

Значение p говорит нам, насколько вероятно получение результата как такового, если наша нулевая гипотеза верна.

P-значение используется для проверки нулевой гипотезы или нашей идеи.

  • Небольшое значение p указывает на значительный результат. Чем меньше p-значение, тем больше у нас доказательств того, что нулевая гипотеза, вероятно, неверна.
  • Если p-значение велико, наша первоначальная идея вероятно верна. Поскольку доказательств для отклонения нулевой гипотезы недостаточно, большое значение p недостаточно значимо.
  • Чтобы придать больше смысла относительным терминам, таким как маленький или большой, мы используем significance или порог.

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

При выборе признаковнулевая гипотеза – это общее утверждениео том, чтомежду двумя измеряемыми явлениями нет связи. Итак, отказ от него говорит нам о наличии связи.

Теперь давайте перейдем к остальным режимам выделения.

  • fpr: Частота ложных срабатываний. В этом режиме выбираются все функции, p-значения которых ниже порогового значения, таким образом контролируя частоту ложных срабатываний при выборе. Значение этого порога для этого режима по умолчанию равно 0.05. Таким образом, выбор ‹ 0,05 дает убедительные доказательства, исключающие нулевую гипотезу. Мы выбираем признаки, когда возможно, что есть связь.
  • fdr: Частота ложных открытий. В этом режиме используется тот же подход, что и в fpr, но используется специальный метод для настройки распределения p-значения перед выбором объектов, которые делают разрез. Метод называется процедура Бенджамини–Хохберга. Причина такой корректировки состоит в том, чтобы уменьшить количество ложных срабатываний ниже p-значения.
  • fwe: Частота семейных ошибок. Используя множественную проверку гипотез, как мы это делаем, всегда есть шанс, что мы отклоним нулевую гипотезу, когда мы этого не должны были делать. По статистике, в 5 из 100 тестов мы принимаем неверное решение. Этот режим — способ решить эту проблему. При выборе функций вместо того, чтобы собирать те, которые имеют pval < threshold, он собирает те, которые имеют pval < threshold / numOfFeatures.

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

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