Шаг 126.
Введение в машинное обучение с использованием Python. ... . Автоматический отбор признаков. Отбор признаков на основе модели

    На этом шаге мы рассмотрим пример использования этого метода.

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


Разреженные решение - решения, при которых большинство коэффициентов тождественно равно 0.

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

[In 42]:
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
select = SelectFromModel(
    RandomForestClassifier(n_estimators=100, random_state=42),
                         threshold="median")

    Класс SelectFromModel отбирает все признаки, у которых показатель важности (заданный моделью машинного обучения с учителем) превышает установленное пороговое значение. Чтобы вычислить результат, сопоставимый с тем, который мы получили при однофакторном отборе признаков, мы использовали в качестве порогового значения медиану, поэтому будет отобрана половина признаков. Мы используем случайный лес на основе деревьев классификации (100 деревьев), чтобы вычислить важности признаков. Это довольно сложная модель, обладающая гораздо большей прогнозной силой, нежели одномерные тесты. Теперь давайте подгоним эту модель:

[In 43]:
select.fit(X_train, y_train)
X_train_l1 = select.transform(X_train)
print("форма обуч набора X: {}".format(X_train.shape))
print("форма обуч набора X c l1: {}".format(X_train_l1.shape))

форма обуч набора X: (284, 80)
форма обуч набора X c l1: (284, 40)

    И снова мы можем взглянуть на отобранные признаки (рисунок 1):

[In 44]:
mask = select.get_support()
# визуализируем булевы значения -- черный – True, белый – False
plt.matshow(mask.reshape(1, -1), cmap='gray_r')
plt.xlabel("Индекс примера")


Рис.1. Признаки, отобранные SelectFromModel с помощью RandomForestClassifier (изображение кликабельно)

    На этот раз были отобраны все исходные признаки, кроме двух. Поскольку мы задали отбор лишь 40 признаков, некоторые шумовые признаки также будут выбраны. Давайте посмотрим на правильность:

[In 45]:
X_test_l1 = select.transform(X_test)
score = LogisticRegression().fit(X_train_l1, y_train).score(X_test_l1, y_test)
print("Правильность на тестовом наборе: {:.3f}".format(score))

Правильность на тестовом наборе: 0.930

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

    На следующем шаге мы рассмотрим итеративный отбор признаков.




Предыдущий шаг Содержание Следующий шаг