Как сделать GridSearchCV для F1-балла в классификационной задаче с scikit-learn? - PullRequest
2 голосов
/ 10 мая 2019

Я работаю над проблемой множественной классификации с нейронной сетью в 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 Ответ

1 голос
/ 11 мая 2019

Вы можете создать свою собственную метрическую функцию с помощью make_scorer. В этом случае вы можете использовать f1_score от sklearn, но вы можете использовать свой собственный, если вы предпочитаете:

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 с несколькими метками. Вы можете найти их здесь


Примечание : ответ полностью отредактирован для лучшего понимания

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...