使用比特币数据的 Keras RNN 模型没有准确性

数据挖掘 Python 喀拉斯 scikit-学习 rnn 机器学习模型
2022-03-03 03:05:04

我对机器学习非常陌生,并且制作了一个没有准确性的 RNN-LSTM 模型。我的数据已使用 Sklearn 的 MinMaxScaler 进行了标准化,形状为 ,输入为 (3, 2)...

我的标准化步骤:

def get_data(currency):
    url=f'https://coinmarketcap.com/currencies/{currency}/historical-data/?start=20130428&end={time.strftime("%Y%m%d")}'
    data=pd.read_html(url, flavor='html5lib')[0]

    data=data.assign(Date=pd.to_datetime(data['Date']))
    data['Volume']=(pd.to_numeric(data['Volume'], errors='coerce').fillna(0))


    data.columns=[col.lower() for col in data.columns]
    data.columns=[col.strip('*') for col in data.columns]

    return data

df=get_data('bitcoin')
df=df.sort_values(by='date')


def split_data (data, trainsize): 
    return np.array(data[:int(trainsize*len(data))]), np.array(data[int(trainsize*len(data)):])

scaler=MinMaxScaler(feature_range=(0,1))

def create_inputs(data, window):
    inputs=[]
    for i in range(len(data)-window):
        inputs.append(data[i:(i + window)].values)


    close,volume=[],[]
    for x in range(len(inputs)):
        close.append(inputs[x][:,0])
        volume.append(inputs[x][:,1])

    close=np.array(close)
    close=scaler.fit_transform(close)

    volume=np.array(volume)
    volume=scaler.fit_transform(volume)

    inputs=[]
    for i in range(len(close)):
        rows=[]
        for x in range(len(close[i])):
            row=[close[i][x], volume[i][x]]
            rows.append(row)
        inputs.append([rows])
    inputs=np.vstack(inputs)
    return inputs

def create_outputs(data, window):
    return scaler.fit_transform(data['close'][window:].values.reshape(-1,1))


# VARIABLES
df=df.filter(['date', 'close', 'volume'], axis=1)
df=df.sort_values(by='date')
df[df.columns] = df[df.columns].apply(pd.to_numeric, errors='coerce')

train,test=split_data(df,0.8)

train=pd.DataFrame(train, columns=df.columns)
test=pd.DataFrame(test, columns=df.columns)
train=train.drop('date',1)
test=test.drop('date',1)

xtrain,ytrain=create_inputs(train, 3), create_outputs(train, 3)
xtest,ytest=create_inputs(test, 3), create_outputs(test, 3)

这是我在扩展后从CoinMarketCap 的比特币历史中获取的部分训练数据 (1607, 3, 2) :

    [[[0.01363717 0.        ]
      [0.01577874 0.        ]
      [0.01463021 0.        ]]

     [[0.01577874 0.        ]
      [0.01463021 0.        ]
      [0.01006721 0.        ]]

     [[0.01463021 0.        ]
      [0.01006721 0.        ]
      [0.00762504 0.        ]]...]

我的模型有 3 层,有 1024 个 LSTM 细胞,密集层有 1 个神经元:

model = keras.models.Sequential()

model.add(keras.layers.CuDNNLSTM(1024, input_shape=(3,2), return_sequences=True, name='input'))
model.add(keras.layers.Dropout(0.2))

model.add(keras.layers.CuDNNLSTM(1024, return_sequences=True, name='lstm1'))
model.add(keras.layers.Dropout(0.2))

model.add(keras.layers.CuDNNLSTM(1024, name='lstm2'))
model.add(keras.layers.Dropout(0.2))

model.add(keras.layers.Dense(1, activation='tanh', name='output'))


# Compile model
model.compile(
    loss='mse',
    optimizer='adam',
    metrics=['accuracy'],
)

history=model.fit(xtrain, ytrain, batch_size=64, epochs=1000, validation_data=(xtest, ytest), verbose=1)
1个回答

请记住,准确性是一种分类度量。也就是说,它用于评估试图预测几个离散值之一的成员资格的模型。在这种情况下,没有准确性意味着您没有准确地预测和评估 - 这是回归问题中很常见的情况 - 即衡量现象规模或发生“多少”事情的问题。

评估回归模型的更好指标可能是 MSE,例如用于您的函数。

尝试:

    # Compile model
model.compile(
    loss='mse',
    optimizer='adam',
    metrics=['mse'],
)