ValueError:找到了具有0个样本(形状=(0,1))的数组,而MinMaxScaler至少需要1个

时间:2018-11-21 22:58:29

标签: python tensorflow scikit-learn

这学期我开始学习ML。我们仅使用了Microsoft的Azure和亚马逊的AWS等API,但尚未深入了解这些服务的工作方式。我的好朋友是数学专业的大四学生,请我根据他提供给我的文件.csv帮助他使用TensorFlow创建一个股票预测变量。

我有一些问题。第一个是他的.csv文件。该文件只有日期和结束值,它们没有分开,因此我不得不手动分开日期和值。我已经做到了,现在我遇到了MinMaxScaler()的麻烦。有人告诉我,我几乎可以忽略日期,而只需测试收盘价,对其进行归一化并根据它们进行预测。 我不断收到此错误-ValueError: Found array with 0 sample(s) (shape=(0, 1)) while a minimum of 1 is required by MinMaxScaler()

老实说,我以前从未使用过SKLearning和TensorFlow,这是我第一次从事此类项目。我在该主题上看到的所有指南都使用了熊猫,但就我而言,.csv文件是一团糟,我不认为可以为此使用熊猫。

我正在遵循this指南:

但是不幸的是,由于我缺乏经验,有些事情对我而言并不是很有效,我希望我对如何处理自己的情况有更多的了解。

下面是我的(混乱)代码:

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)))

谢谢!

9 个答案:

答案 0 :(得分:1)

我知道这篇文章很旧,但是当我在这里偶然发现时,其他人会.. 在遇到相同的问题并仔细搜索了很多之后,我发现了一个帖子 https://github.com/llSourcell/Make_Money_with_Tensorflow_2.0/issues/7

因此,如果下载的数据集太小,它将抛出该错误。 从1962下载一个.csv文件,它将足够大;)。

现在,我只需要为我的数据集找到正确的参数即可。因为我正在将其调整为另一种类型的预测。 希望对您有帮助

答案 1 :(得分:0)

您的问题不是您的CSV或熊猫。实际上,您可以将带有熊猫的CSV直接读取到数据框中,这是我建议您执行的操作。 df = pd.read_csv(path)

我用相同的代码遇到相同的问题。 发生了什么是Scaler = MinMaxScaler,然后在范围内的for di部分中,您将数据拟合到训练集中,然后进行转换并将其重新分配回自身。

问题在于,它试图在您的训练集中查找更多数据以适合洁牙机及其数据用完。这很奇怪,因为您遵循的教程介绍它的方式。

答案 2 :(得分:0)

我看到您的窗口是1100,在您的for循环中,您以1100的间隔从0转到4400。剩下的则为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:,:])

您不需要这些代码行,只需注释掉它们即可。在那之后应该可以工作

答案 3 :(得分:0)

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的边界。

答案 4 :(得分:0)

您的数据中有一列全0的列。如果尝试缩放比例,则MinMaxScaler无法分配比例,它会跳闸。在缩放数据之前,您需要过滤出空/ 0列。试试:

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

过滤掉数据中的nan列

答案 5 :(得分:0)

在代码顶部,我写了%reset来处理stackoverflow,它清除了内存,我摆脱了“找到具有0功能的数组”的问题,

#fitting multiple linear regression to the training set
from sklearn.linear_model import LinearRegression
regressor =  LinearRegression()
regressor.fit(X_train,y_train) <------ earlier error occurred here

答案 6 :(得分:0)

我必须道歉,在整个过程中,你们一直在努力寻找解决我的问题的方法,最终我找到了一个体面的指南,并采用了一种不太复杂的方法(因为这是我第一次体验到AI和统计信息)。有趣的是,我为此花了几个月的时间,直到去年11月参加佛罗里达州的一次会议,并在不到3个小时的凌晨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)

请随意进行更改,并在自己认为合适的情况下进行尝试。 我要感谢大家花时间检查我的问题并提供各种解决方案,并希望将来能学到更多:)

答案 7 :(得分:0)

在基于逻辑回归为文本分类程序包编写单元测试时,我遇到了相同的错误消息,我意识到这是由于试图将模型应用于空df。

在我的情况下,可能会发生这种情况,因为我的模型实际上是一个模型树,该模型反映了我(巨大)训练数据中的类别树,但是这些子案例中只有一小部分实际上发生在单元测试的小测试df中

长话短说:我认为该错误可能是因为在某个时刻

train_data[di:di+smoothing_window_size,:]

最终在循环中的长度为0。

答案 8 :(得分:0)

我第一次在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 变量的 len 为 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,:])

它与我的数据集和提供的示例完美配合。

我希望这个答案足以解决这个问题