在Spyder IDE中使用sklearn.Imputer处理缺失值遇TypeError错误求助
解决Spyder中使用scikit-learn处理缺失值时的"TypeError: unhashable type: 'slice'"错误
嘿,刚入门机器学习的时候谁没踩过这种小坑啊,别着急,咱们慢慢捋清楚问题出在哪~
首先得给你提个关键信息:你用的sklearn.preprocessing.Imputer在scikit-learn 0.20版本之后就已经被官方弃用并移除了,现在大家都用sklearn.impute.SimpleImputer来处理缺失值,这是第一个要调整的地方。
至于你遇到的「TypeError: unhashable type: 'slice'」错误,大概率是两个常见问题导致的:
常见错误原因&解决办法
1. 对Pandas DataFrame用了Numpy风格的切片
Pandas的DataFrame不支持像Numpy数组那样直接写dataset[:, 1:3]来取列切片,这种写法会触发"unhashable type: 'slice'"错误。你得用DataFrame专属的iloc方法来定位行列:
比如你要提取特征矩阵,应该这么写:
# 提取所有行,除了最后一列的特征 X = dataset.iloc[:, :-1].values # 提取所有行的最后一列作为标签 y = dataset.iloc[:, -1].values
2. 用了已弃用的Imputer工具
旧版的Imputer不仅会有兼容性问题,参数设置也和新版的SimpleImputer略有不同。下面给你一套完整的正确代码,直接替换你现有的缺失值处理部分就行:
# 导入库(补充新版Imputer) import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.impute import SimpleImputer # 替换成官方推荐的工具 # 导入数据集(去掉file://前缀,本地文件直接写路径更稳妥) dataset = pd.read_csv('C:/Users/Bhaskar Das/Desktop/Udemy/Machine_Learning_AZ_Template_Folder/Machine Learning AZ Template Folder/Data.csv') # 先把数据集中的字符串型缺失值转成Numpy能识别的np.nan(如果有的话) dataset = dataset.replace('NaN', np.nan) # 提取特征和标签 X = dataset.iloc[:, :-1].values y = dataset.iloc[:, -1].values # 初始化SimpleImputer,指定用均值填充缺失值 imputer = SimpleImputer(missing_values=np.nan, strategy='mean') # 拟合并转换有缺失值的列(假设是第2、3列,对应索引1和2) imputer.fit(X[:, 1:3]) X[:, 1:3] = imputer.transform(X[:, 1:3])
额外小提示
- 如果你的缺失值不是用
np.nan表示的(比如用了'?'或者其他字符串),一定要先转换成np.nan,不然SimpleImputer识别不到。 - 除了'mean'策略,你还可以用'median'(中位数)、'most_frequent'(众数)或者'constant'(指定常量)来填充缺失值,根据你的数据类型选择就行。
内容的提问来源于stack exchange,提问作者Bhaskar Das
相关产品推荐
相关产品推荐

