paired_ttest_5x2cv: 5x2cv 配对 t 检验用于分类器比较
5x2cv配对t检验程序用于比较两个模型的性能
> `from mlxtend.evaluate import paired_ttest_5x2cv`
概述
5x2cv 配对 t 检验是一种比较两个模型(分类器或回归器)性能的程序,该方法由 Dietterich 提出 [1],旨在解决其他方法的不足之处,例如重抽样配对 t 检验(请参见 paired_ttest_resampled
)和 k 折交叉验证配对 t 检验(请参见 paired_ttest_kfold_cv
)。
为了说明该方法的工作原理,我们考虑两个估计器(例如,分类器)A 和 B。此外,我们还拥有一个已标记的数据集 D。在常见的保留法中,我们通常将数据集拆分为两个部分:训练集和测试集。在 5x2cv 配对 t 检验中,我们重复拆分(50% 训练数据和 50% 测试数据)5 次。
在每次的 5 次迭代中,我们将 A 和 B 拟合到训练集,并在测试集上评估它们的性能 ($p_A$ 和 $p_B$)。然后,我们交换训练集和测试集(训练集变为测试集,反之亦然),再计算一次性能,这会得到 2 个性能差异度量:
$$p^{(1)} = p^{(1)}_A - p^{(1)}_B$$
和
$$p^{(2)} = p^{(2)}_A - p^{(2)}_B.$$
然后,我们估计这些差异的均值和方差:
$\overline{p} = \frac{p^{(1)} + p^{(2)}}{2}$
和
$s^2 = (p^{(1)} - \overline{p})^2 + (p^{(2)} - \overline{p})^2.$
差异的方差在 5 次迭代中进行计算,然后用于计算 t 统计量,如下所示:
$$t = \frac{p_1^{(1)}}{\sqrt{(1/5) \sum_{i=1}^{5}s_i^2}},$$
其中 $p_1^{(1)}$ 是第一轮的 $p_1$。在假设模型 A 和 B 性能相等的原假设下,t 统计量假设大致遵循具有 5 个自由度的 t 分布。使用 t 统计量,可以计算 p 值,并与之前选择的显著性水平进行比较,例如 $\alpha=0.05$。如果 p 值小于 $\alpha$,我们将拒绝原假设,接受两个模型之间存在显著差异。
参考文献
- [1] Dietterich TG (1998) 比较监督分类学习算法的近似统计检验. 神经计算 10:1895–1923.
示例 1 - 5x2交叉验证配对 t 检验
假设我们想比较两种分类算法:逻辑回归和决策树算法:
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from mlxtend.data import iris_data
from sklearn.model_selection import train_test_split
X, y = iris_data()
clf1 = LogisticRegression(random_state=1)
clf2 = DecisionTreeClassifier(random_state=1)
X_train, X_test, y_train, y_test = \
train_test_split(X, y, test_size=0.25,
random_state=123)
score1 = clf1.fit(X_train, y_train).score(X_test, y_test)
score2 = clf2.fit(X_train, y_train).score(X_test, y_test)
print('Logistic regression accuracy: %.2f%%' % (score1*100))
print('Decision tree accuracy: %.2f%%' % (score2*100))
Logistic regression accuracy: 97.37%
Decision tree accuracy: 94.74%
注意,这些准确度值在配对 t 检验过程中并没有被使用,因为在重采样过程中会生成新的测试/训练分割,以上值仅用于提供直觉。
现在,假设显著性阈值为 $\alpha=0.05$,以拒绝两个算法在数据集上表现相同的原假设,并进行 5x2cv t 检验:
from mlxtend.evaluate import paired_ttest_5x2cv
t, p = paired_ttest_5x2cv(estimator1=clf1,
estimator2=clf2,
X=X, y=y,
random_seed=1)
print('t statistic: %.3f' % t)
print('p value: %.3f' % p)
t statistic: -1.539
p value: 0.184
由于 $p > \alpha$,我们不能拒绝原假设,可以得出结论:这两种算法的表现没有显著差异。
虽然通常不建议在没有进行多重假设检验校正的情况下多次应用统计检验,但我们来看看一个例子,其中决策树算法被限制为生成一个非常简单的决策边界,这将导致相对较差的性能:
clf2 = DecisionTreeClassifier(random_state=1, max_depth=1)
score2 = clf2.fit(X_train, y_train).score(X_test, y_test)
print('Decision tree accuracy: %.2f%%' % (score2*100))
t, p = paired_ttest_5x2cv(estimator1=clf1,
estimator2=clf2,
X=X, y=y,
random_seed=1)
print('t statistic: %.3f' % t)
print('p value: %.3f' % p)
Decision tree accuracy: 63.16%
t statistic: 5.386
p value: 0.003
假设我们在显著性水平 $\alpha=0.05$ 下进行了此次测试,我们可以拒绝原假设,即这两个模型在此数据集上的表现相同,因为 p 值 ($p < 0.001$) 小于 $\alpha$。
API
paired_ttest_5x2cv(estimator1, estimator2, X, y, scoring=None, random_seed=None)
Implements the 5x2cv paired t test proposed by Dieterrich (1998) to compare the performance of two models.
Parameters
-
estimator1
: scikit-learn classifier or regressor -
estimator2
: scikit-learn classifier or regressor -
X
: {array-like, sparse matrix}, shape = [n_samples, n_features]Training vectors, where n_samples is the number of samples and n_features is the number of features.
-
y
: array-like, shape = [n_samples]Target values.
-
scoring
: str, callable, or None (default: None)If None (default), uses 'accuracy' for sklearn classifiers and 'r2' for sklearn regressors. If str, uses a sklearn scoring metric string identifier, for example {accuracy, f1, precision, recall, roc_auc} for classifiers, {'mean_absolute_error', 'mean_squared_error'/'neg_mean_squared_error', 'median_absolute_error', 'r2'} for regressors. If a callable object or function is provided, it has to be conform with sklearn's signature
scorer(estimator, X, y)
; see https://scikit-learn.org/stable/modules/generated/sklearn.metrics.make_scorer.html for more information. -
random_seed
: int or None (default: None)Random seed for creating the test/train splits.
Returns
-
t
: floatThe t-statistic
-
pvalue
: floatTwo-tailed p-value. If the chosen significance level is larger than the p-value, we reject the null hypothesis and accept that there are significant differences in the two compared models.
Examples
For usage examples, please see https://rasbt.github.io/mlxtend/user_guide/evaluate/paired_ttest_5x2cv/