数值错误:X有1个特征,但SVC需要3个特征作为输入。

3
我正在尝试使用Keras和sklearn创建股票价格预测器(不用于实际投资,不用担心),它从Kaggle获取任何时间序列并检查“Close”。然后,它采用特定长度的滚动时间窗口,并预测方向准确性,上升(1)或下降(0)。
在尝试运行以下代码时,出现了以下错误:
File "...", line 71, in test
    y_pred = self.model.predict(self.X_test)
ValueError: X has 1 features, but SVC is expecting 3 features as input.

有人能指导我可能存在的问题吗?SVC期望的特征是什么,我可能缺失了哪些?
代码:Model.py
create_features检查滚动时间窗口中市场是高还是低,并设置X和y:
#window_size = the set size of the rolling time window

def create_features(data, window_size):
    X = []
    y = []

    for i in range(0, len(data.index) - window_size):
        temp = [data.iloc[i + j]['Close'] for j in range(0, window_size)]
        avg = sum(temp) / len(temp)

        X.append(temp)
        y.append(0 if data.iloc[i + window_size]['Close'] < avg else 1)

    return X, y

class Model:
    def __init__(self, market: Market, training_percent: float, window_size: int):
        self.model = SVC(C=10, gamma='scale', kernel='rbf')

        X, y = create_features(market.data, window_size)
        self.X_train, self.y_train, self.X_test, self.y_test = train_test_split(X, y, shuffle=False, stratify=None, train_size=training_percent)

        self.X_train = np.array(self.X_train)
        self.y_train = np.array(self.y_test)

        #self.X_test = np.array(self.X_test).reshape(-1, 1)

    def train(self):
        self.model.fit(self.X_train, self.y_train)

    def test(self):
        y_pred = self.model.predict(self.X_test) #THE COMPLAINING LINE

        y_pred = [0 if i < 0.5 else 1 for i in y_pred]
        tn, fp, fn, tp = confusion_matrix(self.y_test, y_pred, labels=[0, 1]).ravel()
        print(tn, fp, fn, tp)
        print("Accuracy:", (tn + fp) / (tn + fp + fn + tp))

    def predict(self, input_array):
        return self.model.predict(input_array)

上述被称为:
model_test = Model(markets[m], training_testing[j], window_size[i])
model_test.train()
model_test.test()

任何关于这个问题的帮助将不胜感激。提前谢谢。

np.shape(X_test) 是什么? - user2246849
@user2246849 使用np.reshape()解决了另一个问题,即“ValueError: Expected 2D array, got 1D array instead”。在错误本身中建议添加“reshape”来解决问题:“如果您的数据具有单个特征,请使用array.reshape(-1,1)进行数据重塑;如果它包含单个样本,则使用array.reshape(1,-1)。” - Nightingale
抱歉,我是指X_test的形状,因此是我上面写的命令的输出。 - user2246849
@user2246849 不好意思,输出结果是“(1508, 1)” 。 - Nightingale
这是包括还是不包括 reshape(-1, 1)?你能用X_train做同样的操作吗,即 np.shape(X_train) - user2246849
@user2246849 如果没有 .reshape(-1, 1),它的形状是 (1508,)。而加上了 reshape 后,形状变成了 (1508, 1) - Nightingale
1个回答

3
问题在于你如何获取 train_test_split 的输出。 如文档中所述,您应该按顺序获取分裂数据集:
# Notice the order of the unpacking.
self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(X, y, shuffle=False, stratify=None, train_size=training_percent)

因此,测试数据集的形状不同,因为它实际上是训练标签。您也不需要使用.reshape
另外,不确定您是否想要执行此操作:
# Assigning y_test to y_train.
self.y_train = np.array(self.y_test)

1
谢谢,我之前是根据旧笔记而不是文档来接单,这是个大错误!至于第二点,那是我在删除无用的发布代码时犯的错误。 - Nightingale
谢谢!这个错位导致了我的作业出现了很多不必要的问题。 - razalghul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接