使用置换检验分类分数的显著性#

此示例演示了如何使用 permutation_test_score 使用置换来评估交叉验证分数的显著性。

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

数据集#

我们将使用 鸢尾花数据集,它包含从三种鸢尾花中测量的数值。

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]

参考文献

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

相关示例

Iris 数据集上的主成分分析 (PCA)

Iris 数据集上的主成分分析 (PCA)

绘制在 iris 数据集上训练的决策树的决策面

绘制在 iris 数据集上训练的决策树的决策面

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

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

具有多重共线性或相关特征的置换重要性

具有多重共线性或相关特征的置换重要性

Sphinx-Gallery 生成的图库