在机器学习模型评估中,经常需要确定模型预测性能的统计显著性。一种方法是通过交叉验证来估计模型的泛化能力,但这种方法可能无法告诉模型的性能是否真正优于随机猜测。为了解决这个问题,可以使用排列测试(permutation test)来评估模型分数的显著性。排列测试通过随机打乱目标变量的顺序来生成“随机化数据”,并计算模型在这些随机化数据上的表现,从而得到一个经验p值。这个p值表示在所有随机化数据集中,模型表现与原始数据一样好或更好的比例。如果p值较小,说明特征和目标之间存在真实的依赖关系,模型利用这种依赖关系做出了好的预测。如果p值较大,可能是因为特征和目标之间缺乏真实的依赖关系,或者模型未能利用这种依赖关系做出好的预测。
排列测试的工作原理如下:首先,使用交叉验证来评估模型在原始数据上的表现。然后,对目标变量进行多次随机排列,每次排列都会生成一个新的数据集。对于每个排列后的数据集,都使用相同的交叉验证策略来评估模型的表现,并记录下每次评估的分数。最后,计算模型在原始数据上的分数与所有排列后数据集分数之间的比较,得到一个p值。这个p值可以近似地看作是模型分数由偶然因素导致的概率。
在实际应用中,可以使用scikit-learn库中的permutation_test_score函数来执行排列测试。这个函数接受一个模型对象、特征数据、目标变量以及一些可选参数,如交叉验证策略、排列次数、并行计算的处理器数量等。函数返回三个值:原始数据上的真正分数、所有排列后数据集的分数以及经验p值。通过这些结果,可以判断模型的预测性能是否具有统计显著性。
需要注意的是,在执行排列测试时,可以通过设置不同的参数来控制测试的精度和计算成本。例如,增加排列次数可以提高p值估计的精度,但同时也会增加计算时间。此外,还可以设置不同的交叉验证策略,如K折交叉验证或分层K折交叉验证,以适应不同的数据分布和模型类型。
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import permutation_test_score
# 生成模拟数据
X, y = make_classification(random_state=0)
# 初始化模型
estimator = LogisticRegression()
# 执行排列测试
score, permutation_scores, pvalue = permutation_test_score(
estimator, X, y, random_state=0
)
# 打印结果
print(f"Original Score: {score:.3f}")
print(f"Permutation Scores: {permutation_scores.mean():.3f} +/- {permutation_scores.std():.3f}")
print(f"P-value: {pvalue:.3f}")