При построении прогностической модели выбор правильных функций имеет решающее значение для успеха модели. Использование слишком большого количества функций, особенно когда они не связаны с прогнозом, может увеличить сложность модели и привести к переоснащению. Таким образом, количество входных переменных должно быть оптимизировано, чтобы снизить затраты на вычисления и обеспечить высокопроизводительную модель.
Существуют различные методы выбора функций, некоторые из которых также поддерживаются аналитическим механизмом 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 по выбору функций улучшаются, и мы рады видеть, что еще они приготовили.