提问人:Haseeb Tariq 提问时间:9/24/2023 最后编辑:Sandipan DeyHaseeb Tariq 更新时间:9/25/2023 访问量:45
如何使用配对 t 检验来评估使用 Python 的机器学习分类器的性能?
How to evaluate the performance of Machine Learning classifiers using Python by using Paired t-test?
问:
我是机器学习的初学者。我正在尝试对均值差异进行 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的基础上表现良好。
答:
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 scores
t-tests
CV
t-tests
评论
0赞
Haseeb Tariq
9/25/2023
它现在正在工作,但我的困惑仍然存在,我如何比较两个分类器的性能以检查哪个分类器是否表现良好?例如,我想对均值差异进行 t 检验,以评估哪种算法获得更高的 F1 分数。
0赞
Sandipan Dey
9/25/2023
根据文档,该函数使用 2 倍交叉验证,计算候选模型在训练测试拆分上的性能,进行 5 次迭代,并使用组合的 paored t 检验来计算一个分类器是否显着优于另一个分类器,具有一定的显着性。该函数还接受一个参数,您可以提供该参数以使用指标进行性能评估,而不是默认的指标(准确性)。scoring
评论