scipy 如何计算平均值差异的t检验,以评估哪种算法获得更高的F1分数?

7gcisfzg  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(97)

我正在做一个项目,我的预期结果是哪个分类器在F1得分的基础上表现得很好。我正在对平均值的差异进行t检验,以评估哪种算法获得更高的F1分数。
我有两个分类器alog_A: 0.589744algo_B: 0.641026的F1分数
以下是我用来满足我的项目要求的代码,但从这段代码中,我得到的任何结果都显示为NaN。如何解决此问题?

from scipy import stats
t_value,p_value=stats.ttest_ind(f1_score_Algo_A,f1_score_Algo_B)
print('Test statistic is %f'%float("{:.6f}".format(t_value)))
print('p-value for two tailed test is %f'%p_value)

我得到以下输出

Test statistic is nan
p-value for two tailed test is nan

我的预期结果是哪个算法在t-test差值和p_value上表现良好。

vsmadaxz

vsmadaxz1#

请注意,在这种情况下,f1_scores_Algo_Af1_scores_Algo_B都是列表,可以被视为两个独立的分数样本:

from sklearn.metrics import f1_score
from scipy import stats

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

algo_A = LogisticRegression(random_state=1, max_iter=1000)  # try your algos / models
algo_B = DecisionTreeClassifier(random_state=1, max_depth=3)

X, y = iris_data() # try your dataset

f1_scores_Algo_A, f1_scores_Algo_B = [], []

for i in range(100):
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)

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

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

下一个图显示了使用模型的不同训练-检验拆分获得的F1分数的分布。

现在,我们可以做成对的t-test

t_value,p_value=stats.ttest_ind(f1_scores_Algo_A, f1_scores_Algo_B)
print('Test statistic is %f'%float("{:.6f}".format(t_value)))
# Test statistic is 2.457321
print('p-value for two tailed test is %f'%p_value)
# p-value for two tailed test is 0.014858

因此,我们可以在5%的显著性水平下拒绝零假设(2个独立样本具有相同的平均得分)。

相关问题