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
相关产品推荐
相关产品推荐

