跳到主要内容

特征工程

问题

什么是特征工程?数据分析师需要掌握哪些特征工程技能?

答案

特征工程流程

特征构造

从原始数据中构造有业务含义的特征:

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 的冗余特征
特征工程经验法则
  1. 业务理解优先:最好的特征来自对业务的深入理解
  2. 时间特征很有用:recency、趋势、周期性
  3. 交叉特征:两个特征的组合可能比单独更有效
  4. 少即是多:避免过多冗余特征,增加噪声

常见面试问题

Q1: 缺失值怎么处理?

答案

  • 删除:缺失比例 > 50% 的特征可以直接删除
  • 填充:均值/中位数(数值)、众数(类别)、前向/后向填充(时序)
  • 标记:新增 is_missing 列,让模型学习缺失模式
  • 模型插补:用其他特征预测缺失值(如 KNN Imputer)

Q2: 什么是特征泄漏(Data Leakage)?

答案: 特征中包含了不应该在预测时出现的未来信息。例如用"是否退款"预测"是否会购买"——退款发生在购买之后,预测时不可能知道。

避免方法:

  • 严格按时间划分训练集/测试集
  • 检查特征的时间先后关系
  • 特征值是否在预测时已知

相关链接