【问题标题】:How to change a negative r2_score result from Keras code如何从 Keras 代码更改负 r2_score 结果
【发布时间】:2020-02-27 11:25:45
【问题描述】:

所以我正在尝试开发一个深度学习程序,它可以基于回归问题预测葡萄酒的质量。数据集来自https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/。我看过一些教程,但主要是基于https://www.datacamp.com/community/tutorials/deep-learning-python。

此代码是在 colab.research.google.com 上编写和运行的。它运行没有任何问题,但是 r2_score 是负数,我不完全理解为什么我们有时使用 X_test 和 X[test] 例如用于预测 r2_score 等。

import matplotlib.pyplot as plt
import h5py # export models in HDF5 format
from keras.datasets import mnist
from keras.utils import np_utils
from keras.layers import Activation, Dense, Dropout
from keras.models import Sequential
from keras import optimizers
from keras import losses
from keras import metrics 
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd

# Read in red wine data
# Read a comma-separated values (csv) file into DataFrame.
red = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv", sep=';')

X = red.drop('quality', axis=1) # Isolate data # Drop specified labels from rows or columns. # same as ix[:,0:11]
Y = red.quality

X = StandardScaler().fit_transform(X) # Scale the data with `StandardScaler
# StandardScaler transforms data such that its distribution will have a mean value 0 and standard deviation of 1. 
# Each value in the dataset will have the sample mean value subtracted, and then divided by the standard deviation of the whole dataset.

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)

seed = 7
np.random.seed(seed)

kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=seed)

NB_EPOCH = 20

# split up the data into K partitions / K-fold cross-validation
# Generate indices to split data into training and test set
for train, test in kfold.split(X, Y):
    model = Sequential() # Initialize the model
    model.add(Dense(64, input_dim=11, activation='relu')) # Add input layer 
    model.add(Dense(1)) # Add output layer 
    model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
    #model.compile(loss='categorical_crossentropy', optimizer=optimizers.SGD(), metrics=['accuracy'])
    history = model.fit(X[test], Y[test], validation_split=0.25, epochs=NB_EPOCH, verbose=1)

#history = model.fit(X_train, y_train, validation_split=0.25, epochs=20, verbose=1)

mse_value, mae_value = model.evaluate(X[test], Y[test], verbose=0)

print("Mean Squared Error: "+ str(mse_value)) # quantifies the difference between the estimator and what is estimated
print("Mean Absolute Error: " + str(mae_value)) #quantifies how close predictions are to the eventual outcomes

score = model.evaluate(X_test, y_test, verbose=1)

print("Test score:", score[0])
print('Test accuracy:', score[1])

# generating the graph through matplotlib
# Plot training & validation mea values
fig= plt.figure(figsize=(20,5))
plt.plot(history.history['mean_absolute_error'])
plt.plot(history.history['val_mean_absolute_error'])
plt.title('Model MAE')
plt.ylabel('MAE')
plt.xlabel('Epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()

from sklearn.metrics import r2_score
y_pred = model.predict(X[test])
print("this is r2:" + str(r2_score(Y[test], y_pred)))

print(test)
print(X[test])

【问题讨论】:

    标签: python machine-learning keras scikit-learn deep-learning


    【解决方案1】:

    拆分数据以进行训练和测试的原因非常简单,如果您使用所有数据来训练模型,那么您的模型会更好地处理您的数据(因为之前看过它)但是当您想了解它是如何工作时新数据不能很好地工作(不概括) 所以你应该把你的一部分数据放在一边,这样你就可以测试你的模型,看看它是否能很好地概括。当您想知道新集合的预测是什么以了解您的模型如何工作时,您可以使用 x[test]. 当你计算你的错误(r2)时,每个样本都是(y[test]-y_pred),所以它可能是负数或正数(你正在检查你预测的结果和你应该得到的结果之间的差异,所以是负数r2 表示您的预测值低于平均值)您也可以使用 mse 进行检查(对于回归问题更好) 像这样:

      MSE = np.square(np.subtract(Y_true,Y_pred)).mean()
    

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      相关资源
      最近更新 更多