使用排列测试分类分数的显著性#
此示例演示了如何使用 permutation_test_score
使用排列来评估交叉验证分数的显著性。
# Authors: Alexandre Gramfort <[email protected]>
# Lucy Liu
# License: BSD 3 clause
数据集#
我们将使用 鸢尾花卉数据集,它包含从 3 种鸢尾花类型中获取的测量值。
我们还将生成一些与鸢尾花数据集中的类标签无关的随机特征数据(即 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 分钟 12.440 秒)
相关示例