Отбор признаков в задачах с одним признаком

Beginner

This tutorial is from open-source community. Access the source code

Введение

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

Советы по работе с ВМ

После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Ноутбук, чтобы приступить к практике в Jupyter Notebook.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами при обучении, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Генерация выборочных данных

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

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

## Набор данных iris
X, y = load_iris(return_X_y=True)

## Некоторые шумовые данные, не связанные между собой
E = np.random.RandomState(42).uniform(0, 0.1, size=(X.shape[0], 20))

## Добавляем шумовые данные к информативным признакам
X = np.hstack((X, E))

## Разделяем набор данных на выборочный и тестовый наборы для выбора признаков и оценки классификатора
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)

Отбор признаков в задачах с одним признаком

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

from sklearn.feature_selection import SelectKBest, f_classif

selector = SelectKBest(f_classif, k=4)
selector.fit(X_train, y_train)
scores = -np.log10(selector.pvalues_)
scores /= scores.max()

Построение графика оценки признаков в задачах с одним признаком

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

import matplotlib.pyplot as plt

X_indices = np.arange(X.shape[-1])
plt.figure(1)
plt.clf()
plt.bar(X_indices - 0.05, scores, width=0.2)
plt.title("Feature univariate score")
plt.xlabel("Feature number")
plt.ylabel(r"Univariate score ($-Log(p_{value})$)")
plt.show()

Сравнение с методами опорных векторов

Теперь мы сравним точность классификации методами опорных векторов с использованием и без использования отбора признаков в задачах с одним признаком.

Без отбора признаков в задачах с одним признаком
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import LinearSVC

clf = make_pipeline(MinMaxScaler(), LinearSVC(dual="auto"))
clf.fit(X_train, y_train)
print(
    "Classification accuracy without selecting features: {:.3f}".format(
        clf.score(X_test, y_test)
    )
)

svm_weights = np.abs(clf[-1].coef_).sum(axis=0)
svm_weights /= svm_weights.sum()
После отбора признаков в задачах с одним признаком
clf_selected = make_pipeline(
    SelectKBest(f_classif, k=4), MinMaxScaler(), LinearSVC(dual="auto")
)
clf_selected.fit(X_train, y_train)
print(
    "Classification accuracy after univariate feature selection: {:.3f}".format(
        clf_selected.score(X_test, y_test)
    )
)

svm_weights_selected = np.abs(clf_selected[-1].coef_).sum(axis=0)
svm_weights_selected /= svm_weights_selected.sum()

Построение графика для сравнения отбора признаков

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

plt.bar(
    X_indices - 0.45, scores, width=0.2, label=r"Univariate score ($-Log(p_{value})$)"
)

plt.bar(X_indices - 0.25, svm_weights, width=0.2, label="SVM weight")

plt.bar(
    X_indices[selector.get_support()] - 0.05,
    svm_weights_selected,
    width=0.2,
    label="SVM weights after selection",
)

plt.title("Comparing feature selection")
plt.xlabel("Feature number")
plt.yticks(())
plt.axis("tight")
plt.legend(loc="upper right")
plt.show()

Резюме

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