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)
关键说明
- 分类型特征处理:用众数填充缺失值,既保留了样本,又符合分类数据的逻辑,也可以根据业务需求改为新增一个"未知"类别填充
- 数值型特征处理:用均值填充是常规操作,也可以尝试中位数(更抗 outliers)
- 编码时机:必须先填充缺失值再做
LabelEncoder编码,否则编码环节会直接报错 - 优化建议:KNN是基于距离的算法,训练前建议对数值型特征做标准化(比如
StandardScaler),避免数值范围差异大的特征主导距离计算
内容的提问来源于stack exchange,提问作者Renata
相关产品推荐
相关产品推荐

