【问题标题】:X has 972 features, but KNeighborsClassifier is expecting 6804 features as inputX 有 972 个特征,但 KNeighborsClassifier 期望 6804 个特征作为输入
【发布时间】:2026-01-17 02:35:01
【问题描述】:

我的 KNN 水果分类有问题。我有一个新鲜和烂橙子的数据集,训练数据有 1000 个新鲜和 1000 个烂橙子图像,我的测试数据有 300 个新鲜和烂橙子。现在,当我尝试在我的 python 代码上实现 KNN 时,我得到了错误。

ValueError: X 有 972 个特征,但 KNeighborsClassifier 期望 6804 个特征作为输入。

这是我的代码:

对于训练数据:

training_fresh = []

for entry in glob.glob("path"):
    img=np.array(mpimg.imread(entry))
    resized_img = cv2.resize(img,(64,128))
    fd = hog(resized_img,channel_axis=2)
    training_fresh.append(fd)

training_rotten = []

for entry in glob.glob("path"):
    img=np.array(mpimg.imread(entry))
    resized_img = cv2.resize(img,(64,128))
    fd = hog(resized_img,channel_axis=2)
    training_rotten.append(fd)

train_data = training_rotten + training_fresh

对于标签:

train_label_list = []

for i in range(len(train_data)):
    if i < 1000:
        train_label_list.append(0)
    else:
        train_label_list.append(1)
print(train_label_list)
print(len(train_label_list))

标签测试数据:

test_fresh = []
for entry in glob.glob("PATH"):
    img = np.array(mpimg.imread(entry))
    resized_img = cv2.resize(img,(64,32))
    fd = hog(resized_img, channel_axis=2)
    test_dict = {'data':fd, 'label':1}
    test_fresh.append(test_dict)

test_rotten = []
for entry in glob.glob("PATH"):
    img = np.array(mpimg.imread(entry))
    resized_img = cv2.resize(img,(64,32))
    fd = hog(resized_img, channel_axis=2)
    test_dict = {'data':fd, 'label':0}
    test_rotten.append(test_dict)

test_data = test_rotten + test_fresh

为了从标签中分离数据:

test_features = []
test_labels = []

for i in test_data:
    test_labels.append(i['label'])
    test_features.append(i['data'])

一切都很顺利。但是,在我尝试运行这个 KNN 实现后,我得到了错误:

x_axis_k_points = []

#LIST OF MATRICES
f1 = []
accuracy = []
confusion_matrix = []

for k in range(7):
    #KNN CLASSIFIER 
    knn = KNeighborsClassifier(n_neighbors=k+1)
    knn.fit(train_data, train_label_list)

    #KNN CLASSIFIER PREDICTION
    pred_labels = knn.predict(test_features)

    #ACCURACY
    acs = knn.score(test_features, test_labels)
    accuracy.append(acs)

    #CONFUSION MATRIX
    confusion_matrix.append(metrics.confusion_matrix(test_labels, pred_labels))

    #F1 SCORE
    f1.append(metrics.f1_score(test_labels, pred_labels, pos_label=1))

    x_axis_k_points.append(k+1)

请帮助我。因为这个项目的截止日期是明天。任何帮助都可以。我只是不明白为什么我有错误。我尝试重新运行我的代码并修复我的数据集,但问题仍然存在。非常感谢。

【问题讨论】:

  • 能不能同时加train_data.shapetrain_label_list.shape
  • 您应该使用 DataFrames / Matrices ,而不是简单的列表。列表是一维的,因此不适用于 X 矩阵和 y 向量。
  • @sotmot 不幸的是,我什至无法运行 train_data.shape,因为它是一个返回错误的列表:AttributeError: 'list' object has no attribute 'shape'。
  • 你建议在我的代码中编辑什么@Malo
  • 您可以尝试 np.array(data) 将其转换为数组,然后您可以使用 reshape(..) 使其成为您需要的形状

标签: python jupyter-notebook classification jupyter knn


【解决方案1】:

好的。所以,现在问题很清楚了。这是尺寸不匹配。

  • 对于训练数据,预处理如下:cv2.resize(img,(64,128))
  • 对于测试数据,预处理为:cv2.resize(img,(64,32))

这会导致数据大小发生变化。确保调整大小相同,然后再次尝试 fitpredict

【讨论】: