如何使用配对 t 检验来评估使用 Python 的机器学习分类器的性能?

How to evaluate the performance of Machine Learning classifiers using Python by using Paired t-test?

提问人:Haseeb Tariq 提问时间:9/24/2023 最后编辑:Sandipan DeyHaseeb Tariq 更新时间:9/25/2023 访问量:45

问:

我是机器学习的初学者。我正在尝试对均值差异进行 t 检验,以评估哪种算法获得更高的 F1 分数。我有两种算法的结果,例如算法 A 的 F1_score 是 0.63,算法 B 的其他为 0.89。

我已经应用了以下代码,但我无法对其进行整理,并且不太了解错误。 如何比较两种算法?并从假设检验中获得性能结果?

X = data_frame.iloc[:, 3:]
y = data_frame.iloc[:,2:-7]

from mlxtend.evaluate import paired_ttest_5x2cv

t, p = paired_ttest_5x2cv(estimator1=f1_score_Algo_A, estimator2=f1_score_Algo_B, X=X, y=y)
alpha = 0.05

print('t statistic: %.3f' % t)
print('aplha ', alpha)
print('p value: %.3f' % p)

if p > alpha:
  print("Fail to reject null hypotesis")
else:
  print("Reject null hypotesis")
from mlxtend.evaluate import paired_ttest_5x2cv
----> t, p = paired_ttest_5x2cv(estimator1=lr_f1,estimator2=dt_f1, X=X, y=y, random_seed=1)
alpha = 0.05
print('t statistic: %.3f' % t)
AttributeError: 'numpy.float64' object has no attribute '_estimator_type'

预期结果将是哪种算法在F1_Score的基础上表现良好。

Python 机器学习 假设 统计检验

评论

0赞 desertnaut 9/24/2023
请不要发布代码或错误消息的屏幕截图;了解如何创建可重现性最小的示例

答:

1赞 Sandipan Dey 9/25/2023 #1

该函数期望训练的模型(要比较)作为输入,而不是 .paired_ttest_5x2cv()F1 scores

这是数据集(尝试使用您的数据集)和几个模型(LR 和 DT 模型,尝试使用您自己的模型)的重现错误:iris

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

from sklearn.metrics import f1_score

X, y = iris_data()
X_train, X_test, y_train, y_test = \
    train_test_split(X, y, test_size=0.25,
                     random_state=123)
algo_A = LogisticRegression(random_state=1, max_iter=1000)
algo_B = DecisionTreeClassifier(random_state=1, max_depth=1)

y_pred = algo_A.fit(X_train, y_train).predict(X_test)
f1_score_Algo_A = f1_score(y_test, y_pred, average='micro')

y_pred = algo_B.fit(X_train, y_train).predict(X_test)
f1_score_Algo_B = f1_score(y_test, y_pred, average='micro')

print(f'Algo A score: {f1_score_Algo_A}, Algo B score: {f1_score_Algo_B}')

from mlxtend.evaluate import paired_ttest_5x2cv

t, p = paired_ttest_5x2cv(estimator1=f1_score_Algo_A, estimator2=f1_score_Algo_B, X=X, y=y)
#t, p = paired_ttest_5x2cv(estimator1=algo_A, estimator2=algo_B, X=X, y=y)
alpha = 0.05

print('t statistic: %.3f' % t)
print('aplha ', alpha)
print('p value: %.3f' % p)

if p > alpha:
  print("Fail to reject null hypotesis")
else:
  print("Reject null hypotesis")

# if estimator1._estimator_type == "classifier":
#   ^^^^^^^^^^^^^^^^^^^^^^^^^^
# AttributeError: 'numpy.float64' object has no attribute '_estimator_type'

现在,尝试使用经过训练的模型,它将起作用:

print(f'Algo A score: {f1_score_Algo_A}, Algo B score: {f1_score_Algo_B}')

from mlxtend.evaluate import paired_ttest_5x2cv

t, p = paired_ttest_5x2cv(estimator1=algo_A, estimator2=algo_B, X=X, y=y)
alpha = 0.05

print('t statistic: %.3f' % t)
print('aplha ', alpha)
print('p value: %.3f' % p)

if p > alpha:
  print("Fail to reject null hypotesis")
else:
  print("Reject null hypotesis")

# Algo A score: 0.9736842105263158, Algo B score: 0.631578947368421
# t statistic: 8.000
# aplha  0.05
# p value: 0.000       
# Reject null hypotesis

请注意,在执行配对时不使用上面的计算(这里的分数是在保留的测试数据集上计算的,只是为了了解模型的性能),拆分的实际分数是在完成时使用评分函数计算的。F1 scorest-testsCVt-tests

评论

0赞 Haseeb Tariq 9/25/2023
它现在正在工作,但我的困惑仍然存在,我如何比较两个分类器的性能以检查哪个分类器是否表现良好?例如,我想对均值差异进行 t 检验,以评估哪种算法获得更高的 F1 分数。
0赞 Sandipan Dey 9/25/2023
根据文档,该函数使用 2 倍交叉验证,计算候选模型在训练测试拆分上的性能,进行 5 次迭代,并使用组合的 paored t 检验来计算一个分类器是否显着优于另一个分类器,具有一定的显着性。该函数还接受一个参数,您可以提供该参数以使用指标进行性能评估,而不是默认的指标(准确性)。scoring