使用sklearn数字数据集预测数字 - 错误

时间:2018-04-07 15:29:46

标签: python machine-learning scikit-learn digits

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

因此我:

  1. 加载sklearn数据集
  2. 使用DecisionTreeClassifier()
  3. 适合数据
  4. 预测新图片
  5. 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])
    

4 个答案:

答案 0 :(得分:1)

您的问题是当模型请求2D数组时您传递的是1D数组。

这应该可以解决问题。

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。它可能会为您提供更多信息。

答案 1 :(得分:1)

由于这似乎是您使用sklearn的开始,我想基本了解一下功能和样本的工作方式。

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

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

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

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

请考虑浏览numpy.reshape的documentation,详细了解.reshape()方法的用途和方式。

答案 2 :(得分:1)

这应该是你的错误:

ValueError:预期的2D数组,改为获得1D数组: array = [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)  

但是,只有当您使用一维数组训练模型时,如错误所示。

答案 3 :(得分:0)

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

中取了示例

它主要是python版本,在以前版本的python预测函数接受1D数组但现在它已被弃用,所以通过用[1D数组]这样的大括号包围1D数组将使它成为2D数组。现在,以下代码完美运行。

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])。

再次感谢您的帮助。