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

如何用OneHotEncoding避免虚拟变量陷阱?附代码求助

解决DL4J独热编码时保留基准类别避免多重共线性的问题

看起来你在使用Deeplearning4J处理CSV数据时,遇到了独热编码的虚拟变量陷阱问题——默认生成的独热向量包含了基准类别(France)的特征,导致出现多余的维度。别担心,有两种简单的方法可以实现你想要的效果:把第一个类别作为基准,只生成剩余类别的独热特征。

方法一:独热编码后移除基准类别对应的列

这是最直接且稳妥的方式,先让DL4J生成所有类别的独热向量,再手动删掉基准类别的列。修改你的TransformProcess构建代码就行:

TransformProcess transformProcess = new TransformProcess.Builder(schema)
        .removeColumns("RowNumber","Surname","CustomerId")
        .categoricalToInteger("Gender")
        .categoricalToOneHot("Geography")
        .removeColumns("Geography_France") // 移除对应基准类France的独热列
        .build();

这样处理后,原本Geography生成的三个独热列(Geography_France、Geography_Spain、Geography_Germany)会去掉第一个,剩下两个列。对应效果就是:

  • 原始值为France时,输出0,0
  • 原始值为Spain时,输出1,0
  • 原始值为Germany时,输出0,1
    完全符合你避免多重共线性的需求。

方法二:修改类别列表,仅对非基准类别做独热编码

另一种思路是在定义Schema时,直接排除基准类别,只保留需要生成独热的类别。不过这种方法要注意数据兼容性:

第一步:调整Schema的类别定义

Schema schema = new Schema.Builder()
        .addColumnsString("RowNumber")
        .addColumnInteger("CustomerId")
        .addColumnString("Surname")
        .addColumnInteger("CreditScore")
        .addColumnCategorical("Geography",Arrays.asList("Spain","Germany")) // 只保留非基准类别
        .addColumnCategorical("Gender",Arrays.asList("Male","Female"))
        .addColumnsInteger("Age","Tenure","Balance","NumOfProducts","HasCrCard","IsActiveMember","EstimatedSalary","Exited")
        .build();

第二步:构建TransformProcess

TransformProcess transformProcess = new TransformProcess.Builder(schema)
        .removeColumns("RowNumber","Surname","CustomerId")
        .categoricalToInteger("Gender")
        .categoricalToOneHot("Geography") // 现在只会生成两个独热列
        .build();

⚠️ 注意:如果你的CSV数据中存在France值,这种方式会把它视为未知类别,可能抛出异常或被处理为默认值。所以如果原始数据包含基准类别,方法一更推荐,它能兼容所有原始类别,只是移除不需要的维度。

最后验证一下:当你打印第一条记录时,原本的619, 1, 0, 0,...就会变成619, 0, 0,...,正好是你想要的结果。

内容的提问来源于stack exchange,提问作者Rahul Raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:04:16