当前位置: 首页 > news >正文

机器学习特征工程详解:特征选择与降维(PCA)

在这里插入图片描述

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#,Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用,熟悉DICOM医学影像及DICOM协议,业余时间自学JavaScript,Vue,qt,python等,具备多种混合语言开发能力。撰写博客分享知识,致力于帮助编程爱好者共同进步。欢迎关注、交流及合作,提供技术支持与解决方案。\n技术合作请加本人wx(注明来自csdn):xt20160813


机器学习特征工程详解:特征选择与降维(PCA)

特征工程是机器学习的核心环节,通过将原始数据转化为更适合模型的特征,提升模型性能、降低计算成本、增强可解释性。本文详细讲解特征选择降维(以PCA为主),包括原理、数学推导、Python实现及在医学影像领域的应用。
在这里插入图片描述

1. 特征工程概述

特征工程是将原始数据转化为适合机器学习模型输入的过程,旨在提取更有意义的特征。其主要目标包括:

  • 提升模型性能:通过选择或构造高质量特征,改善预测准确率。
  • 降低计算成本:减少特征维度,加快训练和推理速度。
  • 增强可解释性:聚焦关键特征,便于理解模型行为。

特征工程包括以下子任务:

  • 特征选择:从现有特征中挑选最重要子集,剔除冗余或无关特征。
  • 降维:将高维特征映射到低维空间,保留关键信息(如PCA)。
  • 特征构造:创建新特征,如多项式特征或交互项。
  • 特征提取:从复杂数据(如图像、文本)中提取特征。

医学影像领域(如肿瘤分类),特征工程尤为重要。例如,从X光片或MRI图像中提取纹理、形状特征,并选择对肿瘤分类最重要的特征,可显著提升AdaBoost或XGBoost模型的准确性和效率。


2. 特征选择

2.1 原理

特征选择的目的是从高维特征集中选择一个子集,保留对预测目标最有用的特征,剔除冗余或无关特征。其优势包括:

  • 降低过拟合:去除噪声特征,减少模型对无关变量的依赖。
  • 提高效率:减少特征数量,降低计算复杂度。
  • 提升可解释性:简化模型,突出关键特征。

特征选择方法分为三类:

  1. 过滤法(Filter Method):基于统计指标(如方差、相关系数)评估特征,不依赖具体模型。
  2. 包裹法(Wrapper Method):使用特定模型(如递归特征消除RFE)评估特征子集的性能。
  3. 嵌入法(Embedded Method):在模型训练过程中进行特征选择(如Lasso回归的L1正则化)。
数学原理

以下以过滤法和嵌入法为例,介绍核心数学原理:

  • 方差选择(过滤法)
    • 对于数据集 X∈Rn×mX \in \mathbb{R}^{n \times m}XRn×m nnn个样本,mmm个特征),特征XiX_iXi的方差为:
      Var(Xi)=1n∑j=1n(Xij−Xˉi)2 \text{Var}(X_i) = \frac{1}{n} \sum_{j=1}^n (X_{ij} - \bar{X}_i)^2 Var(Xi)=n1j=1n(XijXˉi)2
      其中Xˉi\bar{X}_iXˉi 是特征XiX_iXi 的均值。方差小的特征(如接近常数)信息量低,可剔除。
  • 相关系数(过滤法)
    • 皮尔逊相关系数衡量特征XiX_iXi 与目标变量 ( y ) 的线性相关性:
      r=∑i=1n(Xi−Xˉ)(yi−yˉ)∑i=1n(Xi−Xˉ)2∑i=1n(yi−yˉ)2 r = \frac{\sum_{i=1}^n (X_i - \bar{X})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^n (X_i - \bar{X})^2 \sum_{i=1}^n (y_i - \bar{y})^2}} r=i=1n(XiXˉ)2i=1n(yiyˉ)2i=1n(XiXˉ)(yiyˉ)
      选择∣r∣|r|r高的特征,表示与目标变量相关性强。
  • 递归特征消除(RFE,包裹法)
    • 迭代训练模型(如AdaBoost),根据特征重要性(如权重或增益)移除最不重要特征,直至达到指定特征数量。
  • Lasso(嵌入法)
    • 通过在损失函数中加入L1正则化项,迫使不重要特征的权重为0:
      Loss=1n∑i=1n(yi−y^i)2+λ∑j=1m∣βj∣ \text{Loss} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^m |\beta_j| Loss=n1i=1n(yiy^i)2+λj=1mβj
      其中βj\beta_jβj是特征权重,λ\lambdaλ 控制正则化强度,非零权重的特征被保留。

2.2 流程图

以下是特征选择的Mermaid流程图:

过滤法
包裹法
嵌入法
输入数据集: X, y
选择方法: 过滤法, 包裹法, 嵌入法
计算统计指标: 方差, 相关系数
选择高分特征
初始化特征集
训练模型: 评估子集性能
移除低重要性特征
满足停止条件?
训练正则化模型: Lasso
选择非零权重特征
输出: 选择特征子集

说明

  • 标签使用中文和简单ASCII字符(如“方差”代替数学符号),用双引号包裹,确保解析安全。
  • 流程覆盖过滤法、包裹法、嵌入法,清晰展示步骤。

2.3 Python实现

以下是特征选择的Python代码,结合过滤法(方差选择、相关系数)、包裹法(RFE)和嵌入法(Lasso),以乳腺癌数据集为例,适用于医学影像分类:

import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import VarianceThreshold, SelectKBest, pearsonr, RFE
from sklearn.linear_model import LogisticRegression, Lasso
from sklearn.preprocessing import StandardScaler# 加载乳腺癌数据集(569样本,30特征,预测良性/恶性肿瘤)
data = load_breast_cancer()
X, y = data.data, data.target
feature_names = data.feature_names# 1. 过滤法:方差选择
# 移除方差低于0.8的特征(低方差特征信息量少)
selector_var = VarianceThreshold(threshold=0.8)
X_var = selector_var.fit_transform(X)
selected_features_var = feature_names[selector_var.get_support()]
print("方差选择保留的特征:", selected_features_var)# 2. 过滤法:相关系数选择
# 选择与目标变量相关系数最高的5个特征
def pearsonr_score(X, y, k=5):scores = [abs(pearsonr(X[:, i], y)[0]) for i in range(X.shape[1])]indices = np.argsort(scores)[-k:]  # 按相关系数降序排序,选择前k个return indicesselector_corr = SelectKBest(score_func=lambda X, y: pearsonr_score(X, y, k=5), k=5)
X_corr = selector_corr.fit_transform(X, y)
selected_features_corr = feature_names[selector_corr.get_support()]
print("相关系数选择保留的特征:", selected_features_corr)# 3. 包裹法:递归特征消除(RFE)
# 使用逻辑回归作为基模型,选择5个最重要特征
model = LogisticRegression(max_iter=1000)
selector_rfe = RFE(model, n_features_to_select=5)
X_rfe = selector_rfe.fit_transform(X, y)
selected_features_rfe = feature_names[selector_rfe.get_support()]
print("RFE选择保留的特征:", selected_features_rfe)# 4. 嵌入法:Lasso
# 标准化数据后,使用Lasso回归选择非零权重特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
lasso = Lasso(alpha=0.01)  # alpha控制正则化强度
lasso.fit(X_scaled, y)
selected_features_lasso = feature_names[lasso.coef_ != 0]
print("Lasso选择保留的特征:", selected_features_lasso)

代码说明

  • 数据集:scikit-learn的乳腺癌数据集,包含569个样本和30个特征(如肿瘤半径、纹理),目标是预测良性/恶性肿瘤。
  • 方差选择:移除方差低于0.8的特征(如接近常数的特征)。
  • 相关系数:选择与目标变量相关性最高的5个特征。
  • RFE:以逻辑回归为基模型,递归移除最不重要特征。
  • Lasso:通过L1正则化选择重要特征,标准化确保各特征量纲一致。
  • 输出示例
    方差选择保留的特征: ['mean radius' 'mean texture' ...]
    相关系数选择保留的特征: ['mean perimeter' 'worst perimeter' ...]
    RFE选择保留的特征: ['mean radius' 'mean concavity' ...]
    Lasso选择保留的特征: ['mean radius' 'worst texture' ...]
    

2.4 医学影像应用

  • 场景:乳腺癌X光片分类,特征包括纹理(灰度共生矩阵GLCM)、形状(肿瘤边界圆形度)、强度(像素均值)。
  • 过滤法:选择方差高的纹理特征,剔除冗余像素值,减少噪声。
  • 包裹法:使用AdaBoost结合RFE,保留对恶性肿瘤分类最重要的特征(如肿瘤边界特征)。
  • 嵌入法:Lasso选择与恶性肿瘤强相关的特征,简化模型。
  • 效果:特征数量从100减少到10,AdaBoost训练时间缩短50%,分类准确率从85%提升至90%。

3. 降维(以PCA为主)

3.1 原理

**主成分分析(PCA)**是一种线性降维方法,通过正交变换将高维特征映射到低维空间,保留数据最大方差的方向。其目标是:

  • 降低维度:减少特征数量,降低计算成本。
  • 保留信息:通过主成分捕捉数据的主要变异。
  • 减少噪声:去除低方差维度,提升模型鲁棒性。
数学原理

对于数据集 X∈Rn×mX \in \mathbb{R}^{n \times m}XRn×m nnn 个样本,mmm 个特征),PCA步骤如下:

  1. 中心化
    • 计算特征均值:Xˉj=1n∑i=1nXij\bar{X}_j = \frac{1}{n} \sum_{i=1}^n X_{ij}Xˉj=n1i=1nXij
    • 中心化数据:Xcentered=X−XˉX_{\text{centered}} = X - \bar{X}Xcentered=XXˉ
  2. 协方差矩阵
    • 计算:C=1n−1XcenteredTXcenteredC = \frac{1}{n-1} X_{\text{centered}}^T X_{\text{centered}}C=n11XcenteredTXcentered
  3. 特征值分解
    • 分解协方差矩阵:C=VΛVTC = V \Lambda V^TC=VΛVT,其中 VVV 是特征向量矩阵(主成分),Λ\LambdaΛ 是特征值对角矩阵。
    • 按特征值大小排序,选择前 kkk 个特征向量。
  4. 投影
    • 将数据投影到主成分:Z=XcenteredVkZ = X_{\text{centered}} V_kZ=XcenteredVk,其中VkV_kVk 是前kkk 个特征向量,Z∈Rn×kZ \in \mathbb{R}^{n \times k}ZRn×k是降维后数据。
解释方差
  • 特征值λi\lambda_iλi表示第iii个主成分的方差贡献。
  • 解释方差比例:λi∑λj\frac{\lambda_i}{\sum \lambda_j}λjλi
  • 选择kkk 使累计解释方差达到目标(如90%)。

3.2 流程图

以下是PCA的Mermaid流程图:

输入数据集: X
中心化: X = X - 均值(X)
计算协方差矩阵
特征值分解
选择前k个主成分
投影: Z = X * V_k
输出: 降维数据集 Z

说明

  • 标签使用中文和简单ASCII字符(如“均值”代替数学符号),用双引号包裹。

3.3 Python实现

以下是PCA的Python代码,以乳腺癌数据集为例,结合AdaBoost进行分类:

import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt# 加载乳腺癌数据集(569样本,30特征)
data = load_breast_cancer()
X, y = data.data, data.target
feature_names = data.feature_names# 标准化数据(PCA要求均值为0,方差为1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 应用PCA,降维到2维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)# 输出解释方差比例
print("解释方差比例:", pca.explained_variance_ratio_)
print("累计解释方差:", sum(pca.explained_variance_ratio_))# 可视化PCA结果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', alpha=0.5)
plt.xlabel('主成分 1')
plt.ylabel('主成分 2')
plt.title('乳腺癌数据集的PCA降维')
plt.show()# 使用AdaBoost在降维数据上分类
clf = AdaBoostClassifier(n_estimators=50, random_state=42)
clf.fit(X_pca, y)
y_pred = clf.predict(X_pca)
print("AdaBoost在PCA降维数据上的准确率:", accuracy_score(y, y_pred))# 绘制累计解释方差图,选择合适的k
pca_full = PCA().fit(X_scaled)
plt.plot(np.cumsum(pca_full.explained_variance_ratio_))
plt.xlabel('主成分数量')
plt.ylabel('累计解释方差')
plt.title('PCA累计解释方差')
plt.show()

代码说明

  • 数据集:乳腺癌数据集,目标是区分良性/恶性肿瘤。
  • 标准化:PCA前必须标准化数据,确保各特征贡献均等。
  • 降维:将30维特征降到2维,便于可视化和计算。
  • 可视化:2D散点图展示主成分上的样本分布,颜色区分良性/恶性。
  • AdaBoost:在降维数据上训练,验证PCA效果。
  • 累计解释方差图:帮助选择合适的 ( k )(主成分数量)。
  • 输出示例
    解释方差比例: [0.4427 0.1897]
    累计解释方差: 0.6324
    AdaBoost在PCA降维数据上的准确率: 0.95
    

3.4 医学影像应用

  • 场景:MRI肿瘤分类,原始数据为高维像素特征(如1000x1000图像)。
  • PCA应用:将1000维特征降到5维主成分,保留95%方差,捕捉肿瘤纹理、形状等关键模式。
  • 效果:减少内存占用,加速XGBoost训练,降低噪声影响,分类准确率提升(如从88%到92%)。
  • 示例:在肺癌结节检测中,PCA降维后,XGBoost训练时间从1小时缩短到10分钟。

4. 结合AdaBoost和XGBoost

4.1 AdaBoost与特征工程

  • 特征选择:使用RFE结合AdaBoost,选择对肿瘤分类最重要的特征(如肿瘤边界特征)。
  • PCA:将高维特征降维后,输入AdaBoost,减少计算成本。
  • 流程图
初始化权重: wi = 1/N
迭代: m=1到M
训练弱学习器: Gm
计算错误率: err
计算权重: am
更新权重: wi
归一化权重
达到M次迭代?
组合: G = sign(total am Gm)
输出预测

4.2 XGBoost与特征工程

  • 特征选择:利用XGBoost内置的特征重要性评分,选择关键特征。
  • PCA:降维后输入XGBoost,加速训练并防止过拟合。
  • 流程图
初始化模型: F0 = 0
迭代: m=1到M
计算梯度和Hessian
构建决策树: Tm
计算树权重: wm
更新模型: Fm = Fm-1 + wm Tm
达到M次迭代?
输出模型: F = F0 + total wm Tm
输出预测

5. 可视化辅助

5.1 PCA累计解释方差图

# 绘制累计解释方差图,选择合适的k
pca_full = PCA().fit(X_scaled)
plt.plot(np.cumsum(pca_full.explained_variance_ratio_))
plt.xlabel('主成分数量')
plt.ylabel('累计解释方差')
plt.title('PCA累计解释方差')
plt.show()

说明:该图展示主成分数量与累计解释方差的关系,帮助选择合适的 kkk。例如,2个主成分可能解释63%方差,5个主成分可能解释90%。

5.2 XGBoost特征重要性图

from xgboost import XGBClassifier
import matplotlib.pyplot as plt# 训练XGBoost,获取特征重要性
xgb = XGBClassifier(random_state=42)
xgb.fit(X_scaled, y)
importances = xgb.feature_importances_
plt.barh(feature_names, importances)
plt.xlabel('重要性')
plt.title('XGBoost特征重要性')
plt.show()

说明:条形图展示各特征对XGBoost预测的贡献,例如肿瘤半径可能是最重要的特征。


6. 医学影像案例分析

  • 问题:在CT扫描中分类肺结节为良性或恶性。
  • 特征:纹理(灰度共生矩阵GLCM)、形状(圆形度)、强度(像素均值)。
  • 特征工程
    • 过滤法:选择高方差纹理特征,剔除冗余像素特征。
    • 包裹法:使用XGBoost结合RFE,选择前10个关键特征。
    • 嵌入法:Lasso回归选择5个与恶性结节强相关的特征。
    • PCA:将100维特征降到5维主成分,保留90%方差。
  • 模型:在选择或降维后的特征上训练AdaBoost/XGBoost。
  • 效果
    • 准确率从85%提升到92%。
    • 训练时间减少50%(如从1小时到30分钟)。
    • 模型更鲁棒,减少过拟合。

http://www.dtcms.com/a/299036.html

相关文章:

  • 好的编程语言设计是用简洁清晰的原语组合复杂功能
  • Java 问题排查之工具单
  • MCP协议深度解析:客户端-服务器架构的技术创新
  • 零基础 “入坑” Java--- 十四、【练习】图书小系统
  • 力扣---------238. 除自身以外数组的乘积
  • mysql group by 多个行转换为一个字段
  • Java动态调试技术原理
  • Oracle 11g RAC数据库实例重启的两种方式
  • 机器学习——随机森林算法分类问题案例解析(sklearn)
  • SpringMVC——建立连接
  • Python高级入门Day6
  • (React入门上手——指北指南学习(第一节)
  • Earth靶机攻略
  • 公域流量向私域流量转化策略研究——基于开源AI智能客服、AI智能名片与S2B2C商城小程序的融合应用
  • 分治算法 (Divide and Conquer)原理、及示例-JS版
  • 告别配置混乱!Spring Boot 中 Properties 与 YAML 的深度解析与最佳实践
  • C++查询mysql数据
  • linux下变更mysql的数据文件目录
  • CentOS 7 安装 MySQL 8.4.6(二进制包)指南
  • 基于MySQL实现基础图数据库
  • Day04–链表–24. 两两交换链表中的节点,19. 删除链表的倒数第 N 个结点,面试题 02.07. 链表相交,142. 环形链表 II
  • GMP模型
  • 背包问题及 LIS 优化
  • 口腔助手|口腔挂号预约小程序|基于微信小程序的口腔门诊预约系统的设计与实现(源码+数据库+文档)
  • vue子组件关闭自己的方式(事件触发)
  • 上证50指数分红和股指期货有什么关系?
  • MybatisPlus-18.插件功能-分页插件基本用法
  • Vue3 学习教程,从入门到精通,Vue3 样式绑定语法详解与案例(17)
  • 学习随想录-- web3学习入门计划
  • 【自动化运维神器Ansible】Ansible常用模块之File模块详解