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

从零实现K近邻算法时遇KeyError报错的解决方法咨询

解决KNN实现中Iris数据集的KeyError问题

嘿,我来帮你捋清楚这个问题!你遇到的KeyError本质上是因为你的KNN代码里的标签处理逻辑只适配了乳腺癌数据集的整数(或字符串形式的整数)标签,没考虑到Iris数据集的纯字符串类别标签场景。

问题根源分析

两个数据集的标签差异是关键:

  • 乳腺癌数据集的标签是'2'、'4',虽然是字符串形式,但本质是数字,你的代码可能默认了标签是这类有限的、可直接当作键的数值型内容;
  • Iris的标签是'setosa'、'versicolor'这类纯字符串,它们和你之前代码里预设的标签逻辑不匹配,就会触发KeyError。

具体解决步骤

下面是几个最可能的修复方向,你可以对照自己的代码排查:

1. 动态统计邻居标签,不要提前固定字典键

如果你之前的代码是提前初始化了只包含乳腺癌标签的计数字典(比如counts = {'2':0, '4':0}),那遇到Iris的字符串标签时,自然会因为键不存在报错。

改成动态统计的方式,用空字典或者defaultdict来处理:

# 方法1:普通字典动态计数
counts = {}
for label in neighbor_labels:
    if label in counts:
        counts[label] += 1
    else:
        counts[label] = 1

# 方法2:用collections.defaultdict更简洁
from collections import defaultdict
counts = defaultdict(int)
for label in neighbor_labels:
    counts[label] += 1

2. 统一将标签转换为整数索引

如果你的代码逻辑更适配整数标签,可以用标签编码器把所有类型的标签(不管是数字字符串还是纯字符串)都转换成0开始的整数,这样两个数据集都能兼容:

from sklearn.preprocessing import LabelEncoder

# 训练时拟合编码器
le = LabelEncoder()
train_labels_encoded = le.fit_transform(train_dataset['label_column'])
# 测试时用同一编码器转换
test_labels_encoded = le.transform(test_dataset['label_column'])

之后KNN代码处理整数标签就不会有问题,预测完成后还可以用le.inverse_transform(predicted_labels)转回原来的标签字符串。

3. 替换依赖整数的投票逻辑

如果你的投票逻辑用了numpy.bincount这类只支持非负整数的函数,那处理字符串标签肯定会出错。换成collections.Counter,它对任何可哈希类型(包括字符串)都能正常工作:

from collections import Counter

# 统计邻居标签的出现次数
vote_counter = Counter(neighbor_labels)
# 获取出现次数最多的标签
most_common_label = vote_counter.most_common(1)[0][0]

总结

核心就是打破“标签是整数”的预设,让代码能兼容任意可哈希的标签类型,或者统一将标签转换成整数索引。按照上面的方法调整后,你的KNN应该就能在Iris数据集上正常运行啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:18:47