我正在 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,但我想确保我正确实施了指标。
您可以查看这篇文章。我测试了以下代码,它可以满足您的目的。
from keras import backend as K
def coeff_determination(y_true, y_pred):
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()) )
R2Score
对象附带了tensorflow。要使用它,您可以简单地实例化它并将其作为指标传递:
model.compile(
loss='mse', optimizer='rmsprop',
metrics=[tf.keras.metrics.R2Score()]
)
已弃用的答案:
Tensorflow 有 add-ons 作为一个名为“tensorflow-addons”的单独模块,您可以使用
pip install tensorflow_addons
安装它。它包括一些常见指标,例如 R2 分数。要使用 R2-score 作为评估指标,您只需导入它、实例化它并将其作为指标传递即可:
from tensorflow_addons.metrics import RSquare
model.compile(loss='mse', optimizer='rmsprop', metrics=[RSquare()])
另一种选择是直接使用
sklearn.metrics.r2_score
。但是,由于 keras 使用张量而 scikit-learn 使用 numpy 数组,因此您必须设置 run_eagerly=True
以避免 NotImplementedError。必须注意的是,这会大大减慢代码速度,因此除非您有一个小神经网络,否则最好使用其他选项。
from sklearn.metrics import r2_score
model.compile(loss='mse', optimizer='rmsprop', metrics=[r2_score], run_eagerly=True)