web-dev-qa-db-fra.com

Coefficient de détermination KerasRegressor R ^ 2 Score

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.

9
Nick

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()) )
13
Mingfei Sun