tensorflow ValueError:找到具有0个样本的数组(形状=(0,1),而MinMaxScaler要求最小值为1

eqfvzcg8  于 2022-11-16  发布在  其他
关注(0)|答案(8)|浏览(185)

我是ML的初学者。我正在帮助我的数学专业的朋友基于他提供的.csv文件使用TensorFlow创建一个股票预测器。
我有几个问题。第一个是他的.csv文件。该文件只有日期和结束值,它们没有分开,因此我不得不手动分开日期和值。我已经设法做到了这一点,现在我在使用MinMaxScaler时遇到了问题()。我被告知我几乎可以忽略日期,只测试收盘值,将其归一化,并根据它们进行预测。
我不断收到此错误:

ValueError: Found array with 0 sample(s) (shape=(0, 1)) while a
minimum of 1 is required by MinMaxScaler()

老实说,我从来没有使用过SKLearn或TensorFlow,这是我第一次做这样的项目。我看到的所有关于这个主题的指南都使用了panda,但在我的例子中,.csv文件是一个烂摊子,我不相信我可以使用panda。
我正在关注this DataCamp tutorial
但不幸的是,由于我缺乏经验,有些事情对我并不真正起作用,我希望能更清楚地说明我应该如何处理我的情况。
下面附上的是我的(杂乱的)代码:

import pandas as pd
import numpy as np
import tensorflow as tf
import sklearn
from sklearn.model_selection import KFold
from sklearn.preprocessing import scale
from sklearn.preprocessing import MinMaxScaler
import matplotlib
import matplotlib.pyplot as plt
from dateutil.parser import parse
from datetime import datetime, timedelta
from collections import deque

stock_data = []
stock_date = []
stock_value = []
f = open("s&p500closing.csv","r")
data = f.read()
rows = data.split("\n")
rows_noheader = rows[1:len(rows)]

#Separating values from messy `.csv`, putting each value to it's list and also a combined list of both
for row in rows_noheader:
    [date, value] = row[1:len(row)-1].split('\t')
    stock_date.append(date)
    stock_value.append((value))
    stock_data.append((date, value))

#Numpy array of all closing values converted to floats and normalized against the maximum
stock_value = np.array(stock_value, dtype=np.float32)
normvalue = [i/max(stock_value) for i in stock_value]

#Number of closing values and days. Since there is one closing value for each, they both match and there are 4528 of them (each)
nclose_and_days = 0
for i in range(len(stock_data)):
    nclose_and_days+=1

train_data = stock_value[:2264]
test_data = stock_value[2264:]

scaler = MinMaxScaler()

train_data = train_data.reshape(-1,1)
test_data = test_data.reshape(-1,1)

# Train the Scaler with training data and smooth data
smoothing_window_size = 1100
for di in range(0,4400,smoothing_window_size):
    #error occurs here
    scaler.fit(train_data[di:di+smoothing_window_size,:])
    train_data[di:di+smoothing_window_size,:] = scaler.transform(train_data[di:di+smoothing_window_size,:])

# You normalize the last bit of remaining data
scaler.fit(train_data[di+smoothing_window_size:,:])
train_data[di+smoothing_window_size:,:] = scaler.transform(train_data[di+smoothing_window_size:,:])

# Reshape both train and test data
train_data = train_data.reshape(-1)

# Normalize test data
test_data = scaler.transform(test_data).reshape(-1)

# Now perform exponential moving average smoothing
# So the data will have a smoother curve than the original ragged data
EMA = 0.0
gamma = 0.1
for ti in range(1100):
    EMA = gamma*train_data[ti] + (1-gamma)*EMA
    train_data[ti] = EMA

# Used for visualization and test purposes
all_mid_data = np.concatenate([train_data,test_data],axis=0)

window_size = 100
N = train_data.size
std_avg_predictions = []
std_avg_x = []
mse_errors = []

for pred_idx in range(window_size,N):
    std_avg_predictions.append(np.mean(train_data[pred_idx-window_size:pred_idx]))
    mse_errors.append((std_avg_predictions[-1]-train_data[pred_idx])**2)
    std_avg_x.append(date)

print('MSE error for standard averaging: %.5f'%(0.5*np.mean(mse_errors)))
col17t5w

col17t5w1#

我知道这篇文章是旧的,但当我在这里绊倒,其他人会..在运行相同的问题和谷歌相当多,我发现了一个职位https://github.com/llSourcell/Make_Money_with_Tensorflow_2.0/issues/7
所以如果你下载一个太小的数据集,它会抛出这个错误。下载1962年的.csv文件,它会足够大;).
现在,我只需要为我的数据集找到正确的参数..因为我正在将其调整为另一种类型的预测..希望它能有所帮助

