作者:陈颖祥、杨子晗

编译:AI有道

经过数据预处理和特征选择,我们已经生成了一个很好的特征子集。但是有时该子集可能仍然包含过多特征,导致需要花费太多的计算能力用以训练模型。在这种情况下,我们可以使用降维技术进一步压缩特征子集。但这可能会降低模型性能。

同时,如果我们没有太多时间进行特征选择,我们也可以在数据预处理之后直接应用降维方法。我们可以使用降维算法来压缩原始特征空间直接生成特征子集。

具体来说,我们将分别介绍PCA和LDA(线性判别分析)。

项目地址:

https://github.com/YC-Coder-Chen/feature-engineering-handbook/blob/master/%E4%B8%AD%E6%96%87%E7%89%88.md

本文将介绍特征工程中的特征降维。

目录:

1.1 Unsupervised Methods 非监督方法

1.1.1 PCA (Principal Components Analysis) 主成分分析

主成分分析(PCA)是一种无监督机器学习模型,其目标为利用线性变换将原始特征投影为一系列线性不相关的单位向量,而同时保留尽可能多的信息(方差)。您可以从我们在Github中编写的repo中查看更多数学细节。

https://github.com/YC-Coder-Chen/Unsupervised-Notes/blob/master/PCA.md

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]
# 转换后训练集和测试集有相同的特征数
# 可视化 所解释的方差与选取的主成分数目之间的关系import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
%matplotlib inlineplt.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 Supervised Methods 监督方法

1.2.1 LDA (Linear Discriminant Analysis) 线性判别分析

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

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

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 <= min(n_classes - 1, n_features)compressor.fit(standardized_train, train_y)  # 在训练集上训练
transformed_trainset = compressor.transform(standardized_train) # 转换训练集 (20000,2)
transformed_testset = compressor.transform(standardized_test) # 转换测试集
assert transformed_trainset.shape[1] == transformed_testset.shape[1]
# 转换后训练集和测试集有相同的特征数
# 可视化 所解释的方差与选取的特征数目之间的关系
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://github.com/YC-Coder-Chen/feature-engineering-handbook/blob/master/%E4%B8%AD%E6%96%87%E7%89%88/3.%20%E7%89%B9%E5%BE%81%E9%99%8D%E7%BB%B4.ipynb

至此,基于 Jupyter 的特征工程专栏已全部更新完毕,历史文章汇总如下:

专栏 | 基于 Jupyter 的特征工程手册:数据预处理(一)

专栏 | 基于 Jupyter 的特征工程手册:数据预处理(二)

专栏 | 基于 Jupyter 的特征工程手册:数据预处理(三)

专栏 | 基于 Jupyter 的特征工程手册:数据预处理(四)

专栏 | 基于 Jupyter 的特征工程手册:特征选择(一)

专栏 | 基于 Jupyter 的特征工程手册:特征选择(二)

专栏 | 基于 Jupyter 的特征工程手册:特征选择(三)

专栏 | 基于 Jupyter 的特征工程手册:特征选择(四)

专栏 | 基于 Jupyter 的特征工程手册:特征选择(五)


推荐阅读

(点击标题可跳转阅读)

干货 | 公众号历史文章精选

我的深度学习入门路线

我的机器学习入门路线图

算法工程师必备

AI有道年度技术文章电子版PDF来啦!

扫描下方二维码,添加 AI有道小助手微信,可申请入群,并获得2020完整技术文章合集PDF(一定要备注:入群 + 地点 + 学校/公司。例如:入群+上海+复旦

长按扫码,申请入群

(添加人数较多,请耐心等待)

最新 AI 干货,我在看 

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

  1. 专栏 | 基于 Jupyter 的特征工程手册:数据预处理(三)

    作者:陈颖祥.杨子晗 编译:AI有道 基于 Jupyter 的特征工程手册:数据预处理的上一篇: 专栏 | 基于 Jupyter 的特征工程手册:数据预处理(一) 专栏 | 基于 Jupyter 的特 ...

  2. 专栏 | 基于 Jupyter 的特征工程手册:数据预处理(二)

    作者:陈颖祥.杨子晗 编译:AI有道 基于 Jupyter 的特征工程手册:数据预处理的上一篇: 专栏 | 基于 Jupyter 的特征工程手册:数据预处理(一) 项目地址: https://gith ...

  3. 使用jupyter计算正态分布_专栏 | 基于 Jupyter 的特征工程手册:数据预处理(三)...

    红色石头的个人网站: 红色石头的个人博客-机器学习.深度学习之路​www.redstonewill.com 基于 Jupyter 的特征工程手册:数据预处理的上一篇: 专栏 | 基于 Jupyter ...

  4. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(五)

    作者:陈颖祥.杨子晗 编译:AI有道 数据预处理后,我们生成了大量的新变量(比如独热编码生成了大量仅包含0或1的变量).但实际上,部分新生成的变量可能是多余:一方面它们本身不一定包含有用的信息,故无法 ...

  5. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(四)

    作者:陈颖祥.杨子晗 编译:AI有道 数据预处理后,我们生成了大量的新变量(比如独热编码生成了大量仅包含0或1的变量).但实际上,部分新生成的变量可能是多余:一方面它们本身不一定包含有用的信息,故无法 ...

  6. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(三)

    作者:陈颖祥.杨子晗 编译:AI有道 数据预处理后,我们生成了大量的新变量(比如独热编码生成了大量仅包含0或1的变量).但实际上,部分新生成的变量可能是多余:一方面它们本身不一定包含有用的信息,故无法 ...

  7. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(二)

    作者:陈颖祥.杨子晗 编译:AI有道 数据预处理后,我们生成了大量的新变量(比如独热编码生成了大量仅包含0或1的变量).但实际上,部分新生成的变量可能是多余:一方面它们本身不一定包含有用的信息,故无法 ...

  8. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(一)

    作者:陈颖祥.杨子晗 编译:AI有道 数据预处理后,我们生成了大量的新变量(比如独热编码生成了大量仅包含0或1的变量).但实际上,部分新生成的变量可能是多余:一方面它们本身不一定包含有用的信息,故无法 ...

  9. AI基础:特征工程-文本特征处理

    0.导语 特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用. 在此之前,我已经写了以下几篇AI基础的快速入门,本篇文章讲解特征工程基础第三部 ...

最新文章

  1. C/Cpp / STL / map 的 key 为自定义的 struct 或者 class 时,有什么注意事项?
  2. Codeforces Round #703 (Div. 2) B.Eastern Exhibition 中位数结论
  3. JS工具类——Select操作类
  4. .net发送带附件邮件
  5. Linux 下的 sleep
  6. linux系统环境与文件权限
  7. Webpack4 学习笔记六 多页面配置和devtool
  8. python第二十二课——list函数
  9. 人体全身骨骼神经分布图,人体骨骼神经系统图片
  10. 第二个项目---EMOS企业在线办公小程序
  11. 用c语言莲花,用荷花为寓意的网名-网名搜索
  12. 旅行商问题和背包问题
  13. 算法系列之算法学习书籍以及资料推荐
  14. 字符串的常见方法总结
  15. 吐血整理 python最全习题100道(含答案)持续更新题目,建议收藏!
  16. 阿里云安全组是什么?如何配置安全组(图文教程)?
  17. Android 极光推送 自定义通知铃声
  18. kali 2.0 安装搜狗输入法 troubleshooting
  19. 创客集结号:3D打印技术原理
  20. Black Jack

热门文章

  1. 算法学习之路|最小生成树—kruskal
  2. 积跬步,聚小流-------一个登录中的知识点
  3. Java剖析工具JProfiler入门使用教程:离线剖析和触发器
  4. 代码质量随想录(五)注得多不如注得巧
  5. Java中类、方法声明为静态的含义
  6. hdu 2881(简单dp)
  7. SAPI(PHP常见的四种运行模式)
  8. 集合中存储自定义对象源代码
  9. 如何在RCP程序中添加一个banner栏
  10. hibernate主配置文件的配置