如何用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
相关产品推荐
相关产品推荐

