【问题标题】:Python Scikit learn OneHotEncoder to encode select values onlyPython Scikit 学习 OneHotEncoder 仅对选择值进行编码
【发布时间】:2020-12-23 09:01:36
【问题描述】:

我可以使用 OneHotEncoder 对类别列中的选择值进行一次热编码,而不是构造一个密集的 ndarray 然后删除不必要的列吗?

例如, 如果一个名为 color 的分类列有 3 种颜色,即红色、绿色和蓝色,我想对其中的 2 个值进行热编码,即“红色”和“绿色”,我将如何使用 OneHotEncoder 做到这一点?

我是 ML 新手,所以也想知道做这种有限的一种热编码是否明智和普遍,尤其是处理具有太多分类值的列?

提前致谢。

【问题讨论】:

  • 你是只删除列还是删除多列?
  • 您要么在使用所有值的列上使用 one-hot 编码,要么根本不这样做。如果您尝试对某些 vales 进行一次性编码并保持某些 vales 原样,我看不出您可以在 ML 中使用它们的方式。

标签: python machine-learning scikit-learn


【解决方案1】:

如果您只想删除每列中的一个类别以便根据基线进行拟合,则可以在 OneHotEncoder 对象初始化时添加 drop 属性。

这将删除列中遇到的第一个值

ohe = OneHotEncoder(drop='first')

如果您有 2 列要编码,并且每列中都有您不想编码的特定值:

dropList = ['Blue','Triangle']
ohe = OneHotEncoder(drop=dropList)

不会在第一列编码'Blue',也不会在第二列编码'Triangle'

【讨论】:

  • 谢谢,是否可以告诉编码器保留哪些值而不是丢弃?
  • @toddlermenot 您可能想要定义另一列指定要保留的值,然后在该新列上运行 OHE,例如 df['SpecialOHE'] = df['Column'].apply(lambda x: x if x in [values you want to keep] else 'not interested') 因为跳过多个列意味着您有意删除信息可以使用,而且大多数时候你不想这样做,所以 Sklearn 没有设计那个功能
  • @toddlermenot 他们设计 OHE 的 drop one 值的原因是因为有时其中一个类别是基线,例如名为 disease 的列有 ['Not Sick', 'Lung Cancer', 'Ol' Rona', 'The Plague'] 等,他们不需要将'Not Sick' 编码为一个标志,因为它没有任何特殊行为,或者包括所有可能的类别会导致完美的多重共线性,这与某些模型(例如回归)有关
  • @toddlermenot 如果您完全确定自己在做什么,您还可以将您的OneHotEncoder(handle_unknown='ignore') 放入仅包含您想要的值的列,然后使用其他内容转换您的列。这样,它只会出现在拟合列中的 OHE 值,而忽略出现的任何新值(默认行为是 handle_unknown='error')。这是为了以防您的测试集具有在您的训练集中没有出现的值,并且您希望您的 OHE 只是去¯\_(ツ)_/¯
猜你喜欢
  • 2013-12-01
  • 2015-12-22
  • 1970-01-01
  • 2021-07-20
  • 2020-03-24
  • 2017-05-10
  • 2016-05-23
  • 2013-06-17
  • 1970-01-01
相关资源
最近更新 更多