如何用Scikit-learn合并数值与独热分类特征生成完整训练集
数值特征与独热编码特征合并实现(无pandas方案)
常见报错根因定位
- 训练集数值特征未做类型转换:当前
x_train_num存储的还是字符串格式的数值,和独热编码输出的数值数组类型不匹配 - 测试集独热编码未完成转换:目前
x_test_1hot还是空列表,尚未复用训练集拟合好的编码器做转换,维度和训练集不一致 - 数据结构不统一:
x_train_num是原生Python嵌套列表,x_train_1hot是numpy二维数组,跨类型直接操作会触发类型不兼容报错 - 拼接逻辑认知偏差:Python列表直接相加是列表首尾嵌套、不是按特征列横向拼接;numpy数组直接相加要求两个数组形状完全一致,数值特征和独热编码特征列数不同,自然触发维度不兼容报错
分步修正实现
- 修正训练集数值特征的类型转换
此前拆分训练集数值特征的循环中,直接append了原始字符串格式的数值,需要补类型转换逻辑,保证存储的是整数类型:# 替换原有训练集数值特征拆分的循环逻辑 for instance in x_train: num_instance = [] num_instance.append(int(instance[0])) num_instance.append(int(instance[2])) num_instance.append(int(instance[4])) num_instance.append(int(instance[10])) num_instance.append(int(instance[11])) num_instance.append(int(instance[12])) x_train_num.append(num_instance) - 补全测试集独热编码转换
不要重新初始化编码器拟合测试集,直接复用训练集上已经fit好的编码器做转换,避免类别维度和训练集不匹配:# 基于训练集拟合好的编码器转换测试集分类特征 x_test_1hot = enc.transform(numpy.array(cat_feats_test)).toarray() - 横向拼接特征矩阵
用numpy提供的横向拼接方法,在保持样本数完全对齐的前提下,将数值特征列和独热编码特征列合并:# 将两个列表格式的特征子集转成numpy数值数组 x_train_num_arr = numpy.array(x_train_num, dtype=int) x_test_num_arr = numpy.array(x_test_num, dtype=int) # 合并生成完整的训练/测试特征集 x_train_full = numpy.hstack([x_train_num_arr, x_train_1hot]) x_test_full = numpy.hstack([x_test_num_arr, x_test_1hot])
效果验证
拼接完成后可以通过shape属性确认矩阵维度:
- 训练集维度应为(训练样本总数, 6个数值特征 + 独热编码总特征数)
- 测试集的总特征数和训练集完全一致,不存在维度偏差
内容的提问来源于stack exchange,提问作者Stephan
相关产品推荐
相关产品推荐

