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

  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个变量表示每个类别,而二进制编码可能会因为编码转换过程稍显复杂而不太直观。
相关推荐
IT古董1 小时前
【机器学习】机器学习的基本分类-半监督学习(Semi-supervised Learning)
学习·机器学习·分类·半监督学习
-芒果酱-1 小时前
KNN分类算法 HNUST【数据分析技术】(2025)
分类·数据挖掘·数据分析
千天夜2 小时前
多源多点路径规划:基于启发式动态生成树算法的实现
算法·机器学习·动态规划
Anlici3 小时前
模型训练与数据分析
人工智能·机器学习
-芒果酱-4 小时前
HNUST-数据分析技术课堂实验
数据挖掘·数据分析
hans7748829684 小时前
Python入门项目:一个简单的办公自动化需求
前端·爬虫·数据分析
SelectDB4 小时前
飞轮科技荣获中国电信星海大数据最佳合作伙伴奖!
大数据·数据库·数据分析
深圳市青牛科技实业有限公司 小芋圆4 小时前
开关电源特点、分类、工作方式
前端·科技·单片机·物联网·分类·数据挖掘·新能源
落魄君子5 小时前
BP分类-反向传播神经网络(Backpropagation Neural Network)
神经网络·分类
三万棵雪松7 小时前
1.系统学习-线性回归
算法·机器学习·回归·线性回归·监督学习