使用排列测试分类分数的显著性#

本示例演示如何使用 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(n_splits=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 值非常低。这表明仅仅通过偶然获得如此好分数的可能性很低。它提供了证据,表明鸢尾花数据集的特征和标签之间存在真实依赖关系,并且分类器能够利用这一点获得良好结果。低的 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\niris data: {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\nrandom data: {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 值是否也高。

最后,请注意,即使数据中只有微弱的结构,此测试也已显示能够产生低 p 值 [1]

参考文献

脚本总运行时间: (0 分钟 11.711 秒)

相关示例

鸢尾花数据集上的主成分分析(PCA)

鸢尾花数据集上的主成分分析(PCA)

绘制在鸢尾花数据集上训练的决策树决策面

绘制在鸢尾花数据集上训练的决策树决策面

在鸢尾花数据集上绘制不同的 SVM 分类器

在鸢尾花数据集上绘制不同的 SVM 分类器

增量 PCA

增量 PCA

由 Sphinx-Gallery 生成的画廊