LSTM模型具有恒定的精度且不可变

2024-06-01 20:00:21 发布

您现在位置:Python中文网/ 问答频道 /正文

正如你所看到的,我被我的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发生了什么?。我从机器学习开始,我没有更多的知识可以看到我的错误。谢谢


Tags: from模型importadddfmodeltensorflowas
2条回答

您的输出激活应该是linear用于连续预测,或者softmax用于分类。同时将你的学习率乘以100。你的损失应该是mean_absolute_error。你也可以很容易地将你的lstm神经元除以10。tanh应替换为relu或类似内容

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

  • 一个Dense(1, activation='softmax')永远冻结,什么也学不到
  • 一个Dense(1, activation='relu')很可能会冻结,什么也学不到
  • ADense(1, activation='sigmoid')是分类(二进制)问题的理想选择,对于值介于0和1之间的回归有一定的好处
  • ADense(1, activation='tanh')对于值介于-1和1之间的回归有点好
  • ADense(1, activation='softplus')对于值介于0和+infinite之间的回归有点好
  • ADense(1, actiavation='linear')通常适用于无限制的回归(但强烈建议在此之前对数据进行标准化)

对于回归,您不能使用精度,但度量'mae''mse'不提供“相对”差异,它们提供“绝对”平均差异,一个是线性的,另一个是平方的

相关问题 更多 >