分类得分的置换测试

本示例展示了如何使用置换测试来评估交叉验证得分的重要性。置换测试是一种统计方法,通过随机打乱数据集中的标签,来评估模型预测得分与实际标签之间的相关性。如果模型的得分在原始数据上显著高于随机打乱标签后的数据,那么可以认为模型确实捕捉到了数据中的某些结构。

数据集

将使用鸢尾花数据集(Iris dataset),该数据集包含了150个样本,每个样本有4个特征,分别对应于鸢尾花的萼片长度、萼片宽度、花瓣长度和花瓣宽度。此外,还生成了一些与鸢尾花数据集类别标签无关的随机特征数据。

from sklearn.datasets import load_iris import numpy as np # 加载iris数据集 iris = load_iris() X = iris.data y = iris.target # 生成20个与类别标签无关的随机特征 n_uncorrelated_features = 20 rng = np.random.RandomState(seed=0) X_rand = rng.normal(size=(X.shape[0], n_uncorrelated_features))

置换测试得分

接下来,将使用原始的iris数据集和随机生成的特征数据来计算置换测试得分。将使用支持向量机(SVC)分类器和准确率(Accuracy)得分来评估每一轮的模型。置换测试得分通过在1000个不同的数据集置换中计算分类器的准确率来生成一个空分布,其中特征保持不变,但标签经过不同的置换。这是空假设的分布,即特征和标签之间没有依赖关系。然后,通过计算获得的得分高于原始数据得分的置换比例来计算经验p值。

from sklearn.model_selection import StratifiedKFold, permutation_test_score from sklearn.svm import SVC # 初始化SVC分类器 clf = SVC(kernel="linear", random_state=7) cv = StratifiedKFold(2, shuffle=True, random_state=0) # 计算iris数据集的置换测试得分 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值非常低。这表明,仅凭偶然因素获得如此好得分的可能性很低,这为iris数据集包含真实的特征和标签之间的依赖关系提供了证据,分类器能够利用这种依赖关系获得良好的结果。

import matplotlib.pyplot as plt # 绘制iris数据集的置换得分直方图 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") plt.show()

随机数据

下面绘制了随机数据的空分布。置换得分与使用原始iris数据集获得的得分相似,因为置换总是破坏任何特征标签依赖关系。然而,在这种情况下,原始随机数据上获得的得分非常差。这导致了一个很大的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值。

  • 鸢尾花数据集上的主成分分析(PCA)
  • 鸢尾花数据集上的不同SVM分类器
  • 在鸢尾花数据集上训练的决策树的决策面
  • 具有多重共线性或相关特征的置换重要性
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485