【机器学习|学习笔记】类别特征(Categorical Features)处理方法,附代码。
【机器学习|学习笔记】类别特征(Categorical Features)处理方法,附代码。
【机器学习|学习笔记】类别特征(Categorical Features)处理方法,附代码。
文章目录
欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/147196847
前言
在机器学习中,处理类别特征(Categorical Features)是建模的关键步骤之一。因为大多数主流算法(尤其是基于数值计算的算法)无法直接理解非数值的字符串或标签数据。如果处理不当,会导致模型性能下降甚至报错。
✅ 为什么要处理类别特征?
📌 原因 1:大多数模型不能处理字符串
- 算法如:
线性回归
、逻辑回归
、支持向量机(SVM)
、KNN
、XGBoost
都要求输入是数值型向量。 - 字符串或符号型类别没有数学意义(无法比较“苹果”和“香蕉”谁大)。
📌 原因 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)!