【机器学习|学习笔记】类别特征(Categorical Features)处理方法,附代码。
欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/147196847
在机器学习中,处理类别特征(Categorical Features)是建模的关键步骤之一。因为大多数主流算法(尤其是基于数值计算的算法)无法直接理解非数值的字符串或标签数据。如果处理不当,会导致模型性能下降甚至报错。
线性回归
、逻辑回归
、支持向量机(SVM)
、KNN
、XGBoost
都要求输入是数值型向量。.astype(int)
强行转换类别会引入假顺序关系,误导模型。我们以 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)
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']])
# 独热编码 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)
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和数值特征自动处理完毕。")
# 频率编码 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 + 深度学习 | 如图像、文本分类 |