- 独热编码(One - Hot Encoding)
- 原理:
- 独热编码主要用于处理分类变量。对于一个具有n个类别属性的分类变量,独热编码会将其转换为n个二进制变量(0或1)。例如,对于“贷款用途”这个分类变量,假设有3种用途:购房、购车、教育。经过独热编码后,会产生3个新的变量,如“贷款用途_购房”“贷款用途_购车”“贷款用途_教育”,当贷款用途是购房时,“贷款用途_购房”这个变量的值为1,其余两个为0;同理,当贷款用途是购车时,“贷款用途_购车”为1,其他为0。
- 适用场景:
- 适用于大多数机器学习算法,因为许多算法不能直接处理分类变量,需要将其转换为数值型变量。尤其是在使用线性模型(如线性回归、逻辑回归)和神经网络时,独热编码可以避免模型错误地学习类别之间的顺序关系。
- 示例(以Python为例):
- 假设
df
是一个包含“贷款用途”这个分类变量的数据框。
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)
- 假设
- 原理:
- 标签编码(Label Encoding)
- 原理:
- 标签编码是将分类变量的类别转换为整数。例如,对于“学历”这个分类变量,假设类别有高中、本科、硕士、博士,通过标签编码可以将其分别转换为0、1、2、3。这种编码方式简单直接,将分类变量转换为了有序的数值型变量。
- 适用场景:
- 适用于一些对类别顺序有一定要求的模型或者场景,或者当分类变量的类别之间存在自然的顺序关系时。但是需要注意的是,对于一些没有顺序关系的分类变量(如颜色:红、绿、蓝),使用标签编码可能会让模型错误地学习到一种不存在的顺序关系。
- 示例(以Python为例):
- 假设
df
中有“学历”这个分类变量。
from sklearn.preprocessing import LabelEncoder encoder = LabelEncoder() df['education_level'] = encoder.fit_transform(df['education_level'])
- 假设
- 原理:
- 二进制编码(Binary Encoding)
- 原理:
- 二进制编码是一种将分类变量转换为二进制数值的方法。首先,计算类别数量对应的二进制位数,然后将每个类别转换为相应的二进制代码。例如,对于有8个类别的分类变量,需要3位二进制数来表示所有类别(因为 2 3 = 8 2^3 = 8 23=8)。与独热编码相比,二进制编码可以更有效地表示具有大量类别的分类变量,减少编码后的变量数量。
- 适用场景:
- 适用于类别数量较多的分类变量,尤其是当独热编码会导致变量维度爆炸的情况。同时,在一些对数据存储和计算效率要求较高的场景中,二进制编码是一个较好的选择。
- 示例(以Python为例):
- 假设
df
中有一个类别较多的分类变量“职业类别”。
import category_encoders as ce encoder = ce.BinaryEncoder(cols=['occupation_category']) df = encoder.fit_transform(df)
- 假设
- 原理:
- 频率编码(Frequency Encoding)
- 原理:
- 频率编码是根据每个类别在数据集中出现的频率来进行编码。计算每个类别出现的次数或频率,然后将类别替换为对应的频率值。例如,对于“贷款产品类型”这个分类变量,统计每种贷款产品类型在数据集中出现的次数,然后用这个次数来替换原始的类别。这样编码后的变量可以反映类别在数据中的常见程度。
- 适用场景:
- 适用于类别较多且存在稀有类别(出现频率很低的类别)的情况。它可以突出常见类别和稀有类别之间的差异,并且在一定程度上可以作为一种特征工程的手段,为模型提供关于类别分布的信息。
- 示例(以Python为例):
- 假设
df
中有“贷款产品类型”这个分类变量。
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)的一种通俗说法。
- 原理阐述
- 当我们有一个包含 n n n个类别的分类变量时,哑变量会创建 n n n个新的变量(也就是哑变量)。对于每个样本,在这 n n n个新变量中,只有一个变量的值为1,其余 n − 1 n - 1 n−1个变量的值为0,这个为1的变量就代表了该样本所属的类别。例如,对于“性别”这个分类变量(有男、女两个类别),会创建两个哑变量,假设为“性别_男”和“性别_女”。如果一个样本是男性,那么“性别_男”这个哑变量的值为1,“性别_女”的值为0;反之,女性样本对应的“性别_女”为1,“性别_男”为0。
- 应用场景
- 在回归分析中被广泛使用。比如在线性回归模型中,如果直接将分类变量(如职业类别)放入模型,模型会错误地假设类别之间存在一种数量上的关系(比如把职业类别用数字1、2、3等来表示,模型可能会认为3对应的职业类别在数值上是1对应的职业类别的3倍)。而使用哑变量可以避免这种错误的假设,正确地处理分类变量对因变量的影响。
- 在逻辑回归用于分类问题时,如预测贷款是否违约,对于像“贷款渠道”这种分类变量,将其转换为哑变量后放入模型,能够更好地捕捉不同贷款渠道与违约概率之间的关系。
- 与其他编码方式对比
- 与标签编码(Label Encoding)不同,标签编码是将分类变量的类别转换为整数,会引入类别之间的顺序关系,而哑变量不存在这种顺序关系,更适合没有自然顺序的分类变量。例如,对于“颜色”分类变量(红、绿、蓝),使用标签编码可能会让模型误解为红<绿<蓝这种顺序关系,而哑变量则不会。
- 相比二进制编码(Binary Encoding),哑变量在类别数量较少时更直观。二进制编码更侧重于高效地利用二进制来表示较多的类别,当类别数较少时,哑变量能更直接地展示每个类别是否出现的情况。例如,对于只有3个类别的变量,哑变量可以很清晰地用3个变量表示每个类别,而二进制编码可能会因为编码转换过程稍显复杂而不太直观。