自学内容网 自学内容网

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

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

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



欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!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 + 深度学习如图像、文本分类

原文地址:https://blog.csdn.net/2401_89898861/article/details/148651479

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!