离散型特征编码方式:one-hot与哑变量*

本文介绍了离散型特征的编码方式,包括one-hot编码和哑变量编码。这两种编码方法用于增强模型的非线性能力,尤其在简单模型如LR中。one-hot编码将每个离散值转化为一个状态位,而哑变量编码则通过删除一个状态位来表示类别。文章探讨了两者的区别、联系,并讨论了如何通过这两种编码提升模型的非线性能力,以及在实际应用中如何选择编码方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在机器学习问题中,我们通过训练数据集学习得到的其实就是一组模型的参数,然后通过学习得到的参数确定模型的表示,最后用这个模型再去进行我们后续的预测分类等工作。在模型训练过程中,我们会对训练数据集进行抽象、抽取大量特征,这些特征中有离散型特征也有连续型特征。若此时你使用的模型是简单模型(如LR),那么通常我们会对连续型特征进行离散化操作,然后再对离散的特征,进行one-hot编码或哑变量编码。这样的操作通常会使得我们模型具有较强的非线性能力。那么这两种编码方式是如何进行的呢?它们之间是否有联系?又有什么样的区别?是如何提升模型的非线性能力的呢?下面我们一一介绍:

one-hot encoding

  关于one-hot编码的具体介绍,可以参考一篇博客,博客地址:特征提取方法: one-hot 和 IF-IDF。这里,不再详细介绍。one-hot的基本思想:将离散型特征的每一种取值都看成一种状态,若你的这一特征中有N个不相同的取值,那么我们就可以将该特征抽象成N种不同的状态,one-hot编码保证了每一个取值只会使得一种状态处于“激活态”,也就是说这N种状态中只有一个状态位值为1,其他状态位都是0。举个例子,假设我们以学历为例,我们想要研究的类别为小学、中学、大学、硕士、博士五种类别,我们使用one-hot对其编码就会得到:

       

dummy encoding


哑变量(Dummy Variable),也叫虚拟变量,引入哑变量的目的是,将不能够定量处理的变量量化,如职业、性别对收入的影响,战争、自然灾害对GDP的影响,季节对某些产品(如冷饮)销售的影响等等。 这种“量化”通常是通过引入“哑变量”来完成的。根据这些因素的属性类型,构造只取“0”或“1”的人工变量,通常称为哑变量(dummy variables),记为D。

  哑变量编码直观的解释就是任意的将一个状态位去除。拿上面的例子来说,我们用4个状态位就足够反应上述5个类别的信息,也就是我们仅仅使用前四个状态位 [0,0,0,0] 就可以表达博士了。只是因为对于一个我们研究的样本,他已不是小学生、也不是中学生、也不是大学生、又不是研究生,那么我们就可以默认他是博士。(额,当然他现实生活也可能上幼儿园,但是我们统计的样本中他并不是,^-^)。所以,我们用哑变量编码可以将上述5类表示成:

      


### 哑编码的概念 哑编码(Dummy Encoding)是一种用于将分类变量转换为数值形式的技术,以便能够被机器学习模型理解和处理。其核心思想是通过二进制向量的形式表示不同类别的值[^1]。 独热编码One-Hot Encoding)相比,哑编码生成的特征数量通常较少,因为它会减少一个冗余列以避免多重共线性问题。具体来说,对于具有 \( k \) 个类别的分类变量,哑编码只会生成 \( k-1 \) 列,而不是像 One-Hot 编码那样生成完整的 \( k \) 列[^3]。 #### 实现方式 以下是哑编码的具体实现方法: 1. **确定类别数** 首先统计目标分类变量的不同取值数目 \( k \)。例如,在一个三分类问题中,可能有三个类别:A、B 和 C。 2. **创建 \( k-1 \) 列** 对于上述三分类问题,只创建两个新列来表示 A 和 B 的存在情况。C 类别则作为默认基线类别(baseline category),不需要单独的一列表示。 3. **赋值规则** 如果某样本属于某一特定类别,则相应的新列为 1;否则为 0。例如: - 若样本属于类别 A,则第一列设为 1,第二列设为 0; - 若样本属于类别 B,则第一列设为 0,第二列设为 1; - 若样本属于类别 C,则两列均设为 0。 下面是一个具体的 Python 示例代码展示如何实现哑编码: ```python import pandas as pd # 创建示例数据框 data = {'Category': ['A', 'B', 'C', 'A', 'B']} df = pd.DataFrame(data) # 使用 Pandas 进行哑编码 dummies = pd.get_dummies(df['Category'], drop_first=True) print(dummies) ``` 运行以上代码后,`drop_first=True` 参数确保只保留 \( k-1 \) 列,从而实现了哑编码的效果[^3]。 ### 总结 哑编码的主要目的是降低维度并防止多重共线性的影响。尽管它减少了某些信息的显式表达,但在许多情况下仍然非常有效,尤其是在回归分析和其他依赖矩阵运算的方法中[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值