我想比较两个模型的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)))