有一个强有力的论据,为什么选择一个分类算法而不是其他基于性能的显著性水平
介绍选择正确的机器学习算法是决定性的,它决定了模型的性能。在选择模型时,最主要的因素是性能,它采用KFold交叉验证技术来实现独立性。
所选模型通常具有更高的平均性能。尽管如此,有时它还是源于统计上的侥幸。有许多统计假设检验方法来评估交叉验证产生的平均性能差异,以解决这一问题。如果差异高于显著性水平“p值”,我们可以拒绝两种算法相同且差异不显著的无效假设。
无论是在开发新的分类模型时,还是在参加卡格尔的竞赛时,我通常都会在我的计划中加入这样一个步骤。
指南目标- 了解统计假设检验之间的差异。基于平均绩效分数的模型选择可能会产生误导。为什么使用配对学生的t检验而不是原始学生的t检验。应用先进的5X2折叠技术,利用MLxtend库对基于p值的算法进行比较
- 统计显著性检验是什么意思?常用统计假设检验的类型根据性能提取最佳的两个模型。对最好的两个进行假设检验的步骤应用5X2折叠的步骤比较分类器算法总结工具书类
考虑到两个数据样本具有相同的分布,统计假设检验量化了见证两个数据样本的合理性。这描述了无效假设。我们可以通过应用一些统计计算来检验这个零假设。
如果测试结果没有足够的证据推翻无效假设,那么模型分数中观察到的任何差异都是偶然发生的。如果测试结果推断出足够的证据来否定无效假设,那么模型分数中观察到的任何差异都是真实的。 统计假设检验的类型
通过统计显著性测试检查机器学习模型需要一些预期,这些预期将影响所使用的统计测试。这种比较最可靠的方法叫做配对设计,它在相同的数据上比较两种模型(或算法)的性能。这样一来,两种模型(或算法)必须处理相同的困难。
下面,每个测试都有一些利弊,你应该在选择过程中考虑。
P.N:还有其他统计测试用于比较分类器,但这些是最推荐的。
- 独立数据样本:具有无限数据集时使用。为列车采集n个样本,并测试数据集。然后计算每种方法的10个独立模型分数。最后,应用t检验来比较模型。然而,这种方法并不实用,因为现实中没有无限的数据。十倍交叉验证:采用普通配对t检验。与其他方法相比,该方法具有良好的重复性,且II型误差相当。然而,它有很高的I型错误;这就是为什么不推荐它。
通过交叉验证比较训练算法比比较特定(完全训练的)模型的预测性能做出更有力的假设。重采样验证(交叉验证所属)无法完全估计算法比较的方差不确定性。
3.麦克内马尔试验:
在统计学中,麦克内马尔检验是对成对名义数据进行的统计检验。它适用于具有二分法特征的2×2列联表,以及配对的受试者,以确定行和列边缘频率是否相等(即是否存在“边缘同质性”)-维基百科([Wikipedia](https://en.wikipedia.org/wiki/McNemar’s_test#:~:text=In statistics%2C McNemar’s test is,is “marginal homogeneity”).)
建议在过去二十年内使用。然而,这种方法的挑战在于,您要么需要构建函数来实现它,要么使用第三方库,在这些库中,您使用的工具通常不会为您打包。
- 非参数配对检验:该方法涉及一些假设。例如,假设模型精度的分布为正态分布(高斯分布)。
Wilcoxon符号秩检验是配对学生t检验的非参数版本。虽然测试是非参数的,但它仍然假设每个样本内的观察值是独立的。尽管使用k-折叠交叉验证会打破这一假设。
- 使用维基百科的数据分析、精确性分析和效果分析框架。然而,当使用重采样方法评估模型时,独立性假设被打破。另一种方法是使用其他统计重采样方法,如自举法。Bootstrapping可以估计一个稳健的非参数置信区间。因此,我们可以解释结果并比较分类器。
在相同的k倍交叉验证分割数据上评估每个模型并计算每个分割分数的方法。这将为十倍交叉验证提供十个分数的样本。然后,我们可以使用配对统计测试来比较这些分数。
由于使用相同的数据行多次训练模型,违反了独立性假设;因此,测试将是有偏见的。
这种统计测试可以进行调整,以克服缺乏独立性的问题。此外,可以配置方法的折叠和重复次数,以实现更好的模型性能采样。
加载数据集Thomas Dieterich在“比较监督分类学习算法的近似统计测试”中提出了这种方法1998
对于本教程,我将使用 sklearn 库中的 load_iris 数据集。但是,对于任何ML问题,步骤都是相同的。
查看iris数据集
在本步骤中,我将根据性能准确度评分对四种不同的算法进行比较。然后选择得分最高的两个模型进行假设检验。
# Spot-Check Algorithms
models = []
models.append(('LR', LogisticRegression(max_iter=1000)))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('DSC', DecisionTreeClassifier(random_state = 1, max_depth=2)))
models.append(('SVM', SVC()))
# evaluate each model in turn
results = []
names = []
for name, model in models:
kfold = RepeatedStratifiedKFold(n_splits=10, n_repeats = 3, random_state=1)
cv_results = cross_val_score(model, X, y, cv=kfold, scoring='accuracy')
results.append(cv_results)
names.append(name)
msg = "%s: %.2f (%.3f)" % (name, cv_results.mean(), cv_results.std())
print(msg)
结果:
LR: 0.96 (0.041) LDA: 0.98 (0.031) KNN: 0.96 (0.037) DSC: 0.94 (0.051) SVM: 0.96 (0.045)
似乎 LR、KNN 和 SVM 具有相同的平均值,但标准偏差略有不同。然而,LDA显示出更高的性能,而DTC显示出比其他算法最低的性能。让我们在 KNN、DTC 和 LDA 之间建立一个箱线图,作为更多解释的可视化。
import matplotlib.pyplot as pltplt.figure(figsize = (15, 10))
plt.grid(False)
plt.title("Mean accuracies between the best two selected algorithms", fontsize = 25, fontweight = 'bold')
算法之间的平均精度
看来LDA和DTC的性能是一样的,所以让我们选择这两个。
假设检验的步骤对于这个分类问题,可以实现逻辑回归。然而,我选择了更复杂的分类算法来展示假设检验的思想。
第一步是陈述无效假设陈述。
H0:两个模型在数据集上的性能相同。
H1:两个模型在数据集上的性能不一样。
显著性水平为0.05
假设显著性阈值α=0.05,以拒绝两种算法在数据集上表现相同的零假设,并进行5x2_cv_t_检验(5x2_cv _t_test)。
# evaluate model 1
model1 = LinearDiscriminantAnalysis()
cv1 = RepeatedStratifiedKFold(n_splits = 10, n_repeats = 3, random_state = 1)
scores1 = cross_val_score(model1, X, y, scoring = 'accuracy', cv = cv1, n_jobs = -1)
print('LDA Mean Accuracy: %.1f%% +/-(%.3f)' % (mean(scores1*100), std(scores1)))# evaluate model 2
model3 = DecisionTreeClassifier(random_state = 1, max_depth=2)
cv2 = RepeatedStratifiedKFold(n_splits = 10, n_repeats = 3, random_state = 1)
scores3 = cross_val_score(model2, X, y, scoring = 'accuracy', cv = cv2, n_jobs = -1)
print('DecisionTreeClassifier Mean Accuracy: %.1f%% +/-(%.3f)' % (mean(scores3*100), std(scores3)))# plot the results
plt.boxplot([scores1, scores2], labels=['LDA', 'DTC'], showmeans=True)
plt.show()
结果:
LDA Mean Accuracy: 98.0% +/-(0.031) DecisionTreeClassifier Mean Accuracy: 96.4% +/-(0.037)
似乎 LDA 比 DTC 有更好的性能,LDA 的精确度更高。
使用MLxtend包装的5×2 CV您可以从头开始实现5X2 CV折叠;然而,有一个很好的包,它叫MLxtend,可以为您节省很多时间。我将使用评估模块中的成对_ttest_5x2cv函数来计算两个模型的t和p值。
from mlxtend.evaluate import paired_ttest_5x2cv
# check if difference between algorithms is real
t, p = paired_ttest_5x2cv(estimator1=model1,
estimator2=model2,
X=X,
y=y,
scoring='accuracy',
random_seed=1)
# summarize
print(f'The P-value is = {p:.3f}')
print(f'The t-statistics is = {t:.3f}')
# interpret the result
if p <= 0.05:
print('Since p<0.05, We can reject the null-hypothesis that both models perform equally well on this dataset. We may conclude that the two algorithms are significantly different.')
else:
print('Since p>0.05, we cannot reject the null hypothesis and may conclude that the performance of the two algorithms is not significantly different.')
The P-value is = 0.027 The t-statistics is = 3.101 Since p<0.05, We can reject the null-hypothesis that both models perform equally well on this dataset. We may conclude that the two algorithms are significantly different # 由于p<0.05,我们可以拒绝两个模型在该数据集上表现相同的无效假设。我们可以得出结论,这两种算法有很大的不同
现在你有了一个强有力的理由,为什么选择 LDA 而不是 DTC。
总结最后,我希望本教程能很好地说明如何使用假设检验来开发更有意义的模型。我的建议是在分类管道中加入算法比较。尝试迭代以及尝试不同的算法性能比较。
感谢阅读!
ReferencesKaggle competitionsMLxtend libraryApproximate statistical tests for comparing supervised classification learning algorithms — Thomas Dietterich, 1998MLxtend.evaluate.5X2cv paired t test APISklearn general datasets APIExecutable kaggle notebook
@article{Shahawy2021Dec,
author = {Shahawy, S. E.},
title = {{evaluate ML Classifiers Performance using Hypothesis testing | Towards Data Science}},
journaltitle = {Medium},
year = {2021},
month = {12},
date = {2021-12-15},
urldate = {2022-03-10},
publisher = {Towards Data Science},
language = {english},
hyphenation = {english},
url = {https://towardsdatascience.com/evaluate-ml-classifier-performance-using-statistical-hypothesis-testing-in-python-e4b90eb27dce},
abstract = {{Have a strong argument why picking a classification algorithm over the other based on significance level in performance}}
}



