Я хочу настроить свою нейронную сеть keras с помощью GridSearchCV в отношении показателя f1, поскольку у меня высокий дисбаланс в наборе данных.Это проблема двоичной классификации.Вот что я пробовал
def f1(y_true, y_pred):
y_pred = K.round(y_pred)
tp = K.sum(K.cast(y_true*y_pred, 'float'), axis=0)
# tn = K.sum(K.cast((1-y_true)*(1-y_pred), 'float'), axis=0)
fp = K.sum(K.cast((1-y_true)*y_pred, 'float'), axis=0)
fn = K.sum(K.cast(y_true*(1-y_pred), 'float'), axis=0)
p = tp / (tp + fp + K.epsilon())
r = tp / (tp + fn + K.epsilon())
f1 = 2*p*r / (p+r+K.epsilon())
f1 = tf.where(tf.is_nan(f1), tf.zeros_like(f1), f1)
return K.mean(f1)
def create_model():
model = Sequential()
model.add(Dense(899, activation = 'relu', input_dim = 899))
model.add(Dense(100, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(optimizer= 'adamax', loss = 'binary_crossentropy', metrics = [f1])
return model
param_grid = dict(batch_size = batch_size, epochs = epochs,class_weight = class_weight)
grid = GridSearchCV(estimator = model, param_grid = param_grid, n_jobs =7, cv = 2, scoring = f1 )
Но я получаю сообщение об ошибке
**
score = scorer(estimator, X_test, y_test)
TypeError: f1() takes 2 positional arguments but 3 were given
"""
**
, так что, похоже, мне тоже нужно создать счетчика?Как можно продолжать делать это правильно?
ОБНОВЛЕНИЕ:
Кажется, это решает проблему, я думаю, что это работает как задумано
from sklearn.metrics import f1_score
from sklearn.metrics import make_scorer
f1_scorer = make_scorer(f1_score)
, которую я затем передаю функции GridsearchCV
grid = GridSearchCV(estimator = model, param_grid = param_grid, n_jobs =7, cv = 2, scoring = f1_scorer )