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

KNN模型蘑菇分类任务始终输出100%准确率问题求助

蘑菇分类模型出现完美准确率的问题排查与解决

核心问题:数据预处理与拆分的逻辑不匹配

你的代码存在明显的变量混用错误,导致模型训练和测试用的并非经过完整预处理的数据:

  • 预处理阶段生成了经过缺失值填充、有序编码的df_enc,但最终独热编码用的是原始df,而非处理后的df_enc
  • 拆分训练测试集时,X和y直接取自未完成预处理的原始df,这会导致数据逻辑混乱,甚至特征中可能隐含标签信息,让模型实现“完美预测”

修正后的预处理与数据拆分代码

统一基于处理后的数据集完成全流程操作:

# 填充缺失值(注意提取众数的具体值,避免Series类型)
mode = df['Stalk Root'].mode()[0]
df_enc = df.replace('?', mode)

# 有序特征编码
df_enc['Ring Number'] = df_enc['Ring Number'].replace({'n': 0, 'o': 1, 't': 2}).astype(int)
df_enc['Gill Spacing'] = df_enc['Gill Spacing'].replace({'c': 0, 'w': 1, 'd': 2}).astype(int)

# 标签转为数值型
df_enc['Poisonous'] = (df_enc['Poisonous'] == 'p').astype(int)

# 对剩余分类特征做独热编码
df_enc = pd.get_dummies(df_enc)

# 拆分特征与标签(用drop方法更安全,避免索引错误)
y = df_enc['Poisonous']
X = df_enc.drop('Poisonous', axis=1)

# 拆分训练测试集,建议设置random_state保证可复现
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, shuffle=True, random_state=42)

额外检查要点

  • 避免数据泄露:所有预处理统计量(如缺失值填充的众数)必须基于训练集计算,再用该统计量处理测试集。如果用全数据集的统计量填充,会导致测试集信息提前泄露,影响模型泛化性。
  • 特征-标签相关性验证:用df_enc.corr()['Poisonous'].abs().sort_values(ascending=False)查看特征与标签的相关度,确认没有特征直接等同于标签(比如编码错误导致的映射)。
  • 数据类型校验:用X_train.dtypes检查所有特征是否为数值型,确保无残留字符串特征干扰模型。

验证修正效果

修正后重新训练模型,正常情况下KNN的测试准确率会落在95%-99%区间,不会出现100%的完美结果:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, confusion_matrix

model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)
y_preds = model.predict(X_test)
print(f"准确率: {accuracy_score(y_test, y_preds)}")
print(confusion_matrix(y_test, y_preds))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:35:17