使用scikit-learn在分类问题中如何为F1分数使用GridSearchCV?

时间:2019-05-10 20:41:30

标签: python machine-learning neural-network multilabel-classification hyperparameters

我正在使用scikit-learn中的神经网络处理多分类问题,并且试图弄清楚如何优化我的超参数(最终会增加层,感知器,其他东西的数量)。

我发现GridSearchCV是做到这一点的方法,但是我实际上要在F1分数上进行测试时,我使用的代码返回了平均精度。有谁知道如何编辑此代码以使其适用于F1分数?

在开始评估精度/准确度时,我认为仅凭混淆矩阵并从中得出结论是“足够的”,同时通过反复试验来改变层和感知器的数量在我的神经网络中一次又一次。

今天我发现还有更多:GridSearchCV。我只需要弄清楚如何评估F1分数,因为我需要进行研究以从神经网络的层,节点以及最终其他选择的角度来确定准确性。

mlp = MLPClassifier(max_iter=600)
clf = GridSearchCV(mlp, parameter_space, n_jobs= -1, cv = 3)
clf.fit(X_train, y_train.values.ravel())

parameter_space = {
    'hidden_layer_sizes': [(1), (2), (3)],
}

print('Best parameters found:\n', clf.best_params_)

means = clf.cv_results_['mean_test_score']
stds = clf.cv_results_['std_test_score']
for mean, std, params in zip(means, stds, clf.cv_results_['params']):
    print("%0.3f (+/-%0.03f) for %r" % (mean, std * 2, params))

输出:

Best parameters found:
 {'hidden_layer_sizes': 3}
0.842 (+/-0.089) for {'hidden_layer_sizes': 1}
0.882 (+/-0.031) for {'hidden_layer_sizes': 2}
0.922 (+/-0.059) for {'hidden_layer_sizes': 3}

因此,这里的输出为我提供了平均准确度(我发现这是GridSearchCV的默认准确度)。如何更改此值以返回平均F1分数而不是准确性?

1 个答案:

答案 0 :(得分:1)

您可以使用make_scorer创建自己的指标函数。在这种情况下,您可以使用sklearn的f1_score,但是如果您愿意,也可以使用自己的:

from sklearn.metrics import f1_score, make_scorer

f1 = make_scorer(f1_score , average='macro')


一旦您创建了计分器,就可以将其作为scoring参数直接插入到网格创建中:

clf = GridSearchCV(mlp, parameter_space, n_jobs= -1, cv = 3, scoring=f1)


另一方面,我将average='macro'用作f1多类参数。这将计算每个标签的指标,然后找到其未加权平均值。但是,还有其他选项可以计算带有多个标签的f1。您可以找到它们here


注意:答案已完全编辑,以更好地理解