【机器学习笔记Ⅰ】10 特征工程

发布于:2025-07-08 ⋅ 阅读:(22) ⋅ 点赞:(0)

特征工程(Feature Engineering)详解

特征工程是机器学习和数据科学中的核心环节,旨在通过对原始数据的转换、组合和提取,构建更适合模型的高质量特征。其质量直接决定模型性能上限(“数据和特征决定了模型的上限,而算法只是逼近这个上限”)。


1. 特征工程的核心目标

  1. 提升模型性能:增强特征与目标变量的相关性。
  2. 降低计算成本:减少冗余特征,加速训练。
  3. 改善泛化能力:避免过拟合,提高鲁棒性。

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):用目标变量均值代替类别。
  • 数值变量分箱
    • 等宽分箱: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())
  • 嵌入法(Embedded)
    • L1正则化(Lasso):Lasso(alpha=0.1).fit(X, y)

示例

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-IDFTfidfVectorizer
  • 词嵌入: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. 总结

  • 核心原则:理解业务、迭代实验、持续验证。
  • 关键步骤:清洗 → 构造 → 编码 → 缩放 → 选择。
  • 避坑指南
    • 避免数据泄漏(先拆分再处理)。
    • 平衡特征数量与信息量(防止维度灾难)。

特征工程是艺术与科学的结合,需结合领域知识和数据直觉,不断优化!



网站公告

今日签到

点亮在社区的每一天
去签到