原文:
towardsdatascience.com/the-colorful-power-of-permutation-tests-38f0490ebfba
https://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 1936,CC 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并设置strategy="stratified"。在预测时,它将随机输出类别,所以仅通过查看标签,你无法判断它是一个虚拟分类器。
# Load the Iris datasetX,y=load_iris(return_X_y=True)# Use StratifiedKFold to make sure all lables are present.cv=StratifiedKFold(2,shuffle=True)# The DummyClassifier, I use "stratified" strategy so it spits out all the classes when predict is called.dummy_clf=DummyClassifier(strategy="stratified")# Compute the permutation test scorescore_dummy,permutation_scores_dummy,pvalue_dummy=permutation_test_score(dummy_clf,X,y,scoring="accuracy",cv=cv,n_permutations=1000)# Display results for DummyClassifierprint(f"DummyClassifier 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,alpha=0.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_clf=HistGradientBoostingClassifier()# Compute the permutation test scorescore_hgbc,permutation_scores_hgbc,pvalue_hgbc=permutation_test_score(hgbc_clf,X,y,scoring="accuracy",cv=cv,n_permutations=1000,n_jobs=-1)# Display results for HistGradientBoostingClassifierprint(f"HistGradientBoostingClassifier 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,alpha=0.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。