我试图使用Scikit来训练2个特征,称为:x1和x2。这两个数组的形状都是(490,1)
。为了将一个X
参数传递给clf.fit(X,y)
,我使用np.concatenate
来生成一个数组形状(490,2)
。标签数组由1和0组成,形状为(490,)
。代码如下所示:
x1 = int_x # previously defined array shape (490,1)
x2 = int_x2 # previously defined array shape (490,1)
y=np.ravel(close) # where close is composed of 1's and 0's shape (490,1)
X,y = np.concatenate((x1[:-1],x2[:-1]),axis=1), y[:-1] #train on all datapoints except last
clf = SVC()
clf.fit(X,y)
显示如下错误:
X.shape[1] = 1 should be equal to 2, the number of features at training time
我不明白的是为什么这个消息出现,即使当我检查X的形状时,它确实是2而不是1。我最初只尝试了一个功能,clf.fit(X,y)
工作得很好,所以我倾向于认为np.concatenate
产生了一些不合适的东西。任何建议都很好。
没有int_x
、int_x2
、close
的具体数值很难说。事实上,如果我尝试int_x
, int_x2
和close
随机构造为
import numpy as np
from sklearn.svm import SVC
int_x = np.random.normal(size=(490,1))
int_x2 = np.random.normal(size=(490,1))
close = np.random.randint(2, size=(490,))
符合你的规范,那么你的代码工作。因此,错误可能在于构造int_x、int_x2和close的方式。
如果您认为问题不存在,您能否分享一个具有int_x
, int_x2
和close
具体值的最小可重复示例?
我想我知道我的代码出了什么问题。
首先,我应该创建另一个变量,比如x
,它定义了int_x
和int_x2
的连接,它的形状为:(490,2),与close
的形状相同。这在后来派上了用场。
其次,clf.fit(X,y)
本身并没有错。然而,我没有正确地制定我的预测代码。例如,我说:clf.predict([close[-1]])
,希望捕获二进制目标输出(0或1)。传递给该方法的参数是不正确的。它应该是clf.predict([x[-1]])
,因为算法预测特征位置的标签,而不是相反。由于变量x
现在与close
形状相同,那么clf.predict([x[-1]])
的结果应该产生close[-1]
的预测结果。