Kerasで回帰タスク用の小さなニューラルネットを構築しています。scikit-learn RandomForestRegressor と同じ精度メトリックを使用したいと思います。
係数R ^ 2は(1-u/v)として定義されます。ここで、uは回帰二乗和((y_true-y_pred)** 2).sum()であり、vは残差二乗和((y_true- y_true.mean())** 2).sum()。
1.0までの値を表示するため、便利なメトリックです(分類のパーセント精度と同様)。 Kerasバックエンドの使用法は、必要な精度メトリックに対して正しいですか?
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)
これはエラーがなく、時間の経過とともにメトリックが1に向かって増加しているように見えますが、メトリックを正しく実装したことを確認します。 Kerasバックエンド関数は初めてです。
あなたはチェックすることができます この投稿 アウト。私は次のコードをテストしましたが、それはあなたの目的のために大丈夫です。
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()) )