Python 人工神经网络回归精度与损失分析

Python 人工神经网络回归精度与损失分析,python,tensorflow,neural-network,regression,Python,Tensorflow,Neural Network,Regression,我有一个预测太阳能发电的数据集,数据集有20个独立的var和1个独立的var。我的模型的准确率停留在60%。我试过几种型号,但这种精度是最好的,我可以得到其他更糟糕的。 这是我的密码: data_path = r'drive/My Drive/Proj/S.P.F./solarpowergeneration.csv' dts = pd.read_csv('solarpowergeneration.csv') dts.head() X = dts.iloc[:, :-1].values y = d

我有一个预测太阳能发电的数据集,数据集有20个独立的var和1个独立的var。我的模型的准确率停留在60%。我试过几种型号,但这种精度是最好的,我可以得到其他更糟糕的。 这是我的密码:

data_path = r'drive/My Drive/Proj/S.P.F./solarpowergeneration.csv'
dts = pd.read_csv('solarpowergeneration.csv')
dts.head()
X = dts.iloc[:, :-1].values
y = dts.iloc[:, -1].values
print(X.shape, y.shape)
y = np.reshape(y, (-1,1))
y.shape
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
from sklearn.preprocessing import StandardScaler
sc= StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
y_train = sc.fit_transform(y_train)
y_test = sc.transform(y_test)

import keras.backend as K  
def calc_accu(y_true, y_pred):
  return K.mean(K.equal(K.round(y_true), K.round(y_pred)))

def get_spfnet():
  ann = tf.keras.models.Sequential()

  ann.add(Dense(X_train.shape[1], activation='relu'))
# ann.add(BatchNormalization())
  ann.add(Dropout(0.3))
  ann.add(Dense(32, activation='relu', kernel_regularizer=regularizers.l2(0.01)))
 # ann.add(BatchNormalization())
  ann.add(Dropout(0.3))
  ann.add(Dense(32, activation='relu', kernel_regularizer=regularizers.l2(0.01)))
 # ann.add(BatchNormalization())
  ann.add(Dropout(0.3))

  ann.add(Dense(1))
  ann.compile(loss='mse',
              optimizer='adam',
              metrics=[tf.keras.metrics.RootMeanSquaredError(), calc_accu])
  return ann

spfnet = get_spfnet()
#spfnet.summary()
hist = spfnet.fit(X_train, y_train, batch_size=32, epochs=250, verbose=2)
精度和损失图如下所示

plt.plot(hist.history['calc_accu'])
plt.title('Model Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.show()
plt.plot(hist.history['root_mean_squared_error'])
plt.title('Model error')
plt.xlabel('Epochs')
plt.ylabel('error')
plt.show()

在50个时代之后,似乎没有任何改善,两条曲线似乎都没有过度拟合数据 我尝试了其他模型,比如使用

kernel_initlizers='normal' and 'he-normal'  
但它们表现不佳,仍停留在20%的水平

数据集:
最常见的原因是接近零的梯度。您可能被卡在局部极小值或鞍点。请尝试增加批大小()

我尝试将批大小增加到128和256,但得到了类似的结果,您的模型似乎不太合适。。您可能有一个太小的数据集来提取所有特征。你有多少个训练样本?大约2500个