【问题标题】:Error in Python script "Expected 2D array, got 1D array instead:"?Python脚本中的错误“预期的二维数组,而不是一维数组:”?
【发布时间】:2018-01-15 04:17:29
【问题描述】:

我正在关注this tutorial 进行此机器学习预测:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style

style.use("ggplot")
from sklearn import svm

x = [1, 5, 1.5, 8, 1, 9]
y = [2, 8, 1.8, 8, 0.6, 11]

plt.scatter(x,y)
plt.show()

X = np.array([[1,2],
             [5,8],
             [1.5,1.8],
             [8,8],
             [1,0.6],
             [9,11]])

y = [0,1,0,1,0,1]
X.reshape(1, -1)

clf = svm.SVC(kernel='linear', C = 1.0)
clf.fit(X,y)

print(clf.predict([0.58,0.76]))

我正在使用 Python 3.6,但出现错误“预期的 2D 数组,得到 1D 数组:” 我认为该脚本是针对旧版本的,但我不知道如何将其转换为 3.6 版本。

已经尝试过:

X.reshape(1, -1)

【问题讨论】:

  • 哪一行产生了错误?
  • X = X.reshape(1, -1)。重塑未到位。
  • @stackoverflowuser2010:我猜最后一行clf.predict(<a-1d-thing>),因为X 已经是二维的(尽管reshape 没用)。
  • @MarkDickinson 是的,最后一行是。
  • @JonTargaryen 重塑在正确的位置,但您正在丢弃结果。将结果分配回X

标签: python python-3.x machine-learning predict


【解决方案1】:

你可以这样做:

np.array(x)[:, 无]

【讨论】:

    【解决方案2】:

    只需用两个方括号将您的 numpy 对象括起来,反之亦然。

    例如:

    如果最初是您的x = [8,9,12,7,5]

    将其更改为x = [ [8,9,12,7,5] ]

    这应该可以解决尺寸问题

    【讨论】:

      【解决方案3】:

      只需在双方括号之间插入参数:

      regressor.predict([[values]])
      

      对我有用

      【讨论】:

        【解决方案4】:

        您应该只为predict 方法提供相同的二维数组,但需要处理一个(或多个)值。简而言之,你可以替换

        [0.58,0.76]
        

        [[0.58,0.76]]
        

        它应该可以工作。

        编辑:这个答案变得很流行,所以我想我会添加更多关于 ML 的解释。简短的版本:我们只能在与训练数据(X)具有相同维度的数据上使用predict

        在有问题的示例中,我们在X 中为计算机提供了一堆行(每行有2 个值),并在y 中显示正确的响应。当我们想predict 使用新值时,我们的程序期望相同 - bunch 行。即使我们只想对一行(具有两个值)执行此操作,该行也必须是另一个数组的一部分。

        【讨论】:

        • 但是为什么会这样呢?我不明白问题是什么。
        • 如何为更大的数据帧实现这一点? (动态)
        • 为什么必须是二维数组?这背后的原因是什么?
        【解决方案5】:

        我之前也遇到过同样的问题,但我找到了解决方案, 你可以试试reg.predict([[3300]])

        以前允许标量值的 API,但现在您需要提供 2D 数组。

        【讨论】:

          【解决方案6】:

          我使用下面的方法。

          reg = linear_model.LinearRegression()
          reg.fit(df[['year']],df.income)
          
          reg.predict([[2136]])
          

          【讨论】:

            【解决方案7】:

            通过一个功能,我的 Dataframe 列表可以转换为 Series。我必须将其转换回 Dataframe 列表,并且它起作用了。

            if type(X) is Series:
                X = X.to_frame()
            

            【讨论】:

              【解决方案8】:

              我遇到了同样的问题。您只需将其设为数组,此外,您必须放置双方括号以使其成为二维数组的单个元素,因为第一个括号初始化数组,第二个使其成为该数组的元素。

              所以只需将最后一条语句替换为:

              print(clf.predict(np.array[[0.58,0.76]]))
              

              【讨论】:

                【解决方案9】:

                除了我想预测的实例的数据类型是panda.Series 对象之外,我遇到了同样的问题。

                好吧,我只需要预测一个输入实例。我是从我的数据片段中提取的。

                df = pd.DataFrame(list(BiogasPlant.objects.all()))
                test = df.iloc[-1:]       # sliced it here
                

                在这种情况下,您需要将其转换为一维数组,然后reshape 它。

                 test2d = test.values.reshape(1,-1)
                

                docsvalues 将 Series 转换为 numpy 数组。

                【讨论】:

                  【解决方案10】:

                  Int64 类型的自变量和因变量的 X 和 Y 矩阵分别转换为 DataFrame 以便从一维数组转换为二维数组.. 即 X=pd.DataFrame(X) 和 Y=pd.dataFrame(Y) 其中 pd 是 python 中的 pandas 类。因此特征缩放反过来不会导致任何错误!

                  【讨论】:

                    【解决方案11】:

                    当您对数组 [0.58,0.76] 运行预测时,就会出现问题。在调用 predict() 之前通过重塑它来解决问题:

                    import numpy as np
                    import matplotlib.pyplot as plt
                    from matplotlib import style
                    
                    style.use("ggplot")
                    from sklearn import svm
                    
                    x = [1, 5, 1.5, 8, 1, 9]
                    y = [2, 8, 1.8, 8, 0.6, 11]
                    
                    plt.scatter(x,y)
                    plt.show()
                    
                    X = np.array([[1,2],
                                 [5,8],
                                 [1.5,1.8],
                                 [8,8],
                                 [1,0.6],
                                 [9,11]])
                    
                    y = [0,1,0,1,0,1]
                    
                    clf = svm.SVC(kernel='linear', C = 1.0)
                    clf.fit(X,y)
                    
                    test = np.array([0.58, 0.76])
                    print test       # Produces: [ 0.58  0.76]
                    print test.shape # Produces: (2,) meaning 2 rows, 1 col
                    
                    test = test.reshape(1, -1)
                    print test       # Produces: [[ 0.58  0.76]]
                    print test.shape # Produces (1, 2) meaning 1 row, 2 cols
                    
                    print(clf.predict(test)) # Produces [0], as expected
                    

                    【讨论】:

                      猜你喜欢
                      • 2019-03-28
                      • 2022-01-22
                      • 2020-06-01
                      • 2023-03-07
                      • 2020-05-11
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-06-05
                      • 2019-08-17
                      相关资源
                      最近更新 更多