【问题标题】:How do i fit my dataframe in a keras model?我如何在 keras 模型中拟合我的数据框?
【发布时间】:2023-04-04 23:50:01
【问题描述】:

我是机器学习的新手(前天开始),我编写了一个 Python 脚本,希望能预测股价(至少是估计)。到目前为止,我已经收集了数据并记录了转换值,然后对这些值进行了规范化并将它们转换为数据帧。代码如下:

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 的了解有限,我似乎无法让它们发挥作用。所以我的问题是如何将预处理后的数据拟合到模型中?

数据框看起来像

          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

帮帮我。谢谢。

【问题讨论】:

    标签: python pandas tensorflow machine-learning keras


    【解决方案1】:

    第一部分-

    model.fit(train,test,epochs=10, verbose=0)
    

    根本没有任何意义。 Model.fit 方法需要每个样本(x 数据中的行)和相应的标签(y 数据中的元素)进行训练。如果行数是 100,那么您需要为模型训练提供的标签数也是 100。通过“测试”没有任何意义,因为保留这些数据只是为了验证您的模型的泛化程度。


    其次-

    我不知道你的 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 是一维数组(特定于您的问题)。

    一旦你这样做了,只有这样你的模型才能正常运行。


    最后——

    您的模型架构似乎有 4 维输入和 4 维输出。您是否要预测 4 个数值?如果没有,您的输出应该有一个 Dense(1)


    我真的鼓励你不要玩这样的代码,而是先花一些时间学习一些 keras 教程,否则你最终会养成一些不好的编码习惯。

    【讨论】:

    • 您好,感谢您这么快回复。是的,我现在将研究 keras 教程。但是关于你上面提到的答案,你说“你必须使用 train_test_split 创建一个单独的 y 变量。” X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, shuffle=False)。这是否意味着 y 变量是由 train_test_split 自动创建的?因为我刚刚尝试运行代码,我得到了NameError: name 'y' is not defined 并且 y 没有定义,所以我想这是有道理的。任何想法?也是的,我想预测开、高、低、关的 4 个输出值。
    • 那么根据上面的数据集我应该如何定义 y 呢?有什么想法吗?
    【解决方案2】:

    train_test_split 函数仅返回 2 个值,而不是您使用的 4 个值。你可以像下面这样使用它

    train, test = train_test_split(newdf, test_size=0.3, shuffle=False)
    

    或者您也应该将标签作为参数添加到train_test_split 脚本中。在那部分,我不确定哪一列是你的标签列。

    X_train, y_train, X_test, y_test = train_test_split(newdf, labels, test_size=0.3, shuffle=False)
    

    【讨论】:

    • 您好,感谢您这么快回复。那么根据上面的数据集,我应该如何定义标签呢?有什么想法吗?
    • 我认为你应该有一些股票价格的价值,你应该有这些
    猜你喜欢
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2021-04-01
    • 2017-05-11
    • 2020-05-12
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多