【问题标题】:Getting deprecation warning in Sklearn over 1d array, despite not having a 1D array尽管没有一维数组,但在 Sklearn 中通过一维数组获得弃用警告
【发布时间】:2016-10-14 08:41:33
【问题描述】:

我正在尝试使用 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:\Users\me\AppData\Local\Continuum\Anaconda2\lib\site-packages\sklearn\ut
ils\validation.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]]) 

在我看来是二维的。但是好吧,让我们说我所拥有的实际上是一个一维数组。按照错误提示,让我们尝试使用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 的两个答案,但都没有为我工作。 Question 1Question 2。似乎 Q1 实际上是一维数据,并使用 reshape 解决,我尝试过但失败了。 Q2 有一个关于如何跟踪警告和错误的答案,这不是我想要的。另一个答案是一维数组的实例。

【问题讨论】:

    标签: python scikit-learn svm


    【解决方案1】:

    而不是运行

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

    运行

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

    【讨论】:

      【解决方案2】:

      直观的预测样本可以是:

      [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, 实验室)

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

      【讨论】:

        【解决方案3】:

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

        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
        

        【讨论】:

        • 当您的数组存储在变量中时,比如说var,您也可以这样做np.array([var])
        • 这会减慢预测速度吗?即 predict(var) 比 predict(np.array([var])) 快吗?
        • @user3494047 对于一个单一的观察,我无法想象它会产生明显的不同。如果您在具有许多特征的许多观察上运行此程序,即您 var 是像 100000, 5000 这样的形状,那么是的,np.ndarray 会更快。我的怀疑是 sklearn 将输入转换为 np.ndarrays antway
        猜你喜欢
        • 2017-07-08
        • 2017-02-09
        • 2018-12-28
        • 1970-01-01
        • 2013-06-09
        • 2019-08-17
        • 2017-01-16
        • 1970-01-01
        • 2021-09-19
        相关资源
        最近更新 更多