用于比较分类算法的统计测试

本文介绍了几种用于比较监督分类学习算法的统计测试方法,包括双比例试验、重抽样配对t检验、交叉验证配对t检验、麦克纳马拉试验和5x2交叉验证试验。每种测试都有其优缺点,如双比例试验不考虑样本独立性,而5x2交叉验证试验被认为是最佳选择。作者建议根据时间预算和算法特性选择合适的测试方法。

用于比较分类算法的统计测试

回顾开创性的论文和实施,以发现适合您的数据的最佳选择

对大多数数据科学家来说,比较预测方法以确定哪种方法应该用于手头的任务是一项日常活动。通常,我们会有一个分类模型库,并使用交叉验证来验证它们,以确定哪一个是最好的。

然而,另一个目标不是比较分类器,而是比较学习算法本身。其想法是:给定这个任务(数据),哪种学习算法(KNN、SVM、随机森林等)将在大小为D的数据集上生成更准确的分类器?

正如我们将看到的,这里介绍的每种方法都有一些优点和缺点。然而,使用两个比例测试的第一直觉可能会导致一些非常糟糕的结果。

为了更多地了解我们如何比较这些算法,并提高我们的统计学知识,今天我将解释和实现用于比较监督分类学习算法的近似统计测试[1]中的方法,这是一篇关于该领域的开创性论文。

在接下来的部分中,我将描述每个测试,讨论其优缺点,实现它们,然后将结果与可用的实现进行比较。

这篇文章的笔记本可以在 KaggleGithub 上找到。

初始代码设置

对于本文中的代码,我们将使用两种分类算法:KNN和随机森林,在 sklearn 软件包上免费提供的UCI机器学习库中的葡萄酒数据集[2]上预测葡萄酒质量。为此,我们将导入一些必需的库,并实例化算法:

# Importing the required libs
import numpy as np
import pandas as pd

from tqdm import tqdm
from scipy.stats import norm, chi2
from scipy.stats import t as t_dist
from sklearn.datasets import load_wine
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split, KFold

# Libs implementations
from mlxtend.evaluate import mcnemar
from mlxtend.evaluate import mcnemar_table
from mlxtend.evaluate import paired_ttest_5x2cv
from mlxtend.evaluate import proportion_difference
from mlxtend.evaluate import paired_ttest_kfold_cv
from mlxtend.evaluate import paired_ttest_resampled# Getting the wine data from sklearn
X, y = load_wine(return_X_y = True)# Instantiating the classification algorithms
rf = RandomForestClassifier(random_state=42)
knn = KNeighborsClassifier(n_neighbors=1)# For holdout cases
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)

双比例试验(Two Proportions Test)

比较两个比例是一个非常古老的问题,统计学有一个经典的假设检验来解决这个问题:给定两个总体的两个比例,无效假设是比例之间的差异的平均值等于零。

我们可以用以下统计数据来计算:双比例检验统计量(Two proportions test statistic)
z = p A − p B 2 p ( 1 − p ) / n z=\frac{p_{A}-p_{B}}{\sqrt{2 p(1-p) / n}} z=2p(1p)/n pApB
看起来很简单,对吧?我们只需要得到我们算法的命中率(准确度)并进行比较。然而,这个测试有一个重要的假设:样本的独立性。

大家可以很快猜到,这里的样本不是独立的,因为两种算法的测试集和训练集都是相同的。所以这个假设是错误的。

这种方法还有两个问题:

  1. 它不考虑测试集的方差。如果我们改变它,我们可能会有非常不同的结果
  2. 它并不代表整个数据集,而是代表了一组较小的数据集,这些数据集被选择用于训练

要使用此测试,可以使用以下代码:

# First we fit the classification algorithms
rf.fit(X_train, y_train)
knn.fit(X_train, y_train)# Generate the predictions
rf_y = rf.predict(X_test)
knn_y = knn.predict(X_test)# Calculate the accuracy
acc1 = accuracy_score(y_test, rf_y)
acc2 = accuracy_score(y_test, knn_y)# Run the test
print("Proportions Z-Test")
z, p = proportion_difference(acc1, acc2, n_1=len(y_test))
print(f"z statistic: {z}, p-value: {p}\n")

在这里,我们只是在保持测试集上拟合算法,并对结果精度进行测试。

重抽样配对t检验(Resampled Paired t-test)

为了解释测试集的方差,可以使用重采样配对t检验。在这个测试中,我们将设置一些试验(例如30次),并使用一个保持测试集来测量每个试验中每个算法的准确性。

然后,如果我们假设 p i = p A i − p B i p_i=pA_i-pB_i pi=pAipBi,对于每个试验 i i i 是正态分布的,我们可以应用配对学生的 t t t 检验:配对t检验统计量(Paired t-test statistic)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

或许,这就是梦想吧!

如果对你有用,欢迎打赏。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值