You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KNN模型训练报错:输入变量样本数不一致问题求助

解决KNN模型拟合时的样本数不匹配问题

老哥,我来帮你看看这个KNN拟合报错的问题!你遇到的这个样本数不匹配的错误,根源其实不是特征数不同,而是你处理x和y的代码出了几个关键问题,咱们一步步理清楚:

问题回顾

你尝试编写一个比鸢尾花教程更灵活的KNN输入脚本,在步骤6处理NumPy数组维度、步骤11模型拟合时卡住,报错如下:

File "G:\PROGRAMMERING\Anaconda\lib\site-packages\sklearn\utils\validation.py", line 212, in check_consistent_length
" samples: %r" % [int(l) for l in lengths])
ValueError: Found input variables with inconsistent numbers of samples: [150, 1]

你提到x维度是(150,5),y是(150,1),但这个描述和你代码里的处理逻辑不符,咱们先看代码里的错误点:

错误原因分析

  1. 覆盖了numpy库变量:你写了np = df.to_numpy(),这直接把导入的numpy模块覆盖成了你的数组,后续如果用numpy的函数会直接报错,而且这也导致你处理x的方式完全错误
  2. x的取值错误:x = np.data是完全无效的写法——NumPy数组根本没有.data这个属性,这里的x其实是一个错误的对象,不是你想要的特征数据
  3. y的包装错误:y = [df['species']]把Series放进了一个列表里,这会让sklearn把y识别成1个样本(列表的长度是1),而x那边如果是150个样本,自然就会报样本数不匹配

修正后的完整代码

下面是把所有错误点修正后的代码,关键修改处我标了注释:

#1. 导入库:注意不要随便覆盖numpy变量!
import pandas as pd
import numpy as np

#2. 读取自定义数据集
data = pd.read_csv("custom.csv")

#3. 预览前5行数据及数据类型
print(data.head())
print(type(data))

#4. 查看数据形状(data本身就是DataFrame,无需重复转换)
print(data.shape)
print(data)

#5. 将分类变量(species)转换为数值型
print("转换前的数据类型:")
print(data.dtypes)
data['species'] = pd.Categorical(data['species'])
data['species'] = data['species'].cat.codes
print("\n转换后的数据类型:")
print(data.dtypes)

#6. 转换为NumPy数组(用新变量名,避免覆盖numpy库)
data_np = data.to_numpy()
print(type(data_np))
print("数组形状:", data_np.shape)
print(data_np)

# 拆分特征x和标签y(核心修正!)
# x取所有行,除了最后一列(species标签)
x = data_np[:, :-1]
# y取最后一列,直接得到一维数组(sklearn支持一维/二维标签)
y = data_np[:, -1]
# 如果需要二维的y,可以用:y = data_np[:, -1].reshape(-1, 1)

print("\nx的维度:", x.shape)
print("y的维度:", y.shape)

#8. 导入KNN分类器
from sklearn.neighbors import KNeighborsClassifier

#9. 设置K值
k = 2

#10. 初始化KNN模型
knn = KNeighborsClassifier(n_neighbors=k)
print(knn)

#11. 拟合模型(现在样本数完全匹配,不会报错)
knn.fit(x, y)

#12. 预测新样本:注意特征数要和x的特征数一致!
# 比如x是(150,4),这里就要传4个特征值
print("\n新样本预测结果:", knn.predict([[3, 5, 4, 2]]))

关键修正说明

  • 不要覆盖numpy库:永远别用np作为自定义变量名,它是numpy库的默认别名,覆盖后会引发各种奇怪问题
  • 正确拆分特征与标签:
    • 用数组切片[:, :-1]取所有特征列,[:, -1]取标签列,保证x和y的样本数都是150
    • 绝对不要把标签Series放进列表里,那样会让sklearn误判样本数
  • 验证维度:运行代码前可以先打印x和y的形状,确保x是(150, N)(N是特征数),y是(150,)或(150,1),这样两者样本数一致,就能顺利拟合模型了

内容的提问来源于stack exchange,提问作者futureExpert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:17:34