z8dt9xmd

z8dt9xmd2#

train_data变量的长度为2264:

train_data = stock_value[:2264]

然后,当你去拟合定标器时,你在for循环的第三次迭代中超出了train_data的边界:

smoothing_window_size = 1100
for di in range(0, 4400, smoothing_window_size):

注意教程中数据集的大小。训练和测试块的长度都是11,000,而smoothing_window_size是2500,所以它永远不会超过train_data的边界。

kpbpu008

kpbpu0083#

您的数据中有一个全为0的列。如果您尝试缩放该列,MinMaxScaler将无法分配缩放比例,并且会出错。您需要在缩放数据之前筛选出空/0列。请尝试:

stock_value=stock_value[:,~np.all(np.isnan(d), axis=0)]

筛选出数据中的nan列

hyrbngr7

hyrbngr74#

我得道歉,因为你们一直在试图找出一个解决我的问题的办法,我最终找到了一个体面的指南,并采取了一个不那么复杂的方法(因为这是我第一次尝到人工智能和统计学的味道)有趣的是,我为此头疼了好几个月,直到去年11月我去佛罗里达参加一个会议,凌晨3点在酒店房间里不到两个小时就完成了。
下面是我当时编写的代码,最后作为一个工作示例提交给我的同事

import tensorflow as tf
from keras import backend as K

from tensorflow.python.saved_model import builder as saved_model_builder
from tensorflow.python.saved_model import tag_constants, signature_constants, signature_def_utils_impl

from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
import numpy as np

import matplotlib.pyplot as plt

stock_data = []
stock_date = []
stock_value = []
f = open("s&p500closing.csv","r")
data = f.read()
rows = data.split("\n")
rows_noheader = rows[1:len(rows)]

#Separating values from messy CSV, putting each value to it's list and also a combined list of both
for row in rows_noheader:
    [date, value] = row[1:len(row)-1].split('\t')
    stock_date.append(date)
    stock_value.append((value))
    stock_data.append((date, value))

#Making an array of arrays ready for use with TF,
#slicing array of data to smaller train data
#and normalizing the values against the max for training    
stock_value = np.array(stock_value, dtype=np.float32)
normvalue = [i/max(stock_value) for i in stock_value]
normvalue = np.array(normvalue)
train_data = [np.array(i) for i in normvalue[:500]]
train_data = np.array(train_data)
train_labels = train_data

#First plotting the actual values
plt.plot(normvalue)

#Creating TF session
sess = tf.Session()
K.set_session(sess)
K.set_learning_phase(0)

