Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较2 ML模型的性能精度之间的差异是否具有统计学意义_Python_Machine Learning_Scikit Learn_Statistics_Cross Validation - Fatal编程技术网

Python 比较2 ML模型的性能精度之间的差异是否具有统计学意义

Python 比较2 ML模型的性能精度之间的差异是否具有统计学意义,python,machine-learning,scikit-learn,statistics,cross-validation,Python,Machine Learning,Scikit Learn,Statistics,Cross Validation,这是我第一次使用堆栈交换,但我需要一个问题的帮助(这不是家庭作业或作业问题): 我有两个决策树:D1=DecisionTreeClassifier(max_depth=4,criteria='entropy',random_state=1)和D2=decisiontreeclassier(max_depth=8,criteria='entropy',random_state=1)。当我对给定的一组特征和相应的标签对它们进行5次交叉验证时,我发现它们在5次交叉验证中的平均验证精度分别为0.59和0

这是我第一次使用堆栈交换,但我需要一个问题的帮助(这不是家庭作业或作业问题):

我有两个决策树:
D1=DecisionTreeClassifier(max_depth=4,criteria='entropy',random_state=1)
D2=decisiontreeclassier(max_depth=8,criteria='entropy',random_state=1)
。当我对给定的一组特征和相应的标签对它们进行5次交叉验证时,我发现它们在5次交叉验证中的平均验证精度分别为0.59和0.57。我如何确定他们的表现之间的差异是否具有统计学意义?(请注意,我们将使用显著性水平=0.01)


请说明此处是否缺少任何重要信息或术语。

这是一个非常好的问题,答案证明不是那么简单

出于本能,大多数人倾向于推荐;但是,正如机器学习掌握的优秀帖子中所解释的,这个测试实际上并不适合这种情况,因为它的假设事实上被违反了:

事实上,这种(学生的t检验)是比较的一种常见方法 可能有数百篇已发表论文的分类器使用此 方法论

问题是,配对学生的t检验的一个关键假设已经被证实 被侵犯了

也就是说,每个样本中的观测值不是独立的。作为一部分 在k-折叠交叉验证程序中,将给出一个给定的观察结果 在训练数据集中使用(k-1)次。这意味着 估计的技能分数是依赖的,而不是独立的,反过来 测试中t统计量的计算将 误导性错误,以及对统计数据和数据的任何解释 p值

本文继续推荐McNemar的测试(另请参见,现在已结束,SO问题),它是在Python包中实现的。我不会假装知道关于它的任何事情,我从来没有使用过它,所以你可能需要自己在这里做进一步的挖掘

然而,正如上述帖子所报道的,学生的t-测试可以是“最后手段”:

这是一个选择,但它是非常弱的建议

这就是我在这里要展示的;小心使用

首先,您不仅需要平均值,还需要交叉验证中每个k倍的性能指标的实际值。这在scikit learn中并非微不足道,但我最近回答了一个关于的相关问题,我将在这里使用scikit learn的Boston数据集和两个决策树回归器对答案进行调整(您当然可以根据自己的具体情况对其进行调整):

cv_mae_1
包含我们的度量值(此处为平均绝对误差-mae),适用于我们第一款车型的5倍:

cv_mae_1
# result:
[3.080392156862745,
 2.8262376237623767,
 3.164851485148514,
 3.5514851485148515,
 3.162376237623762] 
对于我们的第二款车型,同样的
cv_mae_2

cv_mae_2
# result
[3.1460784313725494,
 3.288613861386139,
 3.462871287128713,
 3.143069306930693,
 3.2490099009900986]
获得这些列表后,现在可以直接使用以下方法计算配对t检验统计量和相应的p值:

其中,在我们的案例中,巨大的p值意味着我们的MAE指标均值之间存在而不是统计显著差异


希望这有帮助-不要犹豫,自己深入挖掘…

对回复延迟表示遗憾,但您的帖子对您的帮助很大。我使用配对t检验统计来确定我的模型均值之间差异的统计显著性,到目前为止,它们已经被证明是非常有效的。@Desernaut感谢链接和答案。接下来的一个问题是:如果我有两个以上的模型要比较呢?我实际上有4个模型,我想看看哪些模型比其他模型好/差?在这种情况下,我是否应该对每一对可能重复相同的实验?(即,比较模型1-2、模型1-3、模型1-4、模型2-3等)
cv_mae_2
# result
[3.1460784313725494,
 3.288613861386139,
 3.462871287128713,
 3.143069306930693,
 3.2490099009900986]
from scipy import stats
stats.ttest_rel(cv_mae_1,cv_mae_2)
# Ttest_relResult(statistic=-0.6875659723031529, pvalue=0.5295196273427171)