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

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

# Authors:  Alexandre Gramfort <[email protected]>
#           Lucy Liu
# License: 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].

参考文献

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

相关示例

鸢尾花数据集

鸢尾花数据集

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

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

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

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

连接多个特征提取方法

连接多个特征提取方法

由 Sphinx-Gallery 生成的画廊