model_version = "2"
#Declaring the amount of epochs, the amount of periods the machine will learn
#(can play around with it) 
epoch = 20
#Building the model
####################
model = Sequential()
model.add(Dense(8, input_dim=1))
model.add(Activation('tanh'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
sgd = SGD(lr=0.1)

#Compiling and fitting our data to the model
model.compile(loss='binary_crossentropy', optimizer=sgd)
model.fit(train_data, train_labels, batch_size=1, nb_epoch=epoch)

#declaring varaibles for the models input and output to make sure they are all valid
x = model.input
y = model.output

prediction_signature = tf.saved_model.signature_def_utils.predict_signature_def({"inputs": x}, {"prediction":y})

valid_prediction_signature = tf.saved_model.signature_def_utils.is_valid_signature(prediction_signature)
if(valid_prediction_signature == False):
    raise ValueError("Error: Prediction signature not valid!")

#Here the actual prediction of the real values occurs
predictions = model.predict(normvalue)

#Plotting the prediction values
plt.xlabel("Blue: Actual            Orange: Prediction")    
plt.plot(predictions)

请随时进行修改,并在您认为合适的情况下进行试验。我要感谢大家花时间研究我的问题并提供各种解决方案,并期待着在未来了解更多:)

qacovj5a

qacovj5a5#

我第一次评论Stackoverflow,请如果你发现错误对我如何回答,或者如果你发现错误,请纠正我
所以对于以上的误差要使计算简单化,以及如何才能避免以上的数值误差。

mid_prices = (high_prices+low_prices)/2.0
print(len(mid_prices))#length 2024

train_data = mid_prices[:1012]
test_data = mid_prices[1012:]

scaler = MinMaxScaler()
train_data = train_data.reshape(-1,1)
test_data = test_data.reshape(-1,1)

smoothing_window_size = 200

for di in range (0,1000,smoothing_window_size):
    scaler.fit(train_data[di:di+smoothing_window_size,:])
    train_data[di:di+smoothing_window_size,:] = scaler.transform(train_data[di:di+smoothing_window_size,:])

上面的代码可以工作我的mid_prices变量的长度为2024,所以我的

train_data = mid_prices[:1012]
test_data = mid_prices[1012:]

被分成两个大小为1012的块
现在,如果您查看tutorial提供的代码
他的总大小是22000,他将它们分成两个11000的块用于测试和训练,然后对于定标器,他在for循环中使用从0到10000的范围和2500的平滑窗口大小,如果我错了,请纠正我,通过该10k集合进行5次迭代。
用作者用的这个逻辑我做了这个

smoothing_window_size = 200

    for di in range (0,1000,smoothing_window_size):
        scaler.fit(train_data[di:di+smoothing_window_size,:])
        train_data[di:di+smoothing_window_size,:] = scaler.transform(train_data[di:di+smoothing_window_size,:])

它与我的数据集和所提供的示例完美地结合在一起。
我希望这个答案足以解决这个问题

vq8itlhq

vq8itlhq6#

你的问题不是你的CSV或Pandas。你实际上可以直接把带有Pandas的CSV读到 Dataframe 中,这是我建议你做的。df = pd.read_csv(path)
同样的代码我也遇到了同样的问题。发生的是Scaler = MinMaxScaler,然后在范围部分中的for di,你正在拟合训练集中的数据,然后转换它,并重新分配给它自己。
问题是,它试图在训练集中找到更多的数据来适应定标器,结果数据用完了。这很奇怪,因为你所遵循的教程是这样呈现的。

5us2dqdw

5us2dqdw7#

我看到Window是1100,在for循环中,从0到4400,间隔为1100,余数为0,剩下0项需要规范化,所以

# You normalize the last bit of remaining data
scaler.fit(train_data[di+smoothing_window_size:,:])
train_data[di+smoothing_window_size:,:] = scaler.transform(train_data[di+smoothing_window_size:,:])

您不需要这些代码行,只需注解掉这些代码行即可。

dxpyg8gm

dxpyg8gm8#

我在为一个基于逻辑回归的文本分类软件包编写单元测试时遇到了同样的错误信息,我意识到这是由于试图将一个模型应用于一个空df。
在我的例子中,这是可能发生的,因为我的模型实际上是一个模型树,它反映了我的(巨大的)训练数据中的类别树,但只有少数子案例实际上发生在我的单元测试中的小测试df中。
长话短说:我认为错误的发生可能是因为

train_data[di:di+smoothing_window_size,:]

循环中的长度为0。

相关问题