Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу для загрузки полного примера кода. или для запуска этого примера в вашем браузере через JupyterLite или Binder

Проверка значимости оценки классификации с помощью перестановок

В этом примере показано использование permutation_test_score для оценки значимости перекрестно-валидированной оценки с помощью перестановок.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Набор данных

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

from sklearn.datasets import load_iris

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

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

import numpy as np

n_uncorrelated_features = 20
rng = np.random.RandomState(seed=0)
# Use same number of samples as in iris and 20 features
X_rand = rng.normal(size=(X.shape[0], n_uncorrelated_features))

Оценка теста перестановки

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

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

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

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
)

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

Исходные данные

Ниже приведена гистограмма оценок перестановок (распределение нулевой гипотезы). Красная линия указывает на оценку, полученную классификатором на исходных данных. Оценка намного лучше, чем полученные с использованием переставленных данных, и 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")
plot permutation tests for classification

Случайные данные

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

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()
plot permutation tests for classification

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

Наконец, обратите внимание, что этот тест показал, что он может давать низкие p-значения даже если в данных есть только слабая структура [1].

Ссылки

[1]

Ояла и Гаррига. Тесты перестановок для изучения производительности классификатора. Журнал машинного обучения (2010) том 11

Общее время выполнения скрипта: (0 минут 14.135 секунд)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_permutation_tests_for_classification.ipynb

Download Python source code: plot_permutation_tests_for_classification.py

Download zipped: plot_permutation_tests_for_classification.zip

Связанные примеры

Метод главных компонент (PCA) на наборе данных Iris

Построение поверхности решений деревьев решений, обученных на наборе данных Iris

Построение различных классификаторов SVM в наборе данных Iris

Инкрементальный PCA

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/model_selection/plot_permutation_tests_for_classification.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API