特征工程(Feature Engineering)详解
特征工程是机器学习和数据科学中的核心环节,旨在通过对原始数据的转换、组合和提取,构建更适合模型的高质量特征。其质量直接决定模型性能上限(“数据和特征决定了模型的上限,而算法只是逼近这个上限”)。
1. 特征工程的核心目标
- 提升模型性能:增强特征与目标变量的相关性。
- 降低计算成本:减少冗余特征,加速训练。
- 改善泛化能力:避免过拟合,提高鲁棒性。
2. 特征工程的主要步骤
(1) 数据理解与探索
- 查看数据分布:统计描述(均值、方差、分位数)、可视化(直方图、箱线图)。
- 检测异常值:Z-score、IQR方法。
- 分析特征相关性:热力图、皮尔逊相关系数。
代码示例:
import pandas as pd
import seaborn as sns
# 加载数据
data = pd.read_csv("data.csv")
# 统计描述
print(data.describe())
# 相关性热力图
sns.heatmap(data.corr(), annot=True)
(2) 数据清洗
- 处理缺失值:
- 删除:
data.dropna()
- 填充:均值/中位数(
data.fillna()
)、预测模型(如KNN)。
- 删除:
- 处理异常值:
- 截断:
np.clip(values, lower, upper)
- 分箱平滑。
- 截断:
示例:
# 填充缺失值
data["age"].fillna(data["age"].median(), inplace=True)
# 处理异常值(基于IQR)
Q1, Q3 = data["income"].quantile([0.25, 0.75])
IQR = Q3 - Q1
data = data[(data["income"] >= Q1 - 1.5*IQR) & (data["income"] <= Q3 + 1.5*IQR)]
(3) 特征构造
- 领域知识驱动:
- 电商:从“购买时间”提取“是否周末”、“时段(早/中/晚)”。
- 文本:从“评论”提取“情感分数”、“关键词频率”。
- 数学变换:
- 对数变换:
np.log(x)
(处理长尾分布)。 - 多项式特征:
sklearn.preprocessing.PolynomialFeatures
(如 (x^2, xy))。
- 对数变换:
代码示例:
from sklearn.preprocessing import PolynomialFeatures
# 多项式特征
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X[["feature1", "feature2"]])
(4) 特征编码
- 分类变量编码:
- 独热编码(One-Hot):
pd.get_dummies()
- 目标编码(Target Encoding):用目标变量均值代替类别。
- 独热编码(One-Hot):
- 数值变量分箱:
- 等宽分箱:
pd.cut(data, bins=5)
- 等频分箱:
pd.qcut(data, q=5)
- 等宽分箱:
示例:
# 独热编码
data_encoded = pd.get_dummies(data, columns=["city"])
# 分箱
data["age_bin"] = pd.cut(data["age"], bins=[0, 18, 35, 60, 100], labels=["child", "young", "adult", "elder"])
(5) 特征缩放
- 标准化(Standardization):
StandardScaler
(均值0,方差1)。 - 归一化(Normalization):
MinMaxScaler
(缩放到[0,1])。 - 鲁棒缩放(Robust Scaling):
RobustScaler
(抗异常值)。
代码:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
(6) 特征选择
- 过滤法(Filter):
- 方差阈值:
VarianceThreshold(threshold=0.1)
- 相关性:选择与目标变量相关性高的特征(如相关系数 > 0.3)。
- 方差阈值:
- 包裹法(Wrapper):
- 递归特征消除(RFE):
RFECV(estimator=LogisticRegression())
- 递归特征消除(RFE):
- 嵌入法(Embedded):
- L1正则化(Lasso):
Lasso(alpha=0.1).fit(X, y)
- L1正则化(Lasso):
示例:
from sklearn.feature_selection import SelectKBest, f_classif
# 选择K个最佳特征
selector = SelectKBest(score_func=f_classif, k=5)
X_selected = selector.fit_transform(X, y)
3. 高级特征工程技术
(1) 时间序列特征
- 滑动窗口统计:均值、标准差(
pandas.rolling()
)。 - 周期性特征:提取小时、星期、季节。
(2) 文本特征
- 词袋模型:
CountVectorizer
- TF-IDF:
TfidfVectorizer
- 词嵌入:Word2Vec、BERT。
(3) 图像特征
- 手工特征:HOG(方向梯度直方图)、SIFT。
- 深度学习:CNN提取的特征(如ResNet最后一层输出)。
4. 特征工程的评估
- 模型性能对比:在验证集上测试特征工程前后的AUC、RMSE等指标。
- 特征重要性分析:
- 树模型:
model.feature_importances_
- SHAP值:解释特征贡献。
- 树模型:
代码:
import shap
# 计算SHAP值
explainer = shap.Explainer(model)
shap_values = explainer(X)
shap.summary_plot(shap_values, X)
5. 工具与库推荐
任务 | 工具 |
---|---|
数据清洗 | Pandas, OpenRefine |
特征构造 | FeatureTools, Tsfresh(时间序列) |
特征选择 | Scikit-learn, XGBoost内置特征重要性 |
自动化特征工程 | AutoFeat, Feature-engine |
6. 总结
- 核心原则:理解业务、迭代实验、持续验证。
- 关键步骤:清洗 → 构造 → 编码 → 缩放 → 选择。
- 避坑指南:
- 避免数据泄漏(先拆分再处理)。
- 平衡特征数量与信息量(防止维度灾难)。
特征工程是艺术与科学的结合,需结合领域知识和数据直觉,不断优化!