【机器学习|学习笔记】类别特征(Categorical Features)处理方法,附代码。

【机器学习|学习笔记】类别特征(Categorical Features)处理方法,附代码。

【机器学习|学习笔记】类别特征(Categorical Features)处理方法,附代码。


文章目录

  • 【机器学习|学习笔记】类别特征(Categorical Features)处理方法,附代码。
  • 前言
    • ✅ 为什么要处理类别特征?
      • 原因 1:大多数模型不能处理字符串
      • 原因 2:避免“错误的顺序假设”
      • 原因 3:方便模型泛化与特征交互
    • ✅ 类别特征的常见处理方式(附Python示例)
      • 方法一:Label Encoding(标签编码)
      • 方法二:One-Hot Encoding(独热编码)
      • 方法三:使用 ColumnTransformer 结合模型管道
      • 方法四:频率编码 / 目标编码(高级,尤其适合树模型)
    • ✅ 不同模型对类别特征的支持差异
    • ✅ 总结


欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup

大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “学术会议小灵通”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/147196847


前言

在机器学习中,处理类别特征(Categorical Features)是建模的关键步骤之一。因为大多数主流算法(尤其是基于数值计算的算法)无法直接理解非数值的字符串或标签数据。如果处理不当,会导致模型性能下降甚至报错。

✅ 为什么要处理类别特征?

原因 1:大多数模型不能处理字符串

  • 算法如:线性回归逻辑回归支持向量机(SVM)KNNXGBoost 都要求输入是数值型向量
  • 字符串或符号型类别没有数学意义(无法比较“苹果”和“香蕉”谁大)。

原因 2:避免“错误的顺序假设”

  • 例如使用 .astype(int) 强行转换类别会引入假顺序关系,误导模型

原因 3:方便模型泛化与特征交互

  • 编码好的类别特征可以参与特征组合、交叉或嵌入操作。

✅ 类别特征的常见处理方式(附Python示例)

我们以 pandas + scikit-learn 代码为例,介绍几种主流方式:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
from sklearn.compose import ColumnTransformer

# 示例数据集
df = pd.DataFrame({
    'Color': ['Red', 'Blue', 'Green', 'Blue', 'Red'],
    'Size': ['S', 'M', 'L', 'S', 'XL'],
    'Price': [10, 20, 15, 12, 30]
})

# 显示原始数据
print("原始数据:\n", df)

方法一:Label Encoding(标签编码)

  • 适合有序类别(如衣服大小 S < M < L),会将类别转为整数。
le = LabelEncoder()
df['Size_encoded'] = le.fit_transform(df['Size'])  # XL=3, S=2, M=1, L=0 (可能无意义)
print("\nLabelEncoder处理后:\n", df[['Size', 'Size_encoded']])

  • ⚠️ 注意:用于无序类别会引入错误顺序关系!

方法二:One-Hot Encoding(独热编码)

  • 适合无序类别特征,将每个类别变为一个二进制特征列。
# 独热编码 Color 列
encoder = OneHotEncoder(sparse=False, drop=None)
encoded = encoder.fit_transform(df[['Color']])
encoded_df = pd.DataFrame(encoded, columns=encoder.get_feature_names_out(['Color']))

# 拼接回原数据
df_encoded = pd.concat([df, encoded_df], axis=1)
print("\nOneHotEncoder处理后:\n", df_encoded)

方法三:使用 ColumnTransformer 结合模型管道

  • 便于与 sklearn pipeline 集成,自动处理数值 + 类别混合特征
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LinearRegression

# 特征列
numeric_features = ['Price']
categorical_features = ['Color']

# 构建预处理器
preprocessor = ColumnTransformer(
    transformers=[
        ('cat', OneHotEncoder(), categorical_features),
        ('num', 'passthrough', numeric_features)
    ])

# 构建完整管道
model = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('regressor', LinearRegression())
])

model.fit(df[['Color', 'Price']], [1, 2, 3, 2, 5])
print("\n模型训练成功,OneHot和数值特征自动处理完毕。")

方法四:频率编码 / 目标编码(高级,尤其适合树模型)

  • 频率编码:用每个类别在数据中出现的频率替代。
  • 目标编码(Target Encoding):用每个类别对应的目标变量平均值编码。
# 频率编码 Color
freq_map = df['Color'].value_counts(normalize=True).to_dict()
df['Color_freq'] = df['Color'].map(freq_map)
print("\n频率编码后:\n", df[['Color', 'Color_freq']])

✅ 不同模型对类别特征的支持差异

模型 是否支持类别特征 推荐处理方式
线性回归 / SVM / KNN ❌ 不支持字符串 One-hot
决策树 / 随机森林 ✅ 部分支持(sklearn中需编码) Label / Target
LightGBM ✅ 支持 categorical_feature 参数 可直接传递标签编码
XGBoost / CatBoost ❌(XGBoost需手动编码)/ ✅(CatBoost原生支持) 建议 Target Encoding

✅ 总结

内容 特征处理方法 应用建议
有序类别 Label Encoding 如等级、评分
无序类别 One-Hot Encoding 如颜色、国家、性别
类别数目大 Target / Frequency Encoding 避免维度爆炸
与模型集成 ColumnTransformer + Pipeline 推荐方式
复杂任务 Embedding + 深度学习 如图像、文本分类

你可能感兴趣的:(机器学习,学习笔记,机器学习,学习,笔记,神经网络,人工智能,深度学习)