原文towardsdatascience.com/the-colorful-power-of-permutation-tests-38f0490ebfbahttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4ce3dd25bad50a2c1f85e5463faedb76.png由作者创作的鸢尾花通过 Midjourney 生成机器学习和统计学由于它们的复杂数学基础而常常显得令人畏惧。然而一些概念如排列检验出奇地直观可以通过简单的实验来理解。排列检验是评估各个领域结果重要性的宝贵工具从心理学到数据科学。让我们通过一个引人入胜的例子来探索这个强大的概念学习德语中颜色的名称。在这里你就是机器学习一个复杂的神经网络仅通过自然地生育一个孩子就能自然产生颜色学习实验https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/785be05fb764824635c470e8f9c62b1b.png德语中的颜色原始数据集。图片由作者提供。想象我给你一个数据集每个颜色都使用相同颜色的墨水命名。你研究了几分钟记住了颜色名称然后我测试你。令人印象深刻的是你正确地命名了所有颜色只有一个小的错误。但我们如何确保德语有意义或者你的大脑是否正常工作呢一种检查方法是通过使用排列检验。打乱标签https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f8eec27f685b36dbad31af4885e2408f.png德语中的颜色打乱的数据集。图片由作者提供。排列检验背后的想法很简单。我们取原始数据集随机打乱颜色标签以创建一个新的数据集。现在当你尝试从这些打乱的数据中学习时你会感到头疼因为颜色和它们的标签之间没有有意义的关系。如果我用这个打乱的数据集测试你你很可能会犯很多错误。我们重复这个打乱过程 100 次每次计算你犯的错误数量。假设在这 100 次尝试中你偶然间全部正确地猜出了颜色。所以在这 100 次尝试中你只在打乱的数据上比原始数据集表现得更好一次。你的 p 值将是 0.01这低于 0.05 的常识阈值。因此德语是有意义的你的大脑完全正常能够找出颜色和德语中它们名称之间的关联。计算 P 值你在打乱的数据上比原始数据获得更好结果次数与总尝试次数之比给出了p 值。这很简单且强大无需复杂的统计分布或花哨的测试。唯一的缺点是它可能计算成本高昂。斯托普效应这个颜色和文本不匹配的例子也被称为斯特鲁普效应它在心理学中用于展示执行功能。执行功能是一系列认知过程使你能够规划、集中注意力、记住指令并成功处理多个任务。斯特鲁普效应揭示了大脑中不同信息源之间的冲突。当颜色的名称例如“红色”以不是该名称所表示的颜色例如用蓝色墨水打印的“红色”单词打印时你会经历反应时间的延迟这显示了你的大脑如何努力处理冲突信息。如果你是一位德语母语者你可能会在命名颜色而不是阅读文本时遇到困难。为了尝试请说出文本的颜色而不是单词本身——这比听起来要复杂得多我还为你设计了一件带有斯特鲁普效应的 T 恤。每次你照镜子时它都会帮助你记住这个概念并在你的活动和咖啡休息时间作为一个很好的破冰者。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1c8962c96b5d970f7a50e2216b0efc1a.png由作者设计由 Printful 打印和发送斯特鲁普效应男女通用 T 恤 - 科学家和极客的认知测试 T 恤真实世界的应用排列测试在各个领域都有广泛的应用。在心理学中它们用于评估组或条件之间差异的显著性。在遗传学中排列测试有助于识别显著的遗传关联。在机器学习中它们可以用来评估模型性能和数据质量。通过理解排列测试的通用性读者可以欣赏其在研究和实际应用中的价值。评估任何机器学习模型现在假设一位数据科学家已经使用你的数据训练了一个模型而你又想评估其性能但又不知道模型内部的工作原理。你可以这样做在原始数据上训练模型并记录其分数。打乱标签并再次训练模型。重复这个过程 100 次或更多并计算模型在打乱的数据上比原始数据表现更好的次数。模型在打乱的数据上表现更好的比例给出了 p 值的估计。如果这个值很高表明模型可能没有有效地学习或者数据本身没有信息性。Python 代码示例没有 Python 代码的数据科学帖子是不完整的在这里我使用Iris 数据集Fisher 1936CC BY 4.0 许可通过两个分类器来展示这个概念一个弱分类器和一个非常强大的分类器。这里的想法是通过打乱标签来消除特征和目标之间的可能关联。然后我们使用选择的分类器并使用选择的交叉验证方法计算其在打乱数据上的性能。我们重复它比如说1000 次。我们得到比原始未触动的数据更好的分数的次数是 p 值的估计。我们在两个不同的分类器上检查它一个是非常弱的随机一个是非常强的。总之我们展示了对于sklearn.datasets.load_iris数据使用sklearn.model_selection.permutation_test_score我们可以证明sklearn.dummy.DummyClassifier无法找到输入特征和鸢尾花类型之间的任何显著的统计关联而sklearn.ensemble.HistGradientBoostingClassifier发现了这种关联。# Load the libraries.fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimportStratifiedKFold,permutation_test_scorefromsklearn.dummyimportDummyClassifierfromsklearn.ensembleimportHistGradientBoostingClassifierfromsklearn.linear_modelimportLogisticRegressionfrommatplotlibimportpyplotasplt# The Iris dataset (Fisher 1936, CC BY 4.0 license) is publicly available at:# https://archive.ics.uci.edu/ml/datasets/iris虚拟分类器我使用sklearn.dummy.DummyClassifier并设置strategystratified。在预测时它将随机输出类别所以仅通过查看标签你无法判断它是一个虚拟分类器。# Load the Iris datasetX,yload_iris(return_X_yTrue)# Use StratifiedKFold to make sure all lables are present.cvStratifiedKFold(2,shuffleTrue)# The DummyClassifier, I use stratified strategy so it spits out all the classes when predict is called.dummy_clfDummyClassifier(strategystratified)# Compute the permutation test scorescore_dummy,permutation_scores_dummy,pvalue_dummypermutation_test_score(dummy_clf,X,y,scoringaccuracy,cvcv,n_permutations1000)# Display results for DummyClassifierprint(fDummyClassifier score:{score_dummy:.4f}, p-value:{pvalue_dummy:.4f})DummyClassifier score:0.3200,p-value:0.6274p 值远远大于常识中的 p 值 0.05。这不是一个好的分类器并且无法找到特征和类别之间的关系。直方图显示它是一个无用的分类器因为其分数和排列的分数重叠。# Plot the histogram of pemutation scores (blue) and show dummy classifier score (red)plt.hist(permutation_scores_dummy,alpha0.5)plt.vlines(score_dummy,0,300,r)plt.xlabel(accuracy)plt.title(Histogram of accuracies of permutations in Dummy classifier)https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fb4d18bbb3f87ea59c9e66a87469eeab.png红线表示原始数据集上的分数。真实分类器这次我们使用sklearn.ensemble.HistGradientBoostingClassifier它在发现特征和目标之间的关系方面要强大得多让我们看看它的实际效果。# Initialize the HistGradientBoostingClassifierhgbc_clfHistGradientBoostingClassifier()# Compute the permutation test scorescore_hgbc,permutation_scores_hgbc,pvalue_hgbcpermutation_test_score(hgbc_clf,X,y,scoringaccuracy,cvcv,n_permutations1000,n_jobs-1)# Display results for HistGradientBoostingClassifierprint(fHistGradientBoostingClassifier score:{score_hgbc:.4f}, p-value:{pvalue_hgbc:.4f})HistGradientBoostingClassifier score:0.9267,p-value:0.0010与上次相比分数相当高接近准确度分数可能的最大值 1。p 值也低于 0.05 的阈值 5 倍。现在让我们看看排列分数的直方图并将其与原始分数进行比较。# Plot the histogram of pemutation scores (blue) and show hgbc classifier score (red)plt.hist(permutation_scores_hgbc,alpha0.5)plt.vlines(score_hgbc,0,250,r)plt.xlabel(accuracy)plt.title(Histogram of accuracies of permutations in HGBC)https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b67bffa89fb715785625a84d267332a3.png红线表示原始数据集上的分数。我将代码放在了 Google Colab 笔记本中所以你可以克隆它并立即开始享受乐趣Google Colab结论排列检验是评估机器学习和统计学中结果显著性的强大且直观的工具。通过打乱标签并比较性能我们可以深入了解我们模型的效力和数据的质量而无需复杂的数学概念。所以下次当你遇到机器学习模型时记得颜色学习示例和排列检验。这是一种简单而有效的方法来评估性能并在你的数据科学项目中做出明智的决定。感谢阅读如果你喜欢我的写作请关注我并鼓掌以激励我你可能也喜欢我的其他文章用 Python 比较苹果和橙子这篇文章由 AI 最小程度编辑使用的是MEditor。