特征工程
问题
什么是特征工程?数据分析师需要掌握哪些特征工程技能?
答案
特征工程流程
特征构造
从原始数据中构造有业务含义的特征:
import pandas as pd
# 原始数据:用户订单表
orders = pd.read_csv('orders.csv')
# 构造用户级特征
user_features = orders.groupby('user_id').agg(
order_count=('order_id', 'count'), # 订单数
total_amount=('amount', 'sum'), # 总消费
avg_amount=('amount', 'mean'), # 平均客单价
last_order=('order_date', 'max'), # 最近一次下单
first_order=('order_date', 'min'), # 首次下单
unique_categories=('category', 'nunique') # 消费品类数
).reset_index()
# 时间特征
user_features['tenure_days'] = (
pd.Timestamp.now() - pd.to_datetime(user_features['first_order'])
).dt.days
user_features['recency_days'] = (
pd.Timestamp.now() - pd.to_datetime(user_features['last_order'])
).dt.days
特征编码
| 编码方式 | 适用类型 | 示例 |
|---|---|---|
| Label Encoding | 有序类别 | 低/中/高 → 0/1/2 |
| One-Hot Encoding | 无序类别 | 颜色 → R/G/B 三列 |
| Target Encoding | 高基数类别 | 城市 → 该城市的目标均值 |
from sklearn.preprocessing import LabelEncoder, StandardScaler
# Label Encoding(有序)
le = LabelEncoder()
df['level_encoded'] = le.fit_transform(df['user_level']) # 低→0, 中→1, 高→2
# One-Hot(无序)
df_encoded = pd.get_dummies(df, columns=['city'], prefix='city')
# 数值标准化
scaler = StandardScaler()
df[['amount_scaled', 'age_scaled']] = scaler.fit_transform(df[['amount', 'age']])
特征选择
from sklearn.ensemble import RandomForestClassifier
# 方法 1:基于模型的特征重要性
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
importance = pd.Series(model.feature_importances_, index=X.columns)
top_features = importance.nlargest(10).index.tolist()
# 方法 2:相关性过滤
corr_matrix = df[features].corr()
# 去掉相关性 > 0.9 的冗余特征
特征工程经验法则
- 业务理解优先:最好的特征来自对业务的深入理解
- 时间特征很有用:recency、趋势、周期性
- 交叉特征:两个特征的组合可能比单独更有效
- 少即是多:避免过多冗余特征,增加噪声
常见面试问题
Q1: 缺失值怎么处理?
答案:
- 删除:缺失比例 > 50% 的特征可以直接删除
- 填充:均值/中位数(数值)、众数(类别)、前向/后向填充(时序)
- 标记:新增
is_missing列,让模型学习缺失模式 - 模型插补:用其他特征预测缺失值(如 KNN Imputer)
Q2: 什么是特征泄漏(Data Leakage)?
答案: 特征中包含了不应该在预测时出现的未来信息。例如用"是否退款"预测"是否会购买"——退款发生在购买之后,预测时不可能知道。
避免方法:
- 严格按时间划分训练集/测试集
- 检查特征的时间先后关系
- 特征值是否在预测时已知
相关链接
- Pandas 数据清洗 - 数据预处理
- 回归分析 - 特征用于回归
- 分类算法 - 特征用于分类