Примечание
Перейти к концу для загрузки полного примера кода. или для запуска этого примера в вашем браузере через 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")

Случайные данные
Ниже приведено распределение нулевой гипотезы для случайных данных. Оценки перестановок аналогичны оценкам, полученным с использованием исходного набора данных ирисов, потому что перестановка всегда разрушает любую зависимость между признаками и метками. Однако оценка, полученная на исходных случайных данных в этом случае, очень низкая. Это приводит к высокому 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()

Еще одной возможной причиной получения высокого p-значения является то, что классификатор не смог использовать структуру в данных. В этом случае p-значение будет низким только для классификаторов, которые могут использовать существующую зависимость. В нашем случае выше, где данные случайны, все классификаторы будут иметь высокое p-значение, поскольку в данных нет структуры.
Наконец, обратите внимание, что этот тест показал, что он может давать низкие p-значения даже если в данных есть только слабая структура [1].
Ссылки
Общее время выполнения скрипта: (0 минут 14.135 секунд)
Связанные примеры
© 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