首页 文章

Keras Conv1D用于时间序列

提问于
浏览
0

我只是深度学习领域的新手 .

我用Keras Conv1D做了我的第一次基本尝试 . 不知道我做了什么以及我是否做得对 . 我的输入数据仅为每周(总共313周)的总销售额,适用于美国各地的商店,时间步长为1 .

这是我的代码:

from pandas import read_csv
import matplotlib.pyplot as plt
import numpy
from keras.datasets import imdb
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error

def create_dataset(dataset, look_back=1):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back):
        a = dataset[i:(i+look_back), 0]
        dataX.append(a)
        dataY.append(dataset[i + look_back, 0])
    return numpy.array(dataX), numpy.array(dataY)
seed = 7
numpy.random.seed(seed)
dataframe = read_csv('D:/MIS793/Dataset/Academic Dataset External 2/Python scripts/totalsale _byweek.csv', usecols=[1], engine='python')
plt.plot(dataframe)
plt.show()
dataset = dataframe.values
dataset = dataset.astype('float32')
# normalize the dataset
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]
# reshape into X=t and Y=t+1
look_back = 1
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
trainX = trainX.reshape(trainX.shape[0], trainX.shape[1], 1).astype('float32')
testX = testX.reshape(testX.shape[0], testX.shape[1], 1).astype('float32')
model = Sequential()
model.add(Conv1D(filters=10, kernel_size=1, padding='same', strides=1, activation='relu',input_shape=(1,1)))
model.add(MaxPooling1D(pool_size=1))
model.add(Flatten())
model.add(Dense(250, activation='relu'))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer='adam', metrics=['mae'])
print(model.summary())
model.fit(trainX, trainY, validation_data=(testX, testY), epochs=10, batch_size=100)
scores = model.evaluate(testX, testY, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

不确定这里的一些事情:

  • 重新训练trainX和testX .

  • kernel_size和input_shape的值

我的想法是它只是销售 Value 的一个向量 . 10个过滤器,每个大小为1,从一个值移动到另一个值 . 输入形状的格式为时间步长,尺寸 .

我只有10.91%的准确率!所以我的第一个问题是我是否正在喂食正确的参数 .

谢谢

ASC

2 回答

  • 0

    我尝试使用准确性而不是mae . 但是我的准确率为0% . 只是想知道这是关于预测数值,我真的应该使用准确度吗?这是我的最新代码 .

    from pandas import read_csv
    import matplotlib.pyplot as plt
    import numpy
    from keras.datasets import imdb
    from keras.models import Sequential
    from keras.layers import Dense
    from keras.layers import Flatten
    from keras.layers import Dropout
    from keras.layers.convolutional import Conv1D
    from keras.layers.convolutional import MaxPooling1D
    from keras.layers.embeddings import Embedding
    from keras.preprocessing import sequence
    from sklearn.preprocessing import MinMaxScaler
    from sklearn.metrics import mean_squared_error
    
    
    def create_dataset(dataset, look_back=1):
        dataX, dataY = [], []
        for i in range(len(dataset)-look_back):
            a = dataset[i:(i+look_back), 0]
            dataX.append(a)
            dataY.append(dataset[i + look_back, 0])
        return numpy.array(dataX), numpy.array(dataY)
    
    # fix random seed for reproducibility
    seed = 7
    numpy.random.seed(seed)
    
    dataframe = read_csv('D:/MIS793/Dataset/Academic Dataset External 2/Python scripts/totalsale _byweek.csv', usecols=[1], engine='python')
    plt.plot(dataframe)
    plt.show()
    
    dataset = dataframe.values
    dataset = dataset.astype('float32')
    # normalize the dataset
    scaler = MinMaxScaler(feature_range=(0, 1))
    dataset = scaler.fit_transform(dataset)
    train_size = int(len(dataset) * 0.67)
    test_size = len(dataset) - train_size
    train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]
    
    # reshape into X=t and Y=t+1
    look_back = 1
    trainX, trainY = create_dataset(train, look_back)
    testX, testY = create_dataset(test, look_back)
    
    trainX = trainX.reshape(trainX.shape[0], trainX.shape[1],1).astype('float32')
    testX = testX.reshape(testX.shape[0], testX.shape[1],1).astype('float32')
    
    model = Sequential()
    model.add(Conv1D(filters=20, kernel_size=1, padding='same', strides=1, activation='relu',input_shape=(1,1)))
    model.add(MaxPooling1D(pool_size=1))
    model.add(Conv1D(filters=10, kernel_size=1, padding='same', strides=1, activation='relu'))
    model.add(MaxPooling1D(pool_size=1))
    model.add(Flatten())
    model.add(Dense(4, activation='relu'))
    model.add(Dense(1, activation='linear'))
    model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
    print(model.summary())
    model.fit(trainX, trainY, validation_data=(testX, testY), epochs=10, batch_size=100)
    scores = model.evaluate(testX, testY, verbose=0)
    print("Accuracy: %.2f%%" % (scores[1]*100))
    

    或者我应该选择MAE吗?

    如果我选择MAE,我的分数将如下所示:

    [0.12740663779013364,0.31208728355111426]

    第一个是损失,第二个是MAE . 在这种情况下,这不是更好的指标吗?

    最后一行将是这样的:

    print(“MAE:% . 2f %%”%(得分[1]))

    谢谢Anindya

  • 0

    使用 model.metrics_names ,您可以获得 scores 变量的标签 .

    在你的情况下,它将是 ['loss', 'mean_absolute_error'] .

    所以你打印的不是 accuracy ,而是 mae 乘以100 .

相关问题