在 sklearn 一种热编码中删除列以避免虚拟变量陷阱的必要性

问题描述 投票:0回答:3

我针对线性回归问题测试了 sklearn One Hot Encoding 的先丢和不先丢的情况。它表明当没有删除列时,r_2 分数更好。

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(drop= 'first') # r_2 score 0.67

首先降低 r2_score = 0.67

ohe = OneHotEncoder() # r_2 score = 0.78

不先删除(即保留默认值)r2_score = .78

那么在 Sklearn OneHotEncoding 中不使用 drop= 'first' 可以吗?

machine-learning scikit-learn one-hot-encoding
3个回答
1
投票

drop
中的参数
OneHotEncoder
并不意味着指定是否应删除列。相反,正如官方文档所述:

指定用于删除每个功能的一个类别的方法。

特别是,选项

drop='first'
将:

删除每个功能中的第一个类别。如果仅存在一个类别,则该功能将完全被删除。

因此,可能会发生一整列被删除的情况,但前提是它只有一个类别(在这种情况下无论如何它都没有用)。

关于 r2 分数的变化,文档也解决了这个问题:

但是,删除一个类别会破坏原始表示的对称性,因此可能会导致下游模型出现偏差,例如惩罚线性分类或回归模型。

当您使用

drop='first'
时,这似乎会影响您的模型,最好不要删除任何类别(是的,您确实可以这样做)。


0
投票

我想您可能想阅读这篇博客文章:https://inmachineswetrust.com/posts/drop-first-columns/

它包含了为什么你的 R2 发生变化的合理解释,而且它主张根本不删除任何 OHE 列。


0
投票

请记住,当您添加更多功能时,R2 会增加,因为您需要为每个类别创建一个新功能,所以您人为地增加了 R2 分数

© www.soinside.com 2019 - 2024. All rights reserved.