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

栏目: IT技术 · 发布时间: 4年前

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

作者:陈颖祥、杨子晗

编译:AI有道编译:AI有道

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

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

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

项目地址:

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

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

目录:

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

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 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%的方差

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

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 的特征工程手册:特征降维

中文版 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有道(ID: redstonewill),欢迎关注!

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图解Java多线程设计模式

图解Java多线程设计模式

[日] 结城浩 / 侯振龙、杨文轩 / 人民邮电出版社 / 2017-8 / 89.00元

本书通过具体的Java 程序,以浅显易懂的语言逐一说明了多线程和并发处理中常用的12 种设计模式。内容涉及线程的基础知识、线程的启动与终止、线程间的互斥处理与协作、线程的有效应用、线程的数量管理以及性能优化的注意事项等。此外,还介绍了一些多线程编程时容易出现的失误,以及多线程程序的阅读技巧等。在讲解过程中,不仅以图配文,理论结合实例,而且提供了运用模式解决具体问题的练习题和答案,帮助读者加深对多线......一起来看看 《图解Java多线程设计模式》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具