Sklearn鸢尾花分类代码报错:期望2D数组却得到1D数组
解决Sklearn鸢尾花分类中的ValueError:Expected 2D array, got 1D array instead
嘿,这个问题我帮不少刚入门机器学习的朋友踩过坑,咱们一步步拆解清楚:
错误原因
你遇到的这个报错,核心是Sklearn的模型训练方法fit()对输入数据的维度有严格要求:
- 特征数据(也就是
train_data)必须是二维数组,形状得是(样本数量, 特征数量)——简单说就是每一行代表一个样本,每一列代表这个样本的一个特征。 - 但你的代码里,
train_data = np.delete(iris.data, test_index)这一行出了问题:np.delete默认会把输入的多维数组先扁平化(拉成一维),再删除指定索引的元素。原本iris.data是(150,4)的二维数组(150个样本,每个样本4个特征),经过这个操作后,train_data变成了一维数组,形状是(588,)(1504 - 34 = 588),完全不符合Sklearn的要求,所以才会抛出这个维度不匹配的错误。
为什么会涉及数组重塑(reshape)?
很多新手会想到用reshape把一维数组转回去,但其实这是治标不治本的——因为扁平化后删除元素再重塑,会打乱样本的特征结构(原本的4个特征会被拆得乱七八糟)。真正的问题是你没告诉np.delete要按行删除样本,而不是乱删元素。
正确的解决办法
只需要给np.delete加上axis=0参数,指定按行(也就是样本维度)删除:
from sklearn.datasets import load_iris from sklearn import tree import numpy as np # load data iris= load_iris() # position of the start of the flower names or indexes test_index=[0,50,100] # Training data train_target = np.delete(iris.target,test_index) # 加上axis=0,按行删除样本,保持二维结构 train_data=np.delete(iris.data,test_index, axis=0) test_target=iris.target[test_index] test_data=iris.data[test_index] clf = tree.DecisionTreeClassifier() clf=clf.fit(train_data , train_target) print(test_target)
修改后,train_data的形状会是(147,4),完全符合Sklearn的输入要求,代码就能正常运行了。
你可以自己加一行print(train_data.shape)验证一下,看看是不是二维数组~
内容的提问来源于stack exchange,提问作者Ayush Pant
相关产品推荐
相关产品推荐

