如何在 scikit-learn 的分类问题中为 F1 分数做 GridSearchCV?
Posted
技术标签:
【中文标题】如何在 scikit-learn 的分类问题中为 F1 分数做 GridSearchCV?【英文标题】:How to do GridSearchCV for F1-score in classification problem with scikit-learn? 【发布时间】:2019-09-28 18:37:02 【问题描述】:我正在使用 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】:您可以使用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
注意:答案已完全编辑,以便更好地理解
【讨论】:
它给了我这个输出:ValueError: Sample-based precision, recall, fscore is not meaningful outside multilabel classification. See the accuracy_score instead.
对不起,我没试过,我以为你可以直接这样插。我已经更新了我的答案。它现在应该可以工作了。以上是关于如何在 scikit-learn 的分类问题中为 F1 分数做 GridSearchCV?的主要内容,如果未能解决你的问题,请参考以下文章
scikit-learn 中为文本分类排列文本数据的标准方法是啥?
有没有办法在 Python 中为具有多个分类的随机森林制作部分依赖图(使用 scikit-learn)?
如何在 Scikit-Learn 的随机森林分类器中设置子样本大小?特别是对于不平衡的数据
如何获得 scikit-learn SVM 分类器的所有 alpha 值?