使用 sklearn 数字数据集预测数字 - 错误
Predicting numbers using sklearn digits dataset - error
我想建立一个简单的数字预测模型。
所以我:
- 载入 sklearn 数据集
- 使用 DecisionTreeClassifier()
- 适合数据
- 预测新图像
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))
另外,看看this。它可能会为您提供更多信息。
由于这似乎是您使用 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)
即可达到预期效果并应用于 predict 方法。您的代码将变为
clf.predict(digits.data[-1].reshape(1,-1))
考虑查看 numpy.reshape 的 documentation 以了解有关 .reshape()
方法的作用和方式的更多详细信息。
这应该是你的错误:
ValueError:应为二维数组,得到的是一维数组:
数组=[ 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 and https://pythonprogramming.net/support-vector-machine-svm-example-tutorial-scikit-learn-python/
中拿了例子
它主要是 python 版本,在以前的 python 版本中,预测函数接受一维数组,但现在它已被弃用,因此通过像 [1D array] 这样的大括号包围一维数组将使它是一个二维数组。现在下面的代码运行良好。
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]).
再次感谢您的帮助。
我想建立一个简单的数字预测模型。
所以我:
- 载入 sklearn 数据集
- 使用 DecisionTreeClassifier()
- 适合数据
- 预测新图像
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))
另外,看看this。它可能会为您提供更多信息。
由于这似乎是您使用 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)
即可达到预期效果并应用于 predict 方法。您的代码将变为
clf.predict(digits.data[-1].reshape(1,-1))
考虑查看 numpy.reshape 的 documentation 以了解有关 .reshape()
方法的作用和方式的更多详细信息。
这应该是你的错误:
ValueError:应为二维数组,得到的是一维数组: 数组=[ 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 and https://pythonprogramming.net/support-vector-machine-svm-example-tutorial-scikit-learn-python/
中拿了例子它主要是 python 版本,在以前的 python 版本中,预测函数接受一维数组,但现在它已被弃用,因此通过像 [1D array] 这样的大括号包围一维数组将使它是一个二维数组。现在下面的代码运行良好。
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]).
再次感谢您的帮助。