在进行机器学习任务时,处理分类特征是至关重要的。然而,由于大多数机器学习算法只接受数值型输入,因此我们需要对分类特征进行编码以便于模型的训练和预测。本文将介绍11种常见的分类变量编码技术,帮助您更好地理解和应用这些方法。
1. One Hot Encoding(独热编码)
One Hot Encoding是最流行且常用的编码方法之一。它将一个具有n个观测值和d个不同值的单一变量转换为具有n个观测值的d个二元变量,每个二元变量使用一位(0或1)进行标识。
举例: 原始数据:
Sex |
---|
Male |
Female |
编码后的结果:
Sex_Male | Sex_Female |
---|---|
1 | 0 |
0 | 1 |
2. Label Encoding(标签编码)
Label Encoding为分类数据变量分配唯一的整数标签。尽管这种方法简单易用,但对于表示无序数据的分类变量可能会产生问题。
举例: 原始数据:
Sex |
---|
Male |
Female |
编码后的结果:
Sex |
---|
1 |
0 |
我们可以使用sklearn.preprocessing.LabelEncoder
实现这一过程。
3. Label Binarizer(标签二值化)
Label Binarizer是用于从多类别列表创建标签矩阵的工具类。它将一个列表转换为一个矩阵,其中列数与输入集合中的唯一值的数量完全相同。这种编码方法在某些情况下很有用,尤其是在处理多类别分类问题时。
举例: 原始数据:
Sex |
---|
Male |
Female |
编码后的结果:
Sex_Male |
---|
1 |
0 |
我们可以使用sklearn.preprocessing.LabelBinarizer
实现这一过程。
4. Leave One Out Encoding(留一法编码)
Leave One Out 编码时,目标分类特征变量对具有相同值的所有记录会被平均以确定目标变量的平均值。在训练数据集和测试数据集之间,编码算法略有不同。因为考虑到分类的特征记录被排除在训练数据集外,因此被称为“Leave One Out”。
举例: 原始数据:
Dept | Yearly Salary |
---|---|
1 | 120 |
2 | 100 |
3 | 140 |
2 | 60 |
3 | 70 |
1 | 100 |
2 | 120 |
3 | 110 |
1 | 100 |
3 | 70 |
编码后的结果:
Dept | Dept_encoded |
---|---|
1 | 106.67 |
2 | 93.33 |
3 | 103.33 |
2 | 100.0 |
3 | 103.33 |
1 | 106.67 |
2 | 93.33 |
3 | 103.33 |
1 | 106.67 |
3 | 103.33 |
这一编码方法可通过category_encoders.TargetEncoder
实现。
5. Hashing(哈希编码)
当使用哈希函数时,字符串将被转换为一个唯一的哈希值。由于哈希编码使用的内存较少,因此可以处理更多的分类数据。它适用于管理机器学习中的稀疏高维特征,是一种有效的方法。哈希编码在在线学习场景中表现出色,具有快速、简单和高效的特点。
举例: 原始数据:
nom_0 |
---|
Red |
Green |
Blue |
编码后的结果:
nom_0_0 | nom_0_1 | nom_0_2 |
---|---|---|
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 1 |
<code>from sklearn.feature_extraction import FeatureHasher # 创建FeatureHasher对象,设置哈希值的数量为3 h = FeatureHasher(n_features=3, input_type='string') # 转换分类特征列 hashed_feature = h.fit_transform(df['nom_0']) # 将稀疏矩阵转换为数组,并与原数据合并 hashed_feature = hashed_feature.toarray() df = pd.concat([df, pd.DataFrame(hashed_feature)], axis=1)</code>
6. Weight of Evidence Encoding(证据权重编码)
Weight of Evidence (WoE) 编码的主要目标是创建一个用于评估信贷和金融行业贷款违约风险的预测模型。WoE表示对理论的支持或反驳程度,取决于其权重或WoE。它通过比较观察到的特征值的平均目标值与平均期望值来计算。
举例: 原始数据:
cat | target |
---|---|
a | 1 |
b | 0 |
a | 0 |
b | 1 |
a | 0 |
a | 1 |
b | 0 |
c | 1 |
c | 1 |
编码后的结果:
cat_encoded |
---|
0.287 |
-0.287 |
0.287 |
-0.287 |
0.287 |
0.287 |
-0.287 |
0.693 |
0.693 |
<code>from category_encoders import WOEEncoder # 创建WOEEncoder对象 woe = WOEEncoder(cols=['cat'], random_state=42) # 转换特征列 encoded_df = woe.fit_transform(X, y)</code>
7. Helmert Encoding(赫尔默特编码)
Helmert Encoding将一个级别的因变量的平均值与该编码中所有先前水平的因变量的平均值进行比较。
反向 Helmert 编码是类别编码器中变体的另一个名称。它将因变量的特定水平平均值与其所有先前水平的水平的平均值进行比较。
举例: 原始数据:
Dept | Value |
---|---|
1 | 120 |
2 | 120 |
3 | 140 |
2 | 100 |
3 | 70 |
1 | 100 |
2 | 60 |
3 | 110 |
1 | 100 |
3 | 70 |
编码后的结果:
Dept_helmert_0 | Dept_helmert_1 | Dept_helmert_2 |
---|---|---|
-1.0 | -1.0 | -1.0 |
1.0 | -1.0 | -1.0 |
0.0 | 2.0 | -1.0 |
1.0 | -1.0 | -1.0 |
0.0 | 2.0 | -1.0 |
-1.0 | -1.0 | -1.0 |
1.0 | -1.0 | -1.0 |
0.0 | 2.0 | -1.0 |
-1.0 | -1.0 | -1.0 |
0.0 | 2.0 | -1.0 |
<code>import category_encoders as ce # 创建HelmertEncoder对象 encoder = ce.HelmertEncoder(cols='Dept') # 转换特征列 new_df = encoder.fit_transform(df['Dept']) # 合并新的编码特征列到原数据集 new_hdf = pd.concat([df, new_df], axis=1)</code>
8. Cat Boost Encoding
Cat Boost编码器旨在解决目标泄漏问题,并且除了目标编码外,还引入了一种排序概念。其工作原理类似于时间序列数据验证,即当前特征的目标概率仅从其之前的行(观测值)计算,这意味着目标统计值依赖于观测历史。
举例:
<code>from category_encoders import CatBoostEncoder # 创建CatBoostEncoder对象 cbe_encoder = CatBoostEncoder() # 定义特征和目标 X = df[['feature1', 'feature2']] y = df['target'] # 拟合编码器并对特征进行转换 X_encoded = cbe_encoder.fit_transform(X, y)</code>
9. James Stein Encoding
James-Stein编码器为特征值提供加权平均值,这些加权平均值基于观察到的特征值的平均目标值和平均期望值。James-Stein估计器的缺点在于它仅支持正态分布,因此建议使用beta分布或对数-比值比转换来处理非正态分布的情况。
10. M Estimator Encoding
M Estimator编码是Target Encoder的一个直接变体,只包含一个超参数m,代表正则化幂。建议将m的取值范围设置在1到100之间。
11. Sum Encoder
Sum Encoder将类别列的特定级别的因变量的平均值与目标的总体平均值进行比较。在线性回归模型中,Sum Encoder和One Hot Encoding是常用的方法之一。Sum Encoder模型的截距代表了总体平均值,而系数易于理解为主要效应。
结论
本文介绍了从James Stein编码到Sum编码等11种常见的分类变量编码技术。选择合适的编码方法可以更好地处理分类特征,并提高机器学习模型的性能和准确性。在实际应用中,根据数据集的特点和模型的需求,灵活选择适合的编码方法是至关重要的。
暂无评论内容