Как сравнить производительность методов выбора функций?

10

Существует несколько подходов выбора функций / выбора переменных (см., Например, Guyon & Elisseeff, 2003 ; Liu et al., 2010 ):

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

Многие опубликованные алгоритмы также реализованы в инструментах машинного обучения, таких как R, Python и т. Д.

Каков будет подходящий метод для сравнения различных алгоритмов выбора признаков и выбора наилучшего метода для данной проблемы / набора данных? Еще один вопрос заключается в том, существуют ли какие-либо известные метрики, которые измеряют производительность алгоритмов выбора признаков?

hopfk
источник

Ответы:

4

Это сложная проблема, и исследователи добились большого прогресса.

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

Два главных предостережения LASSO заключаются в том, что (1) выбранные функции не будут автоматически обнаруживать взаимодействие, поэтому вам нужно предварительно обработать все ваши функции (т. Е. До их запуска в модели) и (2) LASSO не будет идентифицировать не -линейные отношения (например, квадратичные отношения ).

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

Если вы ищете неконтролируемый выбор функций, похоже, что подобный подход регуляризации используется этими исследователями, но оценка в данном конкретном случае становится менее очевидной. Люди пробуют много разных вещей, таких как PCA / SVD или K-Means, которые в конечном итоге будут пытаться найти линейное приближение к данным.

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

С точки зрения программного обеспечения, R и Python имеют GBM, LASSO, K-Means, SVD и PCA. GLMNET и XGBoost в R и Sklearn для Python являются соответствующими библиотеками.

franciscojavierarceo
источник
1

Я всегда рассматриваю выбор функций как шаг к конечному результату.

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

Некоторые типичные применения:

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

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

  • упрощение результатов обучения, чтобы сделать их понятными (например, анализ первопричин). Хорошо, если просто, но все же достаточно с точки зрения качества

  • контроль над примеркой, как предполагает предыдущий ответ

  • ...

Итак, я не думаю, что есть общее правило (как всегда в ML), но это проблема в каждом конкретном случае.

Просто личное убеждение ...

Майкл Хоорман
источник
0

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

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

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

одуванчик
источник
0

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

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

Другим трюком было бы убедиться, что после перестановки строк переменные, помеченные как релевантные, перестали классифицироваться как релевантные.

Выше сказанное относится как к фильтрам, так и к оберткам.

Также обязательно разберитесь со случаями, когда взятые отдельно (одна за другой) переменные не оказывают какого-либо влияния на цель, но вместе взятые выявляют сильную зависимость. Примером будет хорошо известная проблема XOR (посмотрите код Python):

import numpy as np
import matplotlib.pyplot as plt
from sklearn.feature_selection import f_regression, mutual_info_regression,mutual_info_classif

x=np.random.randn(5000,3)
y=np.where(np.logical_xor(x[:,0]>0,x[:,1]>0),1,0)

plt.scatter(x[y==1,0],x[y==1,1],c='r',marker='x')
plt.scatter(x[y==0,0],x[y==0,1],c='b',marker='o')
plt.show()
print(mutual_info_classif(x, y)) 

Вывод:

Python 3 XOR иллюстрация

[0. 0. 0.00429746]

Таким образом, предположительно мощный (но одномерный) метод фильтрации (вычисление взаимной информации между исходными и входными переменными) не смог обнаружить никаких связей в наборе данных. Принимая во внимание, что мы точно знаем, что это 100% -ая зависимость, и мы можем предсказать Y со 100% точностью, зная X.

Хорошей идеей будет создание своего рода эталона для методов выбора функций, кто-нибудь хочет участвовать?

Анатолий Алексеев
источник