如何使用keras预测并打印出ann模型的r2分数



我想比较两个模型的r2(r平方(值,以确定哪一个模型的预测精度更高。这两个模型分别是Ramdom Forest和ANN(使用keras(。我已经成功地获得了随机森林算法的值,但我似乎无法计算出这一点来预测和打印出我的ANN算法的正确值。我的数据集是针对石油生产工作的2421行13列。看看我到目前为止做了什么:

# Initialize the constructor
model = Sequential()
# Specifying input layer
model.add(Dense(2000, input_shape=(13,)))
# Add an first hidden layer 
model.add(Dense(1500, activation='relu'))
model.add(Dropout(0.2))
# second hidden layer
model.add(Dense(1000, activation='relu'))
# third hidden layer
model.add(Dense(500, activation='relu'))

# Add an output layer with one neuron and no activation specified
model.add(Dense(1))
from keras import backend as K
def r2_score(y_test, y_pred):
    SS_res =  K.sum(K.square( y_test-y_pred )) 
    SS_tot = K.sum(K.square( y_test - K.mean(y_test) ) ) 
    return ( 1 - SS_res/(SS_tot + K.epsilon()) )
model.compile(loss='mean_squared_error',
              optimizer='adam' , metrics = ['mae', 'mse', r2_score])
                   
epochs = 50
history = model.fit(X_train, y_train, epochs=epochs, batch_size=200, validation_split=0.3)
pred_train= model.predict(X_train)
print(K.get_value(r2_score(K.constant(y_train),pred_train)))
pred= model.predict(X_test)
print(K.get_value(r2_score(K.constant(y_test),pred)))

我收到的输出

-3170.0261
-1360.6658

我做错了什么?

您的实现看起来不错。R^2对于坏模型可能是负数。根据sckit文档:

最佳得分为1.0,可能为负(因为模型可能更差(。

请注意,您的定义与sklearn.metrics.r2_score中使用的定义几乎相同,除了epsilon(他们在文档和代码中都没有提到epsilon(,所以您只需删除它就可以使两者相等:

def r2_score(y_test, y_pred):
    SS_res =  K.sum(K.square( y_test-y_pred )) 
    SS_tot = K.sum(K.square( y_test - K.mean(y_test) ) ) 
    return ( 1 - SS_res/(SS_tot) )

现在,两种实现的输出应该是相同的:

from sklearn.metrics import r2_score as r2_score_sk
pred = model.predict(X_test)
# current result
print(K.get_value(r2_score(K.constant(y_test), pred)))
# expected one
print(r2_score_sk(y_test, pred)))

最新更新