训练集30000样本测试集5000样本仅2000标签如何归一化适配KNN
KNN分类样本数不匹配报错解决方法
报错根因
该ValueError: Found input variables with inconsistent numbers of samples报错,常见触发场景有两类:
- 数据归一化处理逻辑出错,导致
data_train_norm和label_train的样本维度不匹配,或是训练集、测试集赋值混淆 - 你导入了
accuracy_score但未贴出对应调用代码,大概率是计算准确率时,传入了全量5000条测试集的预测结果,和只有2000条的测试标签做匹配,触发维度校验失败
具体处理步骤
1. 校验数据集维度
先运行以下代码核对各数据的维度,排除归一化导致的维度异常:
print(data_train_norm.shape) # 正常应为(30000, 784) print(label_train.shape) # 正常应为(30000,) print(data_test_norm.shape) # 正常应为(5000, 784) print(label_test.shape) # 正常应为(2000,)
如果维度不符合预期,检查归一化逻辑:必须用训练集单独拟合归一化器,再分别转换训练集、测试集,不能合并两类数据集做归一化,正确归一化示例代码如下:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() # 仅用训练集拟合归一化规则 data_train_norm = scaler.fit_transform(data_train) # 测试集直接复用训练集的归一化规则转换 data_test_norm = scaler.transform(data_test)
2. 适配不完整的测试标签计算准确率
由于只有前2000条测试数据有标签,计算准确率时仅提取对应数量的预测结果即可:
from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score knn = KNeighborsClassifier(n_neighbors=10) knn.fit(data_train_norm, label_train) # 全量预测5000条测试数据,无标签的3000条结果可保留后续使用 knn_label_pred = knn.predict(data_test_norm) # 仅取前2000条有标签的预测结果计算准确率 acc = accuracy_score(label_test, knn_label_pred[:2000]) print(f"模型分类准确率:{acc:.4f}")
内容的提问来源于stack exchange,提问作者Tilda YU
相关产品推荐
相关产品推荐

