Тест перестановочной оценки для классификации

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В машинном обучении мы часто оцениваем производительность классификационного модели с использованием оценки. Однако, мы также должны проверить значимость оценки, чтобы убедиться, что производительность модели не является случайной. Именно здесь пригодится тест перестановочной оценки. Он генерирует нулевую распределение, вычисляя точность классификатора на 1000 различных перестановках набора данных. Затем эмпирическое p-значение вычисляется в качестве процента перестановок, при которых полученная оценка превышает оценку, полученную с использованием исходных данных. В этом практическом занятии мы будем использовать функцию permutation_test_score из sklearn.model_selection для оценки значимости кросс-валидированной оценки с использованием перестановок.

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

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49246{{"Тест перестановочной оценки для классификации"}} sklearn/model_selection -.-> lab-49246{{"Тест перестановочной оценки для классификации"}} sklearn/datasets -.-> lab-49246{{"Тест перестановочной оценки для классификации"}} ml/sklearn -.-> lab-49246{{"Тест перестановочной оценки для классификации"}} end

Загрузка набора данных и генерация случайных признаков

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

from sklearn.datasets import load_iris
import numpy as np

iris = load_iris()
X = iris.data
y = iris.target

n_uncorrelated_features = 20
rng = np.random.RandomState(seed=0)
X_rand = rng.normal(size=(X.shape[0], n_uncorrelated_features))

Тест перестановочной оценки на исходных данных

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

from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import permutation_test_score

clf = SVC(kernel="linear", random_state=7)
cv = StratifiedKFold(2, shuffle=True, random_state=0)

score_iris, perm_scores_iris, pvalue_iris = permutation_test_score(
    clf, X, y, scoring="accuracy", cv=cv, n_permutations=1000
)

Тест перестановочной оценки на случайных данных

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

score_rand, perm_scores_rand, pvalue_rand = permutation_test_score(
    clf, X_rand, y, scoring="accuracy", cv=cv, n_permutations=1000
)

Построение графиков результатов

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

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

## Исходные данные
ax.hist(perm_scores_iris, bins=20, density=True)
ax.axvline(score_iris, ls="--", color="r")
score_label = f"Score on original\ndata: {score_iris:.2f}\n(p-value: {pvalue_iris:.3f})"
ax.text(0.7, 10, score_label, fontsize=12)
ax.set_xlabel("Accuracy score")
_ = ax.set_ylabel("Probability density")

plt.show()

fig, ax = plt.subplots()

## Случайные данные
ax.hist(perm_scores_rand, bins=20, density=True)
ax.set_xlim(0.13)
ax.axvline(score_rand, ls="--", color="r")
score_label = f"Score on original\ndata: {score_rand:.2f}\n(p-value: {pvalue_rand:.3f})"
ax.text(0.14, 7.5, score_label, fontsize=12)
ax.set_xlabel("Accuracy score")
ax.set_ylabel("Probability density")

plt.show()

Резюме

В этом практическом занятии мы узнали, как использовать функцию permutation_test_score из sklearn.model_selection для оценки значимости кросс-валидированной оценки с использованием перестановок. Мы сгенерировали нулевое распределение, вычислив точность классификатора на 1000 различных перестановках набора данных, и вычислили эмпирическое p-значение в качестве процента перестановок, при которых полученная оценка больше оценки, полученной с использованием исходных данных. Мы также построили графики результатов, чтобы визуализировать нулевое распределение и оценку, полученную на исходных данных.