Je construis un petit réseau neuronal dans Keras destiné à une tâche de régression, et je veux utiliser la même métrique de précision que le scikit-learn RandomForestRegressor :
Le coefficient R ^ 2 est défini comme (1 - u/v), où u est la somme de régression des carrés ((y_true - y_pred) ** 2) .sum () et v est la somme résiduelle des carrés ((y_true - y_true.mean ()) ** 2) .sum ().
C'est une mesure pratique car elle affiche des valeurs jusqu'à 1,0 (similaire au pourcentage de précision dans la classification). Mon utilisation du backend Keras est-elle correcte pour la métrique de précision que je souhaite?
def create_model():
model = Sequential()
model.add(Dense(10,
input_dim=X.shape[1],
activation="relu"))
model.add(Dense(10,
activation="relu"))
model.add(Dense(1))
# Compile model
model.compile(loss="mean_squared_error", optimizer="adam", metrics=[det_coeff])
return model
# Is this computing the right thing?
def det_coeff(y_true, y_pred):
u = K.sum(K.square(y_true - y_pred))
v = K.sum(K.square(y_true - K.mean(y_true)))
return K.ones_like(v) - (u / v)
Cela semble fonctionner en ce sens que rien ne fait d'erreur et que la métrique augmente vers 1 au fil du temps, mais je veux m'assurer que j'ai correctement mis en œuvre la métrique. Je suis nouveau dans les fonctions backend de Keras.
vous pouvez vérifier ce post out. J'ai testé le code suivant et cela fonctionne bien pour votre objectif.
from keras import backend as K
def coeff_determination(y_true, y_pred):
from keras import backend as K
SS_res = K.sum(K.square( y_true-y_pred ))
SS_tot = K.sum(K.square( y_true - K.mean(y_true) ) )
return ( 1 - SS_res/(SS_tot + K.epsilon()) )