【问题标题】:Predicting numbers using sklearn digits dataset - error使用 sklearn 数字数据集预测数字 - 错误
【发布时间】:2023-04-04 07:20:01
【问题描述】:

我想建立一个简单的数字预测模型。

所以我:

  1. 加载到 sklearn 数据集中
  2. 使用 DecisionTreeClassifier()
  3. 适合数据
  4. 预测新图像
import matplotlib.pyplot as plt 
from sklearn import datasets 
from sklearn import tree
digits = datasets.load_digits() 
clf = tree.DecisionTreeClassifier()
clf = clf.fit(digits.data, digits.target) 
clf.predict(digits.data[-1])

我做错了什么?

ValueError                                Traceback (most recent call last)
<ipython-input-9-b58a2a08d39b> in <module>()
----> 1 clf.predict(digits.data[-1])

【问题讨论】:

    标签: python machine-learning scikit-learn digits


    【解决方案1】:

    您的问题是当模型请求二维数组时您正在传递一维数组。

    这应该可以解决问题。

    from sklearn import datasets
    from sklearn import tree
    from sklearn.model_selection import StratifiedKFold
    
    # load the digits dataset
    digits = datasets.load_digits()
    
    # separate features and labels
    X_digits = digits.data
    y_digits = digits.target
    
    # split data into training and testing sets
    k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
    for train_index, test_index in k_fold.split(X_digits, y_digits):
            train_features, test_features = X_digits[train_index], X_digits[test_index]
            train_labels, test_labels = y_digits[train_index], y_digits[test_index]
    
    # fit to model
    clf = tree.DecisionTreeClassifier()
    clf = clf.fit(train_features, train_labels)
    
    # predict on the testing features
    print(clf.predict(test_features))
    

    另外,看看this。它可能会为您提供更多信息。

    【讨论】:

    • 谢谢。如果没有 k_fold,我不能这样做吗?我希望拥有尽可能少的代码行。效率不是这里的问题。一开始我想教孩子们尽可能少的线条。
    • @RakibulHassan 当然是的。 k_fold 的目的是简单地使用所有数据进行训练,以尽量减少数据的过度拟合。您可以保留原始代码,而不是 k_fold,而是在 digits.data[-1].reshape(1,-1) 上进行预测
    【解决方案2】:

    由于这似乎是您使用 sklearn 的开始,所以我想向您介绍一下这些东西在功能和样本方面的工作原理。

    要训练模型,您需要使用两个属性来拟合分类器,即特征向量和每个向量的标签。特征向量由2D N*M 数组表示,其中每一行对应一个新样本,每一列对应一个特定特征。标签必须是大小为 N 的 1D 数组,即每个样本一个标签。 (您甚至可以为每个样本设置多个标签,但现在让我们专注于每个样本一个)

    现在使用上述概念,您可以找出预测函数中的错误。

    digits.data 是一个2D 数组和数字,其中每一行对应一个样本。现在digits.data[-1] 是一个1D 数组,它没有任何列,但你知道这个1D 数组中的每个单独的数字实际上是一个特征(即一列)。因此,您需要将此 1D 数组重塑为 1 行 N 列的 2D 数组。这里numpy的reshape方法可以派上用场。只需执行digits.data[-1].reshape(1,-1) 即可达到预期效果并应用于预测方法。你的代码就会变成

    clf.predict(digits.data[-1].reshape(1,-1))
    

    考虑查看 numpy.reshape 的 documentation 以了解有关 .reshape() 方法的作用和方式的更多详细信息。

    【讨论】:

      【解决方案3】:

      这应该是你的错误:

      ValueError: Expected 2D array, got 1D array instead: 数组=[ 0. 0. 10. 14. 8. 1. 0. 0. 0. 2. 16. 14. 6. 1. 0. 0. 0. 0. 15. 15. 8. 15. 0. 0. 0. 0. 5. 16. 16. 10. 0. 0. 0. 0. 12. 15. 15. 12. 0. 0. 0. 4. 16. 6. 4. 16. 6. 0. 0. 8. 16. 10. 8. 16. 8. 0. 0. 1. 8. 12. 14. 12. 1. 0.]。 如果您的数据具有单个特征,则使用 array.reshape(-1, 1) 重塑您的数据,如果数据包含单个样本,则使用 array.reshape(1, -1)。

      除了最后一行之外,您消除了所有内容。这是你想做的吗?

      import numpy as np
      arr = np.array([[11,52], [46, 49], [35, 26]])
      arr[-1]
      

      你可以选择

      digits.data[-1].reshape(-1, 1)  
      

      但仅当您仅使用错误所说的一维数组训练模型时。

      【讨论】:

        【解决方案4】:

        非常感谢您的回答。你们都已经回应了这一点。现在,我明白了这个错误。我实际上是从https://www.youtube.com/watch?v=KTeVOb8gaD4&t=1213shttps://pythonprogramming.net/support-vector-machine-svm-example-tutorial-scikit-learn-python/中举的例子

        它主要是 python 版本,在以前的版本中 python predict 函数接受一维数组,但现在它已被弃用,因此用 [1D 数组] 之类的大括号包围一维数组将使其成为二维数组。现在下面的代码运行良好。

        import matplotlib.pyplot as plt
        
        from sklearn import datasets
        
        from sklearn import tree
        
        digits = datasets.load_digits()
        
        clf = tree.DecisionTreeClassifier()
        
        clf = clf.fit(digits.data[:-1], digits.target[:-1])
        
        clf.predict(digits.data[[-1]])
        

        输出是数组([8])。

        再次感谢您的帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-07
          • 2018-10-23
          • 2020-07-08
          • 2018-10-15
          • 1970-01-01
          • 2015-05-20
          • 1970-01-01
          • 2020-03-12
          相关资源
          最近更新 更多