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



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

因此,我:

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

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

这应该可以解决问题。

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

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

由于这似乎是您使用 sklearn 的开始,我想让您了解这些东西在功能和示例方面是如何工作的。

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

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

digits.data是一个2D数组和数字,其中每行对应于一个样本。现在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 的文档,了解有关.reshape()方法正在做什么以及如何做的更多详细信息。

这应该是你的错误:

值错误:预期的 2D 数组,而是获得 1D 数组: 数组=[ 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)  

但前提是您仅使用一维数组进行建模,如错误所述。

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

它主要是 python 版本,在以前版本的 python 预测函数中接受 1D 数组,但现在它已被弃用,因此通过用大括号(如 [1D array] )包围 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]])

输出是 array([8])。

再次感谢您的帮助。

最新更新