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

KNN分类算法数据清洗报错:存在NaN值且处理无效

解决KNN分类中NaN值报错的问题

你代码里的核心问题是只初始化了SimpleImputer但完全没用来处理数据,而且你的数据混合了字符串分类型特征和数值型特征,不能用同一种填充策略,加上LabelEncoder无法处理带NaN的字符串列,这些问题叠加导致了报错。以下是针对你的需求(保留缺失数据价值、不删除样本)的修复方案:

修复后的完整代码

import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.impute import SimpleImputer

# 加载数据
dataset = pd.read_excel(r"C:\Users\renat\Documents\Data Science Projects\Classification\Book Purchases\Biblioteca.xlsx")

# 拆分特征矩阵X和目标变量y
X = dataset.iloc[:, :-1]
y = dataset.iloc[:, 8]

# 区分分类型特征和数值型特征
cat_cols = ['Titulo', 'Autor', 'Género']
num_cols = ['Año Leido', 'Puntaje', 'Precio', 'Año Publicado', 'Paginas']

# 处理分类型特征缺失值:用出现次数最多的类别填充
cat_imputer = SimpleImputer(strategy='most_frequent')
X[cat_cols] = cat_imputer.fit_transform(X[cat_cols])

# 处理数值型特征缺失值:用均值填充
num_imputer = SimpleImputer(strategy='mean')
X[num_cols] = num_imputer.fit_transform(X[num_cols])

# 对分类型特征做LabelEncoder编码
label_encoders = {}
for col in cat_cols:
    le = LabelEncoder()
    X[col] = le.fit_transform(X[col])
    label_encoders[col] = le

# 转换为NumPy数组供KNN使用
X = X.values

# 训练KNN模型并预测
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X, y)
y_pred = knn.predict(X)

print(y_pred)

关键说明

  1. 分类型特征处理:用众数填充缺失值,既保留了样本,又符合分类数据的逻辑,也可以根据业务需求改为新增一个"未知"类别填充
  2. 数值型特征处理:用均值填充是常规操作,也可以尝试中位数(更抗 outliers)
  3. 编码时机:必须先填充缺失值再做LabelEncoder编码,否则编码环节会直接报错
  4. 优化建议:KNN是基于距离的算法,训练前建议对数值型特征做标准化(比如StandardScaler),避免数值范围差异大的特征主导距离计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:01:20