【完结篇】专栏 | 基于 Jupyter 的特征工程手册:特征降维

发布时间 - 2025-07-15 00:00:00    点击率:

经过数据预处理和特征选择,我们已经成功生成了一组优质的特征子集。然而,这组子集可能仍然包含过多的特征,导致训练模型时需要消耗过多的计算资源。在这种情况下,我们可以运用降维技术进一步压缩特征子集,但这可能会影响模型的性能。

与此同时,如果时间有限,我们也可以在数据预处理后直接采用降维方法,将原始特征空间压缩成新的特征子集。

在本文中,我们将详细介绍两种常用的降维技术:PCA(主成分分析)和LDA(线性判别分析)。

项目地址:

https://www./link/e75b50aaf9e8125e58481a0cff44b539

本文将探讨特征工程中的特征降维技术。

目录:

1.1 非监督方法

1.1.1 主成分分析(PCA)

主成分分析(PCA)是一种无监督的机器学习技术,其目的是通过线性变换将原始特征投影到一系列线性无关的单位向量上,同时尽可能保留原始数据的信息(方差)。更多数学细节可在我们Github上的repo中查看。

https://www./link/36f3776e5d1d89eed81547772a9d6a4f

代码语言:javascript代码运行次数:0运行复制```javascript import numpy as np import pandas as pd from sklearn.decomposition import PCA

直接载入数据集

from sklearn.datasets import fetch_california_housing dataset = fetch_california_housing() X, y = dataset.data, dataset.target # 使用 california_housing 数据集来演示

选择前15000个观测点作为训练集

剩下的作为测试集

train_set = X[0:15000,:] test_set = X[15000:,] train_y = y[0:15000]

在使用主成分分析前,我们需要先对变量进行缩放操作,否则PCA将会赋予高尺度的特征过多的权重

from sklearn.preprocessing import StandardScaler model = StandardScaler() model.fit(train_set) standardized_train = model.transform(train_set) standardized_test = model.transform(test_set)

开始压缩特征

compressor = PCA(n_components=0.9) # 将n_components设置为0.9 =>

即要求我们从所有主成分中选取的输出主成分至少能保留原特征中90%的方差

我们也可以通过设置n_components参数为整数直接控制输出的变量数目

compressor.fit(standardized_train) # 在训练集上训练 transformed_trainset = compressor.transform(standardized_train) # 转换训练集 (20000,5)

即我们从8个主成分中选取了前5个主成分,而这前5个主成分可以保证保留原特征中90%的方差

transformed_testset = compressor.transform(standardized_test) # 转换测试集 assert transformed_trainset.shape[1] == transformed_testset.shape[1] # 转换后训练集和测试集有相同的特征数

代码语言:javascript代码运行次数:0运行复制```javascript
# 可视化 所解释的方差与选取的主成分数目之间的关系
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
%matplotlib inline
plt.plot(np.array(range(len(compressor.explained_variance_ratio_))) + 1,
         np.cumsum(compressor.explained_variance_ratio_))
plt.xlabel('选取的主成分数目')
plt.ylabel('累计所解释的方差累')
plt.show(); # 前5个主成分可以保证保留原特征中90%的方差

1.2 监督方法

1.2.1 线性判别分析(LDA)

与PCA不同,线性判别分析(LDA)是一种有监督的机器学习技术,其目标是找到一个特征子集,使得类别之间的线性可分性最大化,即希望同一类别数据的投影点尽可能接近,而不同类别数据的类别中心之间的距离尽可能大。LDA主要用于分类问题,并假设各类别的样本数据符合高斯分布且具有相同的协方差矩阵。

更多关于LDA原理的详细信息可以在sklearn的官方网站上找到。LDA会将原始变量压缩为(K-1)个,其中K是目标变量的类别数。但在sklearn中,通过将PCA的思想整合到LDA中,可以进一步压缩变量。

代码语言:javascript代码运行次数:0运行复制```javascript import numpy as np import pandas as pd from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

LDA仅适用于分类问题

载入数据集

from sklearn.datasets import load_iris iris = load_iris() X, y = iris.data, iris.target

iris 数据集使用前需要被打乱顺序

np.random.seed(1234) idx = np.random.permutation(len(X)) X = X[idx] y = y[idx]

选择前100个观测点作为训练集

剩下的50个观测点测试集

train_set = X[0:100,:] test_set = X[100:,] train_y = y[0:100] test_y = y[100:,]

在使用主成分分析前,我们需要先对变量进行缩放操作

因为LDA假定数据服从正态分布

from sklearn.preprocessing import StandardScaler # 我们也可以采用幂次变换 model = StandardScaler() model.fit(train_set) standardized_train = model.transform(train_set) standardized_test = model.transform(test_set)

开始压缩特征

compressor = LDA(n_components=2) # 将n_components设置为2

n_components

代码语言:javascript代码运行次数:0运行复制```javascript
# 可视化 所解释的方差与选取的特征数目之间的关系
import matplotlib.pyplot as plt
plt.plot(np.array(range(len(compressor.explained_variance_ratio_))) + 1,
         np.cumsum(compressor.explained_variance_ratio_))
plt.xlabel('选取的特征数目')
plt.ylabel('累计所解释的方差累')
plt.show(); # LDA将原始的4个变量压缩为2个,这2个变量即能解释100%的方差

中文版 Jupyter 地址:

https://www./link/3aed873670ec4df5ec69019f310a2d19


# git  # ai  # JavaScript  # numpy  # pandas  # len  # transform  # github  # jupyter  # sklearn  # https  # 是一种  # 设置为  # 观测点  # 的是  # 正态分布  # 将会  # 两种  # 但在  # 适用于  # 我们可以 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 郑州企业网站制作公司,郑州招聘网站有哪些?  微信小程序 wx.uploadFile无法上传解决办法  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Python文件异常处理策略_健壮性说明【指导】  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何实现javascript表单验证_正则表达式有哪些实用技巧  js实现点击每个li节点,都弹出其文本值及修改  详解Android——蓝牙技术 带你实现终端间数据传输  Python文件操作最佳实践_稳定性说明【指导】  清除minerd进程的简单方法  中山网站推广排名,中山信息港登录入口?  如何快速搭建虚拟主机网站?新手必看指南  js代码实现下拉菜单【推荐】  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  如何在腾讯云服务器上快速搭建个人网站?  ,网页ppt怎么弄成自己的ppt?  Laravel如何处理异常和错误?(Handler示例)  EditPlus 正则表达式 实战(3)  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  黑客入侵网站服务器的常见手法有哪些?  Python图片处理进阶教程_Pillow滤镜与图像增强  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel如何集成Inertia.js与Vue/React?(安装配置)  JS经典正则表达式笔试题汇总  如何在景安云服务器上绑定域名并配置虚拟主机?  Laravel中的Facade(门面)到底是什么原理  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  浅谈Javascript中的Label语句  浅谈redis在项目中的应用  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  PHP 500报错的快速解决方法  Laravel怎么在Controller之外的地方验证数据  Laravel如何配置Horizon来管理队列?(安装和使用)  如何快速搭建个人网站并优化SEO?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  详解MySQL数据库的安装与密码配置