LSTM 模型具有恒定的精度并且不会变化



正如你所看到的,我被我的lstm模型卡住了。我正试图预测每月的产量。当我运行模型来训练时,精度几乎是恒定的,它有一个最小的变化,比如:

0.34406
0.34407
0.34408

我尝试了激活、初始化和参数的不同组合,但acc没有增加。我不知道这里的问题是我的数据,我的模型,还是这个值是模型可以达到的最大acc。

这是代码(如果你注意到一些库没有使用,那是因为我在第一个版本中做了一些更改(

import numpy as np
import pandas as pd
from pandas.tseries.offsets import DateOffset
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler
from sklearn import preprocessing
import keras
%tensorflow_version 2.x
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import Dropout
from keras.optimizers import Adam
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline
from plotly.offline import iplot
import matplotlib.pyplot as plt
import chart_studio.plotly as py
import plotly.offline as pyoff
import plotly.graph_objs as go

df_ventas = pd.read_csv('/content/drive/My Drive/proyectoPanimex/DEOPE.csv', parse_dates=['Data Emissão'], index_col=0, squeeze=True)
#df_ventas = df_ventas.resample('M').sum().reset_index()
df_ventas = df_ventas.drop(columns= ['weekday', 'month'], axis=1)
df_ventas = df_ventas.reset_index()
df_ventas = df_ventas.rename(columns= {'Data Emissão':'Fecha','Un':'Cantidad'})
df_ventas['dia'] = [x.day for x in df_ventas.Fecha]
df_ventas['mes']=[x.month for x in df_ventas.Fecha]
df_ventas['anio']=[x.year for x in df_ventas.Fecha]
df_ventas = df_ventas[:-48]
df_ventas = df_ventas.drop(columns='Fecha')
df_diff = df_ventas.copy()
df_diff['cantidad_anterior'] = df_diff['Cantidad'].shift(1)
df_diff = df_diff.dropna()
df_diff['diferencia'] = (df_diff['Cantidad'] - df_diff['cantidad_anterior'])
df_supervised = df_diff.drop(['cantidad_anterior'],axis=1)
#adding lags
for inc in range(1,31):
nombre_columna = 'retraso_' + str(inc)
df_supervised[nombre_columna] = df_supervised['diferencia'].shift(inc)
df_supervised = df_supervised.dropna()
df_supervisedNumpy = df_supervised.to_numpy()
train = df_supervisedNumpy
scaler = MinMaxScaler(feature_range=(0, 1))
X_train = scaler.fit(train)
train = train.reshape(train.shape[0], train.shape[1])
train_scaled = scaler.transform(train)
X_train, y_train = train_scaled[:, 1:], train_scaled[:, 0:1]
X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
#LSTM MODEL
model = Sequential()
act = 'tanh'
actF = 'relu'
model.add(LSTM(200, activation = act, input_dim=34, return_sequences=True ))
model.add(Dropout(0.15))
#model.add(Flatten())
model.add(LSTM(200, activation= act))
model.add(Dropout(0.2))
#model.add(Flatten())
model.add(Dense(200, activation= act))
model.add(Dropout(0.3))
model.add(Dense(1, activation= actF))
optimizer = keras.optimizers.Adam(lr=0.00001)
model.compile(optimizer=optimizer, loss=keras.losses.binary_crossentropy, metrics=['accuracy'])
history = model.fit(X_train, y_train, batch_size = 100, 
epochs = 50, verbose = 1)
hist = pd.DataFrame(history.history)
hist['Epoch'] = history.epoch
hist

历史图:

loss        acc         Epoch
0   0.847146    0.344070    0
1   0.769400    0.344070    1
2   0.703548    0.344070    2
3   0.698137    0.344070    3
4   0.653952    0.344070    4

正如你所看到的,唯一改变其损失的值,但Acc发生了什么?。我从机器学习开始,我没有更多的知识可以看到我的错误。谢谢

  • Dense(1, activation='softmax')始终冻结,不会学到任何东西
  • Dense(1, activation='relu')很可能会冻结并且不会学到任何东西
  • Dense(1, activation='sigmoid')对于分类(二进制(问题是理想的,并且对于值在0和1之间的回归有点好
  • Dense(1, activation='tanh')对于值在-1和1之间的回归有一定的好处
  • Dense(1, activation='softplus')对于值在0和+无穷大之间的回归有点好
  • Dense(1, actiavation='linear')通常适用于无限制的回归(但强烈建议在此之前对数据进行归一化(

对于回归,您不能使用准确性,但指标'mae''mse'不提供"相对"差异,它们提供"绝对"平均差异,一个是线性的,另一个是平方的。

对于连续预测,输出激活应为linear,对于分类,应为softmax。还要将你的学习率乘以100。您的损失应该是mean_absolute_error。你也可以很容易地将你的lstm神经元除以10倍。CCD_ 13应当被CCD_。

对于你的准确性问题,使用准确性是没有意义的,因为你并没有试图进行分类。对于度量,可以使用mae。你试图在一个连续的尺度上知道预测距离实际目标有多远。准确性适用于类别,而不是连续数据。

最新更新