一、特征工程通俗解释
特征工程 就像厨师做菜前的食材处理:原始数据是"生肉和蔬菜",特征工程是"切块、腌制、调料搭配",目的是让机器学习模型(食客)更容易消化吸收,做出更好预测(品尝美味)。
二、为什么要做特征工程?
- 数据质量差:原始数据常有缺失、噪声、不一致问题(如年龄列混入"未知")。
- 模型限制:算法无法直接理解原始数据(如文本、日期需要数值化)。
- 提升效果:好特征能显著提升模型性能(准确率提升10%~50%)。
三、特征工程全流程
3.1 数据清洗(基础处理)
-
处理缺失值:
- 删除:缺失率>60%的列可直接删除。
- 填充:用均值(数值)、众数(类别)、模型预测(复杂场景)填补。
python# 均值填充年龄缺失 df['age'].fillna(df['age'].mean(), inplace=True)
-
处理异常值:
- 截断法:将超过3倍标准差的值替换为边界值。
- 分箱法:将年龄分段为"青年/中年/老年"。
python# 使用IQR检测异常值 Q1 = df['income'].quantile(0.25) Q3 = df['income'].quantile(0.75) df['income'] = np.where(df['income']>Q3+1.5*(Q3-Q1), Q3, df['income'])
3.2 特征变换(适应模型需求)
-
数值特征处理:
-
标准化 :将数据缩放到均值为0、方差1(适合SVM、逻辑回归)。
pythonfrom sklearn.preprocessing import StandardScaler scaler = StandardScaler() df[['height','weight']] = scaler.fit_transform(df[['height','weight']])
-
归一化 :缩放到[0,1]区间(适合图像处理)。
pythondf['price'] = (df['price'] - df['price'].min()) / (df['price'].max() - df['price'].min())
-
-
类别特征编码:
-
独热编码(One-Hot) :适合无序类别(如颜色:红/蓝/绿)。
pythonpd.get_dummies(df, columns=['city'])
-
标签编码(Label Encoding) :适合有序类别(如学历:小学/中学/大学)。
pythonfrom sklearn.preprocessing import LabelEncoder df['education'] = LabelEncoder().fit_transform(df['education'])
-
-
时间特征提取:
- 拆分日期为年、月、日、星期、是否节假日。
- 计算时间间隔(如注册日期到当前的天数)。
pythondf['order_year'] = df['order_date'].dt.year df['days_since_reg'] = (datetime.now() - df['reg_date']).dt.days
3.3 特征构造(创造新特征)
-
业务驱动构造:
- 电商场景:用户购买频率 = 总订单数 / 注册天数
- 金融风控:负债收入比 = 总负债 / 年收入
-
统计特征:
- 滑动窗口统计:过去7天销售额均值
- 交叉统计:用户对不同品类商品的购买占比
-
交互特征:
- 数值相乘:面积 = 长 × 宽
- 组合类别:品牌+品类 → "苹果手机"
3.4 特征选择(去芜存菁)
-
过滤法:
- 计算特征与目标的相关性(皮尔逊系数、卡方检验)。
- 保留相关性绝对值>0.3的特征。
-
包裹法:
-
递归特征消除(RFE):逐步剔除最不重要特征。
pythonfrom sklearn.feature_selection import RFE selector = RFE(estimator=RandomForestClassifier(), n_features_to_select=20) selector.fit(X, y)
-
-
嵌入法:
- 用L1正则化(LASSO)自动筛选特征。
- 树模型(如XGBoost)输出特征重要性排序。
四、经典场景案例
案例1:电商用户购买预测
- 原始特征:用户ID、浏览时长、加购次数、历史购买金额
- 特征工程后 :
- 构造特征:周均访问频率、最近30天加购转化率、客单价等级
- 编码特征:常用设备类型(One-Hot)、用户等级(Label Encoding)
- 选择特征:剔除ID类无关字段,保留与购买强相关的15个特征
案例2:新闻分类
- 原始文本:新闻标题和正文
- 特征工程后 :
- TF-IDF向量化(提取关键词权重)
- 添加元特征:文章长度、情感极性得分、是否含图片
- 降维处理:用PCA保留95%方差的主成分
五、特征工程工具
- 自动化工具:FeatureTools(自动生成时序特征)、TSFresh(时间序列特征库)
- 可视化工具:Pandas Profiling(一键生成数据报告)、Seaborn(特征分布可视化)
- 高效编码库:Category Encoders(支持30+类别编码方法)
六、特征工程总结
特征工程 = 数据清洗(去杂质) + 特征变换(易消化) + 特征构造(加营养) + 特征选择(挑精华)。
七、降维处理与PCA解释
7.1. 什么是降维?
降维 就像整理你的衣柜:
- 原始状态:衣柜里堆满衣服(高维数据),包含衬衫、裤子、帽子、围巾等,但很多衣服可能重复或很少穿。
- 降维后:保留常穿的几套核心搭配(关键特征),扔掉不常用的单品(冗余特征),让衣柜更简洁、易管理。
PCA(主成分分析) 就是最常用的"整理术",它通过数学方法,从高维数据中提取出最关键的信息,转化为少数几个"核心维度"(主成分),同时尽量保留原始数据的主要特征。
7.2. 为什么要降维?
问题场景 | 降维的作用 | 类比解释 |
---|---|---|
维度灾难 | 高维数据稀疏,模型难以学习有效规律 | 在1000平米的空房间找一颗绿豆(高维难定位)→ 缩小到10平米的盒子(低维易搜索) |
计算效率低 | 减少数据量,提升训练速度 | 从100本厚书中提炼10页精华,阅读更快 |
可视化困难 | 将数据压缩到2D/3D便于展示 | 把全球气候数据画成温度-湿度二维图 |
去除噪声和冗余 | 保留主要信息,提升模型鲁棒性 | 在嘈杂的派对上专注听对话(过滤背景音乐) |
想象你要描述一个人的外貌:
- 原始维度:身高、体重、头发颜色、鞋码、瞳孔颜色、鼻梁高度...(共20个特征)
- PCA处理 :
- 找核心特征:发现"身高"和"体重"组合后,能解释80%的外貌差异。
- 合成新维度:生成"体型指数" = 身高×0.7 + 体重×0.3(这就是第一主成分)。
- 继续提炼:再生成"面部特征" = 瞳孔颜色×0.5 + 鼻梁高度×0.5(第二主成分)。
- 结果:用2个新维度(体型指数+面部特征)代替原来的20个维度,且保留了大部分关键信息。
7.3. PCA的实际应用场景
领域 | 具体应用 | 降维价值 |
---|---|---|
图像处理 | 人脸识别(将像素压缩为特征脸) | 从1000维像素 → 50维特征脸,提速100倍 |
自然语言处理 | 文本主题提取(TF-IDF降维) | 从1万维词向量 → 100维主题向量,降低计算量 |
金融风控 | 用户信用评分(合并收入、负债等指标) | 从20个指标 → 3个核心因子,提升模型可解释性 |
基因分析 | 基因序列关键片段提取 | 从百万级基因位点 → 百维主成分,加速分析 |
7.4. PCA的优缺点
优点 | 缺点 |
---|---|
无需标签数据(属于无监督学习) | 只适用于线性关系,对非线性数据效果差 |
减少噪声干扰,提升模型泛化能力 | 降维后的特征缺乏直观解释性 |
计算效率高,适合大规模数据 | 方差小的成分可能包含重要信息,需谨慎丢弃 |
7.5. 如何选择降维维度?
-
方差解释率 :通常保留累计方差>85%的主成分。
pythonfrom sklearn.decomposition import PCA pca = PCA(n_components=0.85) # 保留累计方差85%的主成分 X_pca = pca.fit_transform(X)
7.6. 其他降维方法对比
方法 | 特点 | 适用场景 |
---|---|---|
t-SNE | 保持局部结构,适合可视化 | 高维数据聚类结果展示 |
LDA | 有监督降维,最大化类别差异 | 分类任务的特征预处理 |
UMAP | 保留全局和局部结构,速度快 | 大规模高维数据(如单细胞测序) |
7.7. 降维处理总结
- PCA是什么:一种通过提取"核心特征组合"来压缩数据维度的数学工具。
- 为什么需要降维:解决维度灾难、提升计算效率、去除噪声、便于可视化。
- 关键建议 :
- 对线性关系主导的数据优先用PCA。
- 降维前需标准化数据(避免量纲影响)。
- 保留主成分时需平衡信息损失与效率。
就像旅行时只带必需品能让行程更轻松,合理降维能让数据更"轻装上阵",帮助模型更高效地学习规律。