基于Kaggle银行数据集的SVM预测模型出现KeyError:'male'求解
SVM预测代码KeyError问题分析与解决
问题描述
正在使用Python编写基于SVM的预测代码,采用Kaggle银行数据集,代码在第4行报错。
出错代码
encoded_data = [0] * len(data_to_predict) for i in range(len(data_to_predict)): if i == 0: encoded_data[i] = gen[data_to_predict[i]] elif i==1: encoded_data[i] = m[data_to_predict[i]] elif i==2: encoded_data[i] = ed[data_to_predict[i]] elif i==3: encoded_data[i] = s_emp[data_to_predict[i]] elif i==4: encoded_data[i] = d[data_to_predict[i]] elif i==10: encoded_data[i] = a[data_to_predict[i]] else: encoded_data[i] = s.fit_transform(np.array(encoded_data[i]).reshape(-1,1))
报错信息
KeyError Traceback (most recent call last) <ipython-input-68-e2388fb9ed49> in <module> 2 for i in range(len(data_to_predict)): 3 if i == 0: ----> 4 encoded_data[i] = gen[data_to_predict[i]] 5 elif i==1: 6 encoded_data[i] = m[data_to_predict[i]] KeyError: 'male'
报错原因
- 字典
gen中不存在'male'这个键,说明训练时生成gen的映射标签和当前预测输入的性别值不匹配:- 比如训练数据里性别标签是
'Male'(首字母大写),但预测输入是小写的'male';或者gen字典的键根本没包含'male'这个取值。
- 比如训练数据里性别标签是
else分支逻辑错误:- 初始
encoded_data[i]是0,用s.fit_transform转换这个0完全不符合特征编码逻辑,应该转换的是data_to_predict[i];且预测阶段不能用fit_transform(会重新拟合编码器,导致编码和训练时不一致),必须用transform。
- 初始
解决方案
- 修正
gen字典的映射匹配问题:- 方法一:统一输入值的格式,比如把预测输入的性别转成和训练标签一致的大小写:
encoded_data[i] = gen[data_to_predict[i].capitalize()](如果训练标签是首字母大写)。 - 方法二:重新生成
gen字典,确保包含'male'这个键,比如gen = {'male':0, 'female':1}(和输入值完全匹配)。
- 方法一:统一输入值的格式,比如把预测输入的性别转成和训练标签一致的大小写:
- 修复
else分支的编码逻辑:else: # 转换目标是data_to_predict[i],用训练好的编码器的transform方法 encoded_data[i] = s.transform(np.array([data_to_predict[i]]).reshape(-1,1))[0][0] - 建议使用sklearn标准编码器替代手动字典映射,避免出错:
- 训练时对每个分类特征拟合编码器并保存:
from sklearn.preprocessing import LabelEncoder # 训练阶段处理性别特征 gen_le = LabelEncoder() gen_le.fit(train_data['gender_column']) - 预测时调用对应编码器的transform方法:
encoded_data[0] = gen_le.transform([data_to_predict[0]])[0]
- 训练时对每个分类特征拟合编码器并保存:
内容的提问来源于stack exchange,提问作者era 044
相关产品推荐
相关产品推荐

