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

如何用Scikit-learn合并数值与独热分类特征生成完整训练集

数值特征与独热编码特征合并实现(无pandas方案)

常见报错根因定位

  • 训练集数值特征未做类型转换:当前x_train_num存储的还是字符串格式的数值,和独热编码输出的数值数组类型不匹配
  • 测试集独热编码未完成转换:目前x_test_1hot还是空列表,尚未复用训练集拟合好的编码器做转换,维度和训练集不一致
  • 数据结构不统一:x_train_num是原生Python嵌套列表,x_train_1hot是numpy二维数组,跨类型直接操作会触发类型不兼容报错
  • 拼接逻辑认知偏差:Python列表直接相加是列表首尾嵌套、不是按特征列横向拼接;numpy数组直接相加要求两个数组形状完全一致,数值特征和独热编码特征列数不同,自然触发维度不兼容报错

分步修正实现

  1. 修正训练集数值特征的类型转换
    此前拆分训练集数值特征的循环中,直接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)
    
  2. 补全测试集独热编码转换
    不要重新初始化编码器拟合测试集,直接复用训练集上已经fit好的编码器做转换,避免类别维度和训练集不匹配:
    # 基于训练集拟合好的编码器转换测试集分类特征
    x_test_1hot = enc.transform(numpy.array(cat_feats_test)).toarray()
    
  3. 横向拼接特征矩阵
    用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 02:54:02