[英]How do i fit my dataframe in a keras model?
我对机器学习绝对陌生(前天开始),我写了一个 python 脚本,希望能给我一个股票价格的预测(至少是一个估计)。 到目前为止,我已经收集了数据并记录了转换值,然后将这些值标准化并将它们转换为 dataframe。代码如下:
from scipy import stats
from sklearn import preprocessing
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
from keras.models import Sequential
import time
df = pd.read_csv('Companies\ADANIPORTS.NS\swing trading\ADANIPORTS.NS.csv')
# convert everything to logarithmic values first to apply central limit theorem. Read about it.
open_log = np.log(df['Open'])
high_log = np.log(df['High'])
low_log = np.log(df['Low'])
close_log = np.log(df['Close'])
df = pd.DataFrame({'Open': open_log,'High': high_log,'Low': low_log,'Close': close_log})
scaler = MinMaxScaler()
scaler.fit(df)
NewData = scaler.transform(df)
pd.set_option('display.max_rows', None)
newdf = pd.DataFrame(NewData,columns=['Open','High','Low','Close'])
newdf.to_csv('logout.csv', index=False)
#X_train, y_train, X_test, y_test = train_test_split(newdf, test_size=0.3, shuffle=False)
train, test = train_test_split(newdf, test_size=0.3, shuffle=False)
print(train)
model = Sequential()
input_layer = Dense(32, input_shape=(4,))
model.add(input_layer)
hidden_layer = Dense(64, activation='relu')
model.add(hidden_layer)
output_layer = Dense(4)
model.add(output_layer)
model.compile(loss='mse', optimizer='rmsprop', metrics = ['accuracy'])
model.fit(train,test,epochs=10, verbose=0)
model.fit(X_train, y_train, epochs=10, validation_split=0.05)
'''
model = Sequential()
model.add(LSTM(units = 50,input_dim = 4))
model.add(Dropout(0.2))
model.add(LSTM(100))
model.add(Dropout(0.2))
model.add(Dense(output_dim = 1))
model.add(Activation('relu'))
start = time.time()
model.compile(loss='mse', optimizer='rmsprop')
print('compile time', time.time()-start)
model.fit(X_train, y_train, batch_size=512, nb_epoch=1, validation_split=0.05)
predictions = lstm.predict_sequences_multiple(model,X_test,50,50)
lstm.plot_results_multile(predictions,y_test,50)
'''
但是每次我使用model.fit(train,test,epochs=10, verbose=0)
运行代码时,我都会收到一个错误
ValueError: Data cardinality is ambiguous:
x sizes: 1875
y sizes: 804
Please provide data which shares the same first dimension.
如果我运行model.fit(X_train, y_train, epoch=10, validation_split=0.05)
我得到一个错误
X_train, y_train, X_test, y_test = train_test_split(newdf, test_size=0.3, shuffle=False)
ValueError: not enough values to unpack (expected 4, got 2)
关于这两个错误,stackoverflow 上似乎都有答案,但由于我对 ML 的了解有限,我似乎无法让它们对我起作用。 所以我的问题是如何将预处理后的数据放入 model?
dataframe 看起来像
Open High Low Close
0 0.019199 0.013422 0.037204 0.021447
1 0.025233 0.039041 0.044162 0.045250
2 0.048863 0.070543 0.052112 0.079218
3 0.082475 0.077543 0.088086 0.070864
4 0.070315 0.068797 0.085953 0.070041
5 0.077322 0.098920 0.091625 0.093531
6 0.099061 0.106808 0.112896 0.103979
7 0.091415 0.120864 0.000000 0.130006
8 0.137847 0.129369 0.135259 0.118405
and on and on until row 2678. Fairly straight forward I suppose
帮我。 谢谢。
第一部分 -
model.fit(train,test,epochs=10, verbose=0)
根本没有任何意义。 Model.fit 方法需要每个样本(x 数据中的行)和相应的标签(y 数据中的元素)进行训练。 如果行数是 100,那么您需要为 model 训练提供的标签数也是 100。通过“测试”没有任何意义,因为保留该数据只是为了验证您的 model 的泛化能力。
第二 -
我不知道你的 y 变量是什么。 您必须使用 train_test_split 创建一个单独的 y 变量。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, shuffle=False)
这是您必须使用 train_test_split 的语法。 您的X
是一个包含自变量的二维矩阵,您的y
是一个一维数组(特定于您的问题)。
一旦你这样做了,只有你的 model 才能正确地连接到 function。
最后 -
您的 model 架构似乎有 4 个维度的输入和 output 的 4 个维度。 您是否要预测 4 个数值? 如果没有,您的 output 应该有一个Dense(1)
我真的会鼓励您不要玩弄这样的代码,而是先花一些时间阅读一些 keras 教程,否则您最终会养成一些不良的编码习惯。
train_test_split
function 仅返回 2 个值,而不是您使用的 4 个。 您可以像下面这样使用它
train, test = train_test_split(newdf, test_size=0.3, shuffle=False)
或者您还应该将标签作为参数提供给train_test_split
脚本。 在那部分,我不确定你的 label 列是哪一列。
X_train, y_train, X_test, y_test = train_test_split(newdf, labels, test_size=0.3, shuffle=False)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.