使用排列组合测试分类得分的显著性#

此示例演示了如何使用 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]

References

脚本总运行时间: (0 minutes 11.151 seconds)

相关示例

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

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

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

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

绘制 iris 数据集中的不同 SVM 分类器

绘制 iris 数据集中的不同 SVM 分类器

增量 PCA

增量 PCA

由 Sphinx-Gallery 生成的图库