Общая путаница, связанная с Feature Selection


Должен ли я выполнять Feature Selection на всем наборе данных?

Ответ — НЕТ.

Причина в том, что это приводит к байтам и утечке данных. На самом деле мы всегда следим за тем, чтобы наши ТЕСТОВЫЕ данные были абсолютно неизвестны и доступны только для оценки производительности нашей модели машинного обучения. Если мы выполняем Feature Selection на всем наборе данных, это утверждение больше не верно.

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

Когда следует выполнять отбор признаков?

  1. Для начала следует разделить данные на обучающие и тестовые.
  2. Затем следует провести отбор признаков на обучающих данных.
  3. После того как вы выполнили отбор признаков на обучающих данных, вы можете обучать свою модель.
  4. Теперь вы можете выбрать те же признаки из тестовых данных и выполнить прогнозирование.

Как влияет выбор признаков в случае использования K Fold Cross Validation?

Порядок остается прежним. Сначала разделите данные, а затем выполните отбор признаков.

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

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

scores = []

for train, test in KFold(len(y), n_folds=5):
    xtrain, xtest, ytrain, ytest = x[train], x[test], y[train], y[test]

    b = SelectKBest(f_regression, k=2)
    b.fit(xtrain, ytrain)
    xtrain = xtrain[:, b.get_support()]
    xtest = xtest[:, b.get_support()]

    clf.fit(xtrain, ytrain)    
    scores.append(clf.score(xtest, ytest))

    yp = clf.predict(xtest)
    plt.plot(yp, ytest, 'o')
    plt.plot(ytest, ytest, 'r-')

plt.xlabel("Predicted")
plt.ylabel("Observed")

print("CV Score is ", np.mean(scores))
Вход в полноэкранный режим Выход из полноэкранного режима

Должен ли я выполнять кодирование признаков, например, кодирование по одному горячему или порядковому признаку, до или после выделения признаков?

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

Ссылки

  1. https://stackoverflow.com/questions/56308116/should-feature-selection-be-done-before-train-test-split-or-after
  2. https://www.nodalpoint.com/not-perform-feature-selection/
  3. https://nbviewer.org/github/cs109/content/blob/master/lec_10_cross_val.ipynb
  4. https://stats.stackexchange.com/questions/64825/should-feature-selection-be-performed-only-on-training-data-or-all-data
  5. https://followthedata.wordpress.com/2013/10/30/the-importance-of-proper-cross-validation-and-experimental-design/
  6. https://datascience.stackexchange.com/questions/95071/should-i-do-one-hot-encoding-before-feature-selection-and-how-should-i-perform-f
  7. https://stats.stackexchange.com/questions/440372/feature-selection-before-or-after-encoding

Оцените статью
Procodings.ru
Добавить комментарий