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

Jon*_*nas 6 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))

Run Code Online (Sandbox Code Playgroud)

输出:

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}
Run Code Online (Sandbox Code Playgroud)

所以在这里我的输出给了我平均准确度(我发现这是默认值GridSearchCV)。如何更改它以返回平均 F1 分数而不是准确性?

Har*_*boa 9

您可以使用make_scorer. 在这种情况下,您可以使用 sklearn's f1_score,但如果您愿意,也可以使用自己的:

from sklearn.metrics import f1_score, make_scorer

f1 = make_scorer(f1_score , average='macro')
Run Code Online (Sandbox Code Playgroud)


制作得分器后,您可以将其作为scoring参数直接插入网格创建中:

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

Run Code Online (Sandbox Code Playgroud)


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


注意:为了更好地理解,完全编辑了答案