【问题标题】:Is array[:, 0:-1] = array[:][0:-1]?数组[:, 0:-1] = 数组[:][0:-1]?
【发布时间】:2019-12-03 12:21:27
【问题描述】:

我正在关注LSTM tutorial

为了将我的训练数据分为输入(x)和输出(y),我必须执行以下命令:

X, y = train[:, 0: -1], train[:, -1]

很遗憾,它不起作用,并在打印train[:, 0: -1]时产生以下错误:

> TypeError: '(slice(None, None, None), slice(0, -1, None))' is an invalid key

我尝试用以下命令替换此命令:

X, y = train[:][0: -1], train[:][-1]

但我很确定它不会给出相同的输出,因为它是不合逻辑的(在我的情况下),有多个输入和一个输出。

这是一个带有数据样本的最小可复制代码:

from pandas import DataFrame
from pandas import datetime
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
import numpy

O = [0.701733664614, 0.699495411782, 0.572129320819, 0.613315597684, 0.58079660603, 0.596638918579, 0.48453382119]
Ab = [datetime(2018, 12, 11, 14, 0), datetime(2018, 12, 21, 10, 0), datetime(2018, 12, 21, 14, 0), datetime(2019, 1, 1, 10, 0), datetime(2019, 1, 1, 14, 0), datetime(2019, 1, 11, 10, 0), datetime(2019, 1, 11, 14, 0)]

data = DataFrame(numpy.column_stack([O, Ab]),
                 columns=['ndvi', 'datetime'])

def fit_lstm(train, batch_size, nb_epoch, neurons):
    X, y = train[:, 0: -1], train[:, -1]
    X = X.values.reshape(X.shape[0], 1, X.shape[1])
    model = Sequential()
    model.add(LSTM(neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=True))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    for i in range(nb_epoch):
        model.fit(X, y, epochs=1, batch_size=batch_size, verbose=0, shuffle=False)
        model.reset_states()
    return model

train, test = data.values[0:-2], data.values[-2:]

print (train[:, 0:-1])

我想要的只是解决这个问题以适应 LSTM 模型:

lstm_model = fit_lstm(train, 1, 3000, 4)

也许,在这种情况下,我必须使用shift(),将最后一个时间步作为输入,将当前时间步作为输出? 像这样:

shift_steps = 1
train_targets = train.shift(-shift_steps)
X, y = train, train_targets

【问题讨论】:

  • 如果它是一个无效的键,这意味着你的数据是一个数据框,而不是一个 numpy (2D) 数组。
  • 如果你真的想要/需要一个 numpy 数组,请传递 fit_lstm 你的数据框实例 .values 属性:这就是 numpy 数组:fit_lstm(train.values, 1, 3000, 4)。但是,更好的是,尝试使用带有列名的实际数据帧索引(或使用例如.iloc):X, y = train['ndvi'], train['datetime'](在这里猜测哪些列)。
  • 请注意,教程某处显示此代码:X = series.values; train, test = X[0:-12], X[-12:]
  • 我已经把data.values设置为训练了,命令还是不行。
  • @00,也许我必须为训练集重塑数据。这是我在使用 data.values 并打印 train[:, 0:-1] 时遇到的错误:>print (train[:, 0: -1]) IndexError: too many indices for array

标签: python arrays dataframe


【解决方案1】:

我认为我发现了我的错误: 语法与我的数据集不兼容。

正如我在上次编辑问题时提到的,我使用了 shift 。它是这样工作的:


def fit_lstm(train, batch_size, nb_epoch, neurons):
    X, y = train, train_targets
    X = X.values.reshape(X.shape[0], 1, X.shape[1])
    model = Sequential()
    model.add(LSTM(neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=True))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    for i in range(nb_epoch):
        model.fit(X, y, epochs=1, batch_size=batch_size, verbose=0, shuffle=False)
        model.reset_states()
    return model

train, test = data.values[0:-2], data.values[-2:]
shift_steps = 1
train_targets = data.shift(-shift_steps).values[0:-2] 

||

||

/

print (train)
[0.70173366 0.69949541 0.57212932 0.6133156  0.58079661]
print (train_targets)
[0.69949541 0.57212932 0.6133156  0.58079661 0.59663892]

非常感谢 @00 和 @Sebas 的帮助 :)

【讨论】:

    【解决方案2】:

    您使用的是DataFrame,并且切片不同。

    假设“nvdi”列包含特征,而日期时间列包含每个训练数据的预期结果,您需要将它们称为:

    X = train['nvdi']
    y = train['datetime']
    

    我在数据中只看到两列。

    【讨论】:

    • 感谢您的回答,实际上,日期时间列不包含预期结果,而是包含“比例”。我的 NDVI 数据取决于时间。也许我必须使用 pandas.Series 而不是 DataFrame?
    • 也许我的数据,我只需要使用train = data.values[0:-2] 作为输入X。这似乎更合乎逻辑。问题将是输出 y。
    猜你喜欢
    • 1970-01-01
    • 2018-09-08
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多