在 Sklearn 中通过 1D 数组获得弃用警告,尽管没有 1D 数组



我正在尝试使用 SKLearn 来运行 SVM 模型。我现在只是用一些示例数据进行尝试。以下是数据和代码:

import numpy as np
from sklearn import svm
import random as random
A = np.array([[random.randint(0, 20) for i in range(2)] for i in range(10)])
lab = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
clf = svm.SVC(kernel='linear', C=1.0)
clf.fit(A, lab)

仅供参考,当我跑步时

import sklearn
sklearn.__version__

它输出 0.17。

现在,当我运行print(clf.predict([1, 1]))时,我收到以下警告:

C:UsersmeAppDataLocalContinuumAnaconda2libsite-packagessklearnut
ilsvalidation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecat
ed in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.re
shape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contain
s a single sample.
DeprecationWarning)

它确实给了我一个预测,这很棒。但是,出于几个原因,我觉得这很奇怪。

我没有一维数组。如果你打印 A,你会得到

array([[ 9, 12],
[ 2, 16],
[14, 14],
[ 4,  2],
[ 8,  4],
[12,  3],
[ 0,  0],
[ 3, 13],
[15, 17],
[15, 16]]) 

在我看来,这是二维的。但是好吧,让我们说我实际上是一个1D数组。让我们尝试使用reshape更改它,正如错误所建议的那样。

与上面的代码相同,但现在我们有

A = np.array([[random.randint(0, 20) for i in range(2)] for i in range(10)]).reshape(-1,1)

但是这会输出一个长度为 20 的数组,这毫无意义,也不是我想要的。我也用reshape(1, -1)尝试过,但这给了我一个包含 20 个项目的单一观察/列表。

如何在 numpy 数组中重塑数据,以免收到此警告?


我在SO上看了两个答案,但都不适合我。问题1和问题2。似乎Q1实际上是一维数据,并且是使用reshape求解的,我尝试过但失败了。Q2 有一个关于如何跟踪警告和错误的答案,这不是我想要的。另一个答案又是一维数组的实例。

错误来自预测方法。Numpy 会将 [1,1] 解释为 1D 数组。因此,这应该避免警告:

clf.predict(np.array([[1,1]]))

请注意:

In [14]: p1 = np.array([1,1])
In [15]: p1.shape
Out[15]: (2,)
In [16]: p2 = np.array([[1,1]])
In [17]: p2.shape
Out[17]: (1, 2)

另外,请注意,您不能使用形状数组 (2,1)

In [21]: p3 = np.array([[1],[1]])
In [22]: p3.shape
Out[22]: (2, 1)
In [23]: clf.predict(p3)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-23-e4070c037d78> in <module>()
----> 1 clf.predict(p3)
/home/juan/anaconda3/lib/python3.5/site-packages/sklearn/svm/base.py in predict(self, X)
566             Class labels for samples in X.
567         """
--> 568         y = super(BaseSVC, self).predict(X)
569         return self.classes_.take(np.asarray(y, dtype=np.intp))
570 
/home/juan/anaconda3/lib/python3.5/site-packages/sklearn/svm/base.py in predict(self, X)
303         y_pred : array, shape (n_samples,)
304         """
--> 305         X = self._validate_for_predict(X)
306         predict = self._sparse_predict if self._sparse else self._dense_predict
307         return predict(X)
/home/juan/anaconda3/lib/python3.5/site-packages/sklearn/svm/base.py in _validate_for_predict(self, X)
472             raise ValueError("X.shape[1] = %d should be equal to %d, "
473                              "the number of features at training time" %
--> 474                              (n_features, self.shape_fit_[1]))
475         return X
476 
ValueError: X.shape[1] = 1 should be equal to 2, the number of features at training time

而不是运行

print(clf.predict([1, 1]))

print(clf.predict([[1,1]]) 

直观地预测样本可能是:

[1,9]

但是您可以将向量重塑为上一个答案。或者只执行以下操作:

[[1,9]]

将 numpy 导入为 NP 从 SKLEARN 导入 SVM 随机导入随机

A = np.array([[random.randint(0, 20) for i in range(2)] for i in range(10)]) 实验室 = [

0, 1, 0, 1, 0, 1, 0, 1, 0, 1]CLF = SVM。SVC(kernel='linear', C=1.0) clf.fit(A, lab)

打印 clf.predict([[1,9]])

相关内容

  • 没有找到相关文章

最新更新