机器学习特征工程中常用的特征编码方法

  1. 独热编码(One - Hot Encoding)

    • 原理

      • 独热编码主要用于处理分类变量。对于一个具有n个类别属性的分类变量,独热编码会将其转换为n个二进制变量(0或1)。例如,对于"贷款用途"这个分类变量,假设有3种用途:购房、购车、教育。经过独热编码后,会产生3个新的变量,如"贷款用途_购房""贷款用途_购车""贷款用途_教育",当贷款用途是购房时,"贷款用途_购房"这个变量的值为1,其余两个为0;同理,当贷款用途是购车时,"贷款用途_购车"为1,其他为0。
    • 适用场景

      • 适用于大多数机器学习算法,因为许多算法不能直接处理分类变量,需要将其转换为数值型变量。尤其是在使用线性模型(如线性回归、逻辑回归)和神经网络时,独热编码可以避免模型错误地学习类别之间的顺序关系。
    • 示例(以Python为例)

      • 假设df是一个包含"贷款用途"这个分类变量的数据框。
      python 复制代码
      from sklearn.preprocessing import OneHotEncoder
      encoder = OneHotEncoder(sparse=False)
      loan_purpose = df[['loan_purpose']]
      encoded_purpose = encoder.fit_transform(loan_purpose)
      # 将编码后的数据转换为DataFrame并与原始数据合并(假设原始数据还有其他列)
      new_df = pd.DataFrame(encoded_purpose, columns=encoder.get_feature_names_out(['loan_purpose']))
      df = pd.concat([df.drop('loan_purpose', axis=1), new_df], axis=1)
  2. 标签编码(Label Encoding)

    • 原理

      • 标签编码是将分类变量的类别转换为整数。例如,对于"学历"这个分类变量,假设类别有高中、本科、硕士、博士,通过标签编码可以将其分别转换为0、1、2、3。这种编码方式简单直接,将分类变量转换为了有序的数值型变量。
    • 适用场景

      • 适用于一些对类别顺序有一定要求的模型或者场景,或者当分类变量的类别之间存在自然的顺序关系时。但是需要注意的是,对于一些没有顺序关系的分类变量(如颜色:红、绿、蓝),使用标签编码可能会让模型错误地学习到一种不存在的顺序关系。
    • 示例(以Python为例)

      • 假设df中有"学历"这个分类变量。
      python 复制代码
      from sklearn.preprocessing import LabelEncoder
      encoder = LabelEncoder()
      df['education_level'] = encoder.fit_transform(df['education_level'])
  3. 二进制编码(Binary Encoding)

    • 原理

      • 二进制编码是一种将分类变量转换为二进制数值的方法。首先,计算类别数量对应的二进制位数,然后将每个类别转换为相应的二进制代码。例如,对于有8个类别的分类变量,需要3位二进制数来表示所有类别(因为 2 3 = 8 2^3 = 8 23=8)。与独热编码相比,二进制编码可以更有效地表示具有大量类别的分类变量,减少编码后的变量数量。
    • 适用场景

      • 适用于类别数量较多的分类变量,尤其是当独热编码会导致变量维度爆炸的情况。同时,在一些对数据存储和计算效率要求较高的场景中,二进制编码是一个较好的选择。
    • 示例(以Python为例)

      • 假设df中有一个类别较多的分类变量"职业类别"。
      python 复制代码
      import category_encoders as ce
      encoder = ce.BinaryEncoder(cols=['occupation_category'])
      df = encoder.fit_transform(df)
  4. 频率编码(Frequency Encoding)

    • 原理

      • 频率编码是根据每个类别在数据集中出现的频率来进行编码。计算每个类别出现的次数或频率,然后将类别替换为对应的频率值。例如,对于"贷款产品类型"这个分类变量,统计每种贷款产品类型在数据集中出现的次数,然后用这个次数来替换原始的类别。这样编码后的变量可以反映类别在数据中的常见程度。
    • 适用场景

      • 适用于类别较多且存在稀有类别(出现频率很低的类别)的情况。它可以突出常见类别和稀有类别之间的差异,并且在一定程度上可以作为一种特征工程的手段,为模型提供关于类别分布的信息。
    • 示例(以Python为例)

      • 假设df中有"贷款产品类型"这个分类变量。
      python 复制代码
      frequency_dict = df['loan_product_type'].value_counts(normalize=True).to_dict()
      df['loan_product_type_freq'] = df['loan_product_type'].map(frequency_dict)

哑变量属于独热编码(One - Hot Encoding)的一种通俗说法。

  1. 原理阐述
    • 当我们有一个包含 n n n个类别的分类变量时,哑变量会创建 n n n个新的变量(也就是哑变量)。对于每个样本,在这 n n n个新变量中,只有一个变量的值为1,其余 n − 1 n - 1 n−1个变量的值为0,这个为1的变量就代表了该样本所属的类别。例如,对于"性别"这个分类变量(有男、女两个类别),会创建两个哑变量,假设为"性别_男"和"性别_女"。如果一个样本是男性,那么"性别_男"这个哑变量的值为1,"性别_女"的值为0;反之,女性样本对应的"性别_女"为1,"性别_男"为0。
  2. 应用场景
    • 在回归分析中被广泛使用。比如在线性回归模型中,如果直接将分类变量(如职业类别)放入模型,模型会错误地假设类别之间存在一种数量上的关系(比如把职业类别用数字1、2、3等来表示,模型可能会认为3对应的职业类别在数值上是1对应的职业类别的3倍)。而使用哑变量可以避免这种错误的假设,正确地处理分类变量对因变量的影响。
    • 在逻辑回归用于分类问题时,如预测贷款是否违约,对于像"贷款渠道"这种分类变量,将其转换为哑变量后放入模型,能够更好地捕捉不同贷款渠道与违约概率之间的关系。
  3. 与其他编码方式对比
    • 与标签编码(Label Encoding)不同,标签编码是将分类变量的类别转换为整数,会引入类别之间的顺序关系,而哑变量不存在这种顺序关系,更适合没有自然顺序的分类变量。例如,对于"颜色"分类变量(红、绿、蓝),使用标签编码可能会让模型误解为红<绿<蓝这种顺序关系,而哑变量则不会。
    • 相比二进制编码(Binary Encoding),哑变量在类别数量较少时更直观。二进制编码更侧重于高效地利用二进制来表示较多的类别,当类别数较少时,哑变量能更直接地展示每个类别是否出现的情况。例如,对于只有3个类别的变量,哑变量可以很清晰地用3个变量表示每个类别,而二进制编码可能会因为编码转换过程稍显复杂而不太直观。
相关推荐
Raas10021 小时前
MAI Gateway(魔芋企业级AI网关)对比分析:AI网关和API网关区别?企业级能力差距一览
大数据·人工智能·数据挖掘·mai gateway·企业级产品
来让爷抱一个21 小时前
2026 智能体安全实战:把护栏写进SPEC,MonkeyCode 云端跑通
人工智能·安全·机器学习
SelectDB1 天前
Apache Doris 5.0 年度版本前瞻(一):构建统一的多模湖仓实时分析平台
大数据·数据库·数据分析
147API1 天前
蒸馏模型量化上线前,先查精度退化和算子兼容
大数据·人工智能·深度学习·机器学习·蒸馏
橙时数据 FineInsight1 天前
AI 能回答数据问题,但能解释业务原因吗?
大数据·人工智能·数据分析·指标平台·fineinsight
SelectDB技术团队1 天前
实时主键更新选型:Doris MOW vs StarRocks 主键模型原理解析
数据分析·实时数仓·数据更新·主键模型·实时更新·写入更新·olap 引擎
Omics Pro1 天前
Arc研究所Cell|全新虚拟细胞官方基准评测框架
大数据·人工智能·深度学习·算法·机器学习
知识分享小能手1 天前
深度学习学习教程,从入门到精通,概率与信息论 — 知识点详解(3)
人工智能·深度学习·学习·数据挖掘·概率论
leoZ2311 天前
第 2 篇:搭建地基——Vue3 + Vite + Tailwind v4 + shadcn-vue
前端·javascript·vue.js·人工智能·目标检测·数据挖掘·语音识别
搞科研的小刘选手1 天前
【泰国曼谷举办】第二届机器学习与社会计算国际研讨会(MLSC 2026)
机器学习·社会计算·学术会议·会议推荐·泰国曼谷