用sklearn pca 特征向量的pca怎么看保留了多少信息

(window.slotbydup=window.slotbydup || []).push({
id: '2014386',
container: s,
size: '234,60',
display: 'inlay-fix'
&&|&&0次下载&&|&&总112页&&|
挖掘算法及Python实现
您的计算机尚未安装Flash,点击安装&
阅读已结束,如需下载到电脑,请使用积分()
下载:40积分
7人评价18页
0人评价53页
15人评价92页
0人评价20页
4人评价70页
所需积分:(友情提示:大部分文档均可免费预览!下载之前请务必先预览阅读,以免误下载造成积分浪费!)
(多个标签用逗号分隔)
文不对题,内容与标题介绍不符
广告内容或内容过于简单
文档乱码或无法正常显示
文档内容侵权
已存在相同文档
不属于经济管理类文档
源文档损坏或加密
若此文档涉嫌侵害了您的权利,请参照说明。
我要评价:
下载:40积分主成分分析(PCA)在R 及 Python中的实战指南
大数据文摘
大数据文摘
大数据文摘作品,转载要求见文末
编译团队|李小帅,姚佳灵
有太多不如没有!如果一个数据集有太多变量,会怎么样?这里有些可能的情况你也许会碰上——
1.你发现大部分变量是相关的。2.你失去耐心,决定在整个数据集上建模。这个模型返回很差的精度,于是你的感觉很糟糕。3.你变得优柔寡断,不知道该做什么。4.你开始思考一些策略方法来找出几个重要变量。
相信我,处理这样的情形不是像听上去那样难。统计技术,比如,因子分析,主成分分析有助于解决这样的困难。在本文中,我详细地解释了主成分分析的概念。我一直保持说明简要而详实。为了操作上的理解,我也演示了在R使用这个技术并带有解释。
要理解本文的内容,需要有统计学的知识。
&什么是主成分分析?
简而言之,主成分分析是一种从一个数据集的一大组可用变量中提取重要变量的方法。它从高维度数据集中提取出低维度特征变量集合,并尽可能多地捕捉到信息。变量越少,数据可视化也变得更有意义。处理3维或者更高维度的数据集时,主成分分析方法更有效。
它总是在一个对称相关或协方差矩阵上施行。这意味着矩阵应该是数值型的,并且有着标准化的数据。
让我们通过一个例子来理解:
假设我们有一个300(n) X 50(p)维度的数据集。n代表着样本集数量,p代表着预测值的数目。由于我们有个很大的p值,p = 50,因此,会有p(p-1)/2个散布图,也就是说,有可能超过1000个散布图需要分析变量间的关系。在这样的数据集中做探索分析是不是一件非常繁琐的事呀?
在这样的情况下,选取一个捕捉到尽可能多信息的预测值子集p(p&&50)是一个明晰的办法。接着在得到的低维度空间绘制观察结果。
下图显示了利用主成分分析从高维度(三维)数据到低维度(二维)数据的转换。请别忘了,每一个所得到的维度都是特征p的线性组合。
图片来源:nlpca
&什么是主成分?
主成分是数据集中的初始预测值规范化后的线性组合。在上图中,PC1和PC2便是主成分。假设我们有一个预测值集合:X¹,X²...,Xp
主成分可以写成:
Z¹ = Φ¹¹X¹ +&Φ²¹X² +&Φ³¹X³ + .... +Φp¹Xp
◇ Z¹是第一主成分
◇ Φp¹是构成第一主成分负载量(Φ¹, & & &Φ²…)的加载向量 & & &。该向量被限制成模长为1。这是因为加载向量的数值巨大的模也许会导致巨大的差异。它还定义了沿着数据变化最大的主成分(Z¹)的方向。这样一来,它使得在P维度空间中存在一条最接近n样本集的直线。拟合的程度由欧式距离平方均值来衡量。
◇ X¹..Xp&是规范化后的预测值。规范化后的预测值的均值为0、标准差为1。
第一主成分是在数据集中捕捉最大方差的初始预测变量的线性组合。它决定了数据中最高变异性的方向。在第一主成分中,捕捉到的变异性越大,成分捕捉到的信息就越多。没有比第一主成分有更高变异性的成分。
第一主成分形成一条最接近数据的直线,也就是说,它把数据点和该直线之间的距离平方和最小化了。
类似地,我们也能够计算第二主成分。
第二主成分(Z²)也是捕捉到数据集中剩余方差的线性组合,和第一主成分(Z¹)不相关。换句话说,第一主成分与第二主成分间的相关系数为0。它可以表示成:
Z² = Φ¹²X¹ + Φ²²X² + Φ³²X³ + .... + Φp2Xp
如果两个成分是不相关的,那么两者应该是正交的(见下图)。下图是在模拟数据上用两个预测值绘制的。需要注意的是,主成分的方向,正如预期的那样,是正交的。这表明在这两个主成分之间的相关系数为0。
所有接下来的主成分都跟从着相似的概念,即它们捕捉前一个主成分剩余的变化,并与之不相关。一般而言,对于n x p维度的数据,能够构建最小的主成分向量为(n-1, p)。
这些主成分的方向是以无监督的方式确定的,也即响应变量(Y)不是用来决定主成分方向的。因此,这是以无监督的方式。
注意:偏最小二乘法(Partial least square,简称PLS)是替代主成分分析的一种监督方法。偏最小二乘法分配较高的权重给与响应变量y具有强相关关系的变量,以此决定主成分。
&为什么变量规范化是必须的?
主成分是由原始预测数据规范化后提供的。这是因为原始预测数据可能具有不同的范围尺度。例如,想象一下这么一个数据集,在该数据集中存在很多变量的度量单位:加仑、公里、光年等等。可以肯定的是在这些变量中的方差范围会很大。
在没有规范化的变量上执行主成分分析会导致带有高方差变量近乎疯狂的大量的负荷。反过来,这将导致一个主成分依赖于具有高方差的变量。这不是我们所希望的。
如下图所示,主成分分析在一个数据集上执行了两次(带有未缩放和缩放的预测值)。该数据集有大约40个变量,正如你所见,第一主成分由变量Item_MRP所主导。同时,第二主成分由变量Item_Weight主导。这种主导普遍存在是因为变量有相关的高方差。当变量被缩放后,我们便能够在二维空间中更好地表示变量。
&在Python & R中应用&
&主成分分析方法&
(带有代码注解)
要选多少主成分?我可以深入研究理论,但更好是用编程实战来回答这一问题。
作为演示示例,我将使用来自BIg Mart Prediction Challenge上的数据。
请记住,主成分分析仅能应用于数值型数据,因此,如果数据集中存在分类变量,必须将其转换成数值型的。而且在应用这个技术前前,必须进行了基本的数据清理。让我们快点完成原始数据的加载和清理步骤:
& path &- &.../Data/Big_Mart_Sales&
#设定工作目录
& setwd(path)
#加载训练和测试文件
& train &- read.csv(&train_Big.csv&)
& test &- read.csv(&test_Big.csv&)
& test$Item_Outlet_Sales &- 1
#合并数据集
& combi &- rbind(train, test)
#用中位值替换缺失值
& combi$Item_Weight[is.na(combi$Item_Weight)] &- median(combi$Item_Weight, na.rm = TRUE)
#用中位值替换0
& combi$Item_Visibility &- ifelse(combi$Item_Visibility == 0, median(combi$Item_Visibility),&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& combi$Item_Visibility)
#找出模式并替换
& table(combi$Outlet_Size, combi$Outlet_Type)
& levels(combi$Outlet_Size)[1] &- &Other&
至此,我们已对缺失值做了替换处理。现在剩下的都是除去了依赖性(响应)变量和其它标识符变量(如果存在的话)。正如上面所讲,我们正在练习无监督学习技术,因此,响应变量必须除去。
#除去依赖性和标识符变量
& my_data &- subset(combi, select = -c(Item_Outlet_Sales, Item_Identifier,&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&Outlet_Identifier))
Let’s check the available variables ( a.k.a predictors) in the data set.
现在,检查一下数据集中的可用变量(也即预测值):
#检查可用变量
& colnames(my_data)
由于主成分分析作用于数值型变量上,让我们看看是否有不是数值型的变量。
#检查变量的类
& str(my_data)
'data.frame': 14204 obs. of 9 variables:
$ Item_Weight : num 9.3 5.92 17.5 19.2 8.93 ...
$ Item_Fat_Content : Factor w/ 5 levels &LF&,&low fat&,..: 3 5 3 5 3 5 5 3 5 5 ...
$ Item_Visibility : num 0.016 0.8 0.054 0.054 ...
$ Item_Type : Factor w/ 16 levels &Baking Goods&,..: 5 15 11 7 10 1 14 14 6 6 ...
$ Item_MRP : num 249.8 48.3 141.6 182.1 53.9 ...
$ Outlet_Establishment_Year: int 99 09 02 2007 ...
$ Outlet_Size : Factor w/ 4 levels &Other&,&High&,..: 3 3 3 1 2 3 2 3 1 1 ...
$ Outlet_Location_Type : Factor w/ 3 levels &Tier 1&,&Tier 2&,..: 1 3 1 3 3 3 3 3 2 2 ...
$ Outlet_Type : Factor w/ 4 levels &Grocery Store&,..: 2 3 2 1 2 3 2 4 2 2 ... -
可惜,9个变量中有6个本质上是分类变量。现在,我们得做些额外工作。我们将使用一位有效编码将分类变量转换成数值型。
& library(dummies)
#创建一个虚拟的数据帧
& new_my_data &- dummy.data.frame(my_data, names = c(&Item_Fat_Content&,&Item_Type&,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &Outlet_Establishment_Year&,&Outlet_Size&,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &Outlet_Location_Type&,&Outlet_Type&))
检查一下,现在我们是否有了一个整数值数据集,只要简单地写:
&#检查数据集
& str(new_my_data)
是的,现在数据类型全部为数值型的。现在我们能够继续工作,应用主成分分析了。
基本R函数prcomp()用来实施主成分分析。默认情况下,它让变量集中拥有等于0的均值。用上参数scale. = T,我们规范化变量使得标准偏差为1。
#主成分分析
& prin_comp &- prcomp(new_my_data, scale. = T)
& names(prin_comp)
[1] &sdev&&&&& &rotation& &center&&& &scale&&&& &x&
prcomp()函数形成5种实用操作:
1. 中心和规模是指在实施主成分分析前用于标准化变量的各均值和标准偏差
#输出变量的均值
prin_comp$center
#输出变量的标准偏差
prin_comp$scale
2.旋转措施提供主成分的负载。旋转矩阵的每一列包含主成分负载向量。这是我们应该感兴趣的最重要措施。
它返回44个主成分负载。正确吗?当然。在一个数据集中,主成分负载的最大值至少为(n-1, p)。下面我们看看前4个主成分和前5行。
& prin_comp$rotation[1:5,1:4]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& PC1&&&&&&&&&&& PC2&&&&&&&&&&& PC3&&&&&&&&&&&& PC4
Item_Weight&&&&&&&&&&&&&&& 0.&& -0.&& 0.&& 0.
Item_Fat_ContentLF&&&&&&& -0.&&& 0.& -0.& -0.
Item_Fat_Contentlow fat&& -0.&&& 0.& -0.& -0.
Item_Fat_ContentLow Fat&&& 0.&& -0.&& 0.&& 0.
Item_Fat_Contentreg&&&&&&& 0.&&& 0.&& 0.& -0.
3.为了计算主成分评价向量,我们不必将数据和负载相乘。相反,矩阵X具有14204 x 44 维度的主成分评价向量。
& dim(prin_comp$x)
[1] 14204&&& 44
让我们来绘制产生的主成分——
& biplot(prin_comp, scale = 0)
参数scale = 0确保上图中箭头的缩放代表负载。为了从上图中作出推断,关注图中的最末端(上、下、左、右)。
我们推断第一主成分与Outlet_TypeSupermarket、Outlet_Establishment_Year2007的量度对应。类似的,第二成分和Outlet_Location_TypeTier1、Outlet_Sizeother的量度对应。对应一个成分里的某个变量的精确量度,应该再看看旋转后的矩阵(如上)。
4.prcomp函数也提供了计算每一个主成分标准偏差的便利。sdev是指主成分标准偏差。
#计算每个主成分的标准偏差
& std_dev &- prin_comp$sdev
& pr_var &- std_dev^2
#查看前10个成分的方差
& pr_var[1:10]
[1] 4........256831
[9] 1..168101
我们的目标是寻找能够说明最大方差的成分,这是因为,我们想在使用这些成分时尽可能多地保留信息。因此,如果用来说明的方差越大,那么这些成分包含的信息也就越多。
为计算被每个主成分解释的方差的占比,我们简单地将该方差除以方差总和。结果如下:
#被解释的方差的占比
& prop_varex &- pr_var/sum(pr_var)
& prop_varex[1:20]
[1] 0......
[7] 0......
[13] 0......
如上结果显示,第一主成分能够说明10.3%的方差。第二成分能够说明7.3%的方差,第三成分说明了6.2%的方差等等。那么,对于建模阶段,我们究竟需要选用多少成分呢?
用碎石图可以解决上面的问题。碎石图用来访问成分或说明数据中最可变性的因素。它代表降序排列值。
& plot(prop_varex, xlab = &Principal Component&,
&&&&&&&&&&&& ylab = &Proportion of Variance Explained&,
&&&&&&&&&&&& type = &b&)
上图显示:约30个成分说明了数据集中98.4%的方差。换句话说,利用主成分分析算法,我们将预测值从44个降到30个,而不影响说明的方差。这就是主成分分析算法的强大之处。让我们通过绘制一个累计方差图做确认核查。它将向我们展示成分数量的清晰画面。
#cumulative scree plot
& plot(cumsum(prop_varex), xlab = &Principal Component&,
&&&&&&&&&&&&& ylab = &Cumulative Proportion of Variance Explained&,
&&&&&&&&&&&&& type = &b&)
上图显示,30个成分对方差的影响接近98%。因此,在这个案例中,我们选择30种成分(PC1到PC30),并且用在建模阶段。这个使得在训练集上实施主成分分析的步骤变得完整了。对于建模,我们将使用30个成分作为预测变量并按照正常的过程进行。
&用主成分分析成分预测建模&
我们在训练集上完成主成分计算之后,现在让我们理解利用这些成分在测试数据上做预测的过程。这个过程是简单的。就像我们已经在训练集上获得主成分分析成分那样,我们将在测试集上取另外一组成分。最后,我们训练模型。
但是,要理解几个要点:
我们不应该把训练集和测试集合在一起来一次性地获得整个数据的主成分分析成分。因为,由于测试数据会“泄露”到训练集中,这会违背整个概括假设。换句话说,测试数据集不再保持“没看见”的状态。最终,这会打击模型的泛化能力。
我们不应该在测试和训练数据集上分开进行主成分分析。因为,来自训练和测试的主成分的组合向量将有不同的方向(方差不同的缘故)。由于这个原因,我们最终会比较在落在不同轴上的数据。这样,来自训练和测试数据的结果向量应该有相同的轴。
&那么,我们应该做什么?
我们应该像我们在训练集上所做的一样,在测试集上做相同的转换,包括集中和度量特征。让我们在R中做一下:
#加上带主成分的训练集
& train.data &- data.frame(Item_Outlet_Sales = train$Item_Outlet_Sales, prin_comp$x)
#we are interested in first 30 PCAs
#我们对前30个主成分感兴趣
& train.data &- train.data[,1:31]
#运行决策树
& install.packages(&rpart&)
& library(rpart)
& rpart.model &- rpart(Item_Outlet_Sales ~ .,data = train.data, method = &anova&)
& rpart.model
#把测试转换成主成分分析
& test.data &- predict(prin_comp, newdata = pca.test)
& test.data &- as.data.frame(test.data)
#选择前30个成分
& test.data &- test.data[,1:30]
#在测试数据上做出预测
& rpart.prediction &- predict(rpart.model, test.data)
#最后查看你的分数排行榜,这只是为了好玩
& sample &- read.csv(&SampleSubmission_TmnO39y.csv&)
& final.sub &- data.frame(Item_Identifier = sample$Item_Identifier, Outlet_Identifier = sample$Outlet_Identifier, Item_Outlet_Sales = rpart.prediction)
& write.csv(final.sub, &pca.csv&,row.names = F)
这是提取主成分之后完整的建模过程。我保证你在上传解决方案后不会对你的分数排行榜感到高兴。试试用下随机森林。
对于Python用户:为了在Python中运行主成分分析,只需从sklearn库导入主成分分析。和上文提到的对R用户的解释是一样的。当然,用Python的结果是用R后派生出来的。Python中所用的数据集是清洗后的版本,缺失值已经被补上,分类变量被转换成数值型。建模过程保持不变,和上面对R用户所说的一样。
import numpy as np
from sklearn.decomposition import PCA
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import scale
%matplotlib inline
#加载数据集
data = pd.read_csv('Big_Mart_PCA.csv')
#转换成数字型数组
X=data.values
#Scaling the values
X = scale(X)
pca = PCA(n_components=44)
pca.fit(X)
#每一个PC说明的方差数量
var= pca.explained_variance_ratio_
#Cumulative Variance explains
var1=np.cumsum(np.round(pca.explained_variance_ratio_, decimals=4)*100)
print var1
[& 10.37&& 17.68&& 23.92&& 29.7&&& 34.7&&& 39.28&& 43.67&& 46.53&& 49.27
51.92&& 54.48&& 57.04&& 59.59&& 62.1&&& 64.59&& 67.08&& 69.55&& 72.
74.39&& 76.76&& 79.1&&& 81.44&& 83.77&& 86.06 &&88.33&& 90.59&& 92.7
94.76&& 96.78&& 98.44& 100.01& 100.01& 100.01& 100.01& 100.01& 100.01
100.01& 100.01& 100.01& 100.01& 100.01& 100.01& 100.01& 100.01]
plt.plot(var1)
#看看我采用了30个变量的输出图
pca = PCA(n_components=30)
pca.fit(X)
X1=pca.fit_transform(X)
要点回顾——
◇主成分分析被用来克服数据集中的冗余。
◇这些特征具有低维的性质。
◇这些特征(也即成分)是原始预测变量规范化线性组合形成的结果。
◇这些成分旨在用高可释方差抓取尽可能多的信息。
◇第一成分有最高的方差,接下来是第二和第三成分,以此类推。
◇这些成分必须是不相关的,请参考前文所述。
◇规范化数据在预测值用不同单位测量时变得极其重要。
◇主成分分析在3维及以上维度的数据集中最有成效。因为,维度越高,就越难从最终的数据云做出解释。
◇主成分分析应用于数值型变量的数据集上。
◇主成分分析是一个工具,有助于生成高维度数据的更好的可视化。
来源:/blog/2016/03/practical-guide-principal-component-analysis-python/
如需转载,请在开篇显著位置注明作者和出处(转自:大数据文摘 |bigdatadigest),并在文章结尾放置大数据文摘醒目二维码。无原创标识文章请按照转载要求编辑,可直接转载,转载后请将转载链接发送给我们;有原创标识文章,请发送【文章名称-待授权公众号名称及ID】给我们申请白名单授权。未经许可的转载以及改编者,我们将依法追究其法律责任。联系邮箱:。
志愿者介绍
回复“志愿者”了解如何加入我们
往期精彩文章
点击图片阅读文章
Kaggle | 使用Python和R绘制数据地图的十七个经典案例(附资源)
麻省理工学院的研究人员已经开发出一种新的3D芯片的制作方法,用碳纳米管结合电阻随机存取存储器(RRAM)单元共同创造一种,综合电子处理器设计。
在量化人才争夺战中,一些最富有的投资经理们已经沦落下风。为什么?因为他们必须跟Alphabet -谷歌(Alphabet 为谷歌前身,2015年成立后将谷歌在内的7家子公司纳入旗下)或脸书这样的公司共同竞争世界顶级大脑。
DeepMind的这次战略性行动将人们对于人工智能关注的眼光从美国转移到了加拿大,但是这一扩张却是相当自然的。
综合交通运输大数据应用中心的数据是如何生产的?数据如何为交通运输部提供决策支持?29个省份的数据治理体系如何搭建?基于大数据的全国高速公路公路通行数据团队搭建和业务升级。
《露脊鲸识别大赛》是由NOAA渔场和Kaggle数据科学平台组织的计算机视觉竞赛。
我们是最实用的公众号ID:fashionfood2013
如果他们的是手,那我们的就只能称为爪子了吧_(:3」∠)_
龙溪这么美,你知道吗?
野外罕人事,穷巷寡轮鞅。\\n白日掩荆扉,虚室绝尘想。\\n时复墟曲中,披草共来往。\\n相见无杂言,但道桑麻长。\\n桑麻日已长,我土日已广。\\n常恐霜霰至,零落同草莽。
“喂,小飞,你爷爷的坟子被挖了,棺材不见了。”  “什么!”我拿着手机,有点愣住了。  “你现在赶紧回家
普及数据思维,传播数据文化
感谢您的支持,请按照如下步骤取消屏蔽ABBAO的广告():sklearn里的PCA+SVM人脸识别算法,到底是PCA什么? - 知乎3被浏览451分享邀请回答0添加评论分享收藏感谢收起0添加评论分享收藏感谢收起您还可以使用以下方式登录
当前位置:&>&&>& > 使用sklearn进行数据挖掘
sklearn 数据挖掘 使用sklearn进行数据挖掘
导读:数据挖掘入门与实战公众号:datadw目录1使用sklearn进行数据挖掘1.1数据挖掘的步骤1.2数据初貌1.3关键技术2并行处理2.1整体并行处理2.2部分  数据挖掘入门与实战 公众号: datadw   目录
  1 使用sklearn进行数据挖掘   1.1 数据挖掘的步骤   1.2 数据初貌   1.3 关键技术   2 并行处理   2.1 整体并行处理   2.2 部分并行处理   3 流水线处理   4 自动化调参   5 持久化   6 回顾   7 总结   1 使用sklearn进行数据挖掘 1.1 数据挖掘的步骤
  数据挖掘通常包括数据采集,数据分析,特征工程,训练模型,模型评估等步骤。使用sklearn工具可以方便地进行特征工程和模型训练工作,在使用sklearn做特征工程中,我们最后留下了一些疑问:特征处理类都有三个方法fit、transform和fit_transform,fit方法居然和模型训练方法fit同名(不光同名,参数列表都一样),这难道都是巧合?   显然,这不是巧合,这正是sklearn的设计风格。我们能够更加优雅地使用sklearn进行特征工程和模型训练工作。此时,不妨从一个基本的数据挖掘场景入手:      我们使用sklearn进行虚线框内的工作(sklearn也可以进行文本特征提取)。通过分析sklearn源码,我们可以看到除训练,预测和评估以外,处理其他工作的类都实现了3个方法:fit、transform和fit_transform。从命名中可以看到,fit_transform方法是先调用fit然后调用transform,我们只需要关注fit方法和transform方法即可。   transform方法主要用来对特征进行转换。从可利用信息的角度来说,转换分为无信息转换和有信息转换。无信息转换是指不利用任何其他信息进行转换,比如指数、对数函数转换等。有信息转换从是否利用目标值向量又可分为无监督转换和有监督转换。无监督转换指只利用特征的统计信息的转换,统计信息包括均值、标准差、边界等等,比如标准化、PCA法降维等。有监督转换指既利用了特征信息又利用了目标值信息的转换,比如通过模型选择特征、LDA法降维等。通过总结常用的转换类,我们得到下表:
fit方法有用
sklearn.preprocessing
StandardScaler
sklearn.preprocessing
MinMaxScaler
sklearn.preprocessing
Normalizer
sklearn.preprocessing
定量特征二值化
sklearn.preprocessing
OneHotEncoder
定性特征编码
sklearn.preprocessing
缺失值计算
sklearn.preprocessing
PolynomialFeatures
多项式变换(fit方法仅仅生成了多项式的表达式)
sklearn.preprocessing
FunctionTransformer
自定义函数变换(自定义函数在transform方法中调用)
sklearn.feature_selection
VarianceThreshold
方差选择法
sklearn.feature_selection
SelectKBest
特征/特征+目标值
无监督/有监督
自定义特征评分选择法
sklearn.feature_selection
SelectKBest+chi2
特征+目标值
卡方检验选择法
sklearn.feature_selection
特征+目标值
递归特征消除法
sklearn.feature_selection
SelectFromModel
特征+目标值
自定义模型训练选择法
sklearn.decomposition
sklearn.lda
特征+目标值
  不难看到,只有有信息的转换类的fit方法才实际有用,显然fit方法的主要工作是获取特征信息和目标值信息,在这点上,fit方法和模型训练时的fit方法就能够联系在一起了:都是通过分析特征和目标值,提取有价值的信息,对于转换类来说是某些统计量,对于模型来说可能是特征的权值系数等。另外,只有有监督的转换类的fit和transform方法才需要特征和目标值两个参数。fit方法无用不代表其没实现,而是除合法性校验以外,其并没有对特征和目标值进行任何处理,Normalizer的fit方法实现如下:   1deffit(self, X, y= None):   2&&&Do nothing and return the estimator unchanged   3This method is just there to implement the usual API and hence   4work in pipelines.   5&&&   6X = check_array(X, accept_sparse= 'csr')   7returnself
  基于这些特征处理工作都有共同的方法,那么试想可不可以将他们组合在一起?在本文假设的场景中,我们可以看到这些工作的组合形式有两种:流水线式和并行式。基于流水线组合的工作需要依次进行,前一个工作的输出是后一个工作的输入;基于并行式的工作可以同时进行,其使用同样的输入,所有工作完成后将各自的输出合并之后输出。sklearn提供了包pipeline来完成流水线式和并行式的工作。   1.2 数据初貌
  在此,我们仍然使用IRIS数据集来进行说明。为了适应提出的场景,对原数据集需要稍微加工:   1fromnumpy importhstack, vstack, array, median, nan   2fromnumpy.random importchoice3fromsklearn.datasets importload_iris   45#特征矩阵加工   6#使用vstack增加一行含缺失值的样本(nan, nan, nan, nan)   7#使用hstack增加一列表示花的颜色(0-白、1-黄、2-红),   花的颜色是随机的,意味着颜色并不影响花的分类   8iris.data = hstack((choice([0, 1, 2], size=iris.data.shape[0]+1).reshape(-1,1),
  vstack((iris.data, array([nan, nan, nan, nan]).reshape(1,-1 )))))   9#目标值向量加工   10#增加一个目标值,对应含缺失值的样本,值为众数   11iris.target = hstack((iris.target, array([median(iris.target)])))
  1.3 关键技术
  并行处理,流水线处理,自动化调参,持久化是使用sklearn优雅地进行数据挖掘的核心。并行处理和流水线处理将多个特征处理工作,甚至包括模型训练工作组合成一个工作(从代码的角度来说,即将多个对象组合成了一个对象)。在组合的前提下,自动化调参技术帮我们省去了人工调参的反锁。训练好的模型是贮存在内存中的数据,持久化能够将这些数据保存在文件系统中,之后使用时无需再进行训练,直接从文件系统中加载即可。   2 并行处理
  并行处理使得多个特征处理工作能够并行地进行。根据对特征矩阵的读取方式不同,可分为整体并行处理和部分并行处理。整体并行处理,即并行处理的每个工作的输入都是特征矩阵的整体;部分并行处理,即可定义每个工作需要输入的特征矩阵的列。   2.1 整体并行处理
  pipeline包提供了FeatureUnion类来进行整体并行处理:   1fromnumpy importlog1p   2fromsklearn.preprocessing importFunctionTransformer   3fromsklearn.preprocessing importBinarizer   4fromsklearn.pipeline importFeatureUnion   5   6#新建将整体特征矩阵进行对数函数转换的对象   7step2_1 = ( 'ToLog', FunctionTransformer(log1p))   8#新建将整体特征矩阵进行二值化类的对象9step2_2 = ( 'ToBinary', Binarizer())   10#新建整体并行处理对象11#该对象也有fit和transform方法,fit和transform方法均是并行   地调用需要并行处理的对象的fit和transform方法   12#参数transformer_list为需要并行处理   的对象列表,该列表为二元组列表,第一元为对象的名称,第二元为对象   13step2 = ( 'FeatureUnion', FeatureUnion(transformer_list=[step2_1, step2_2,
  step2_3])) 2.2 部分并行处理
  整体并行处理有其缺陷,在一些场景下,我们只需要对特征矩阵的某些列进行转换,而不是所有列。pipeline并没有提供相应的类(仅OneHotEncoder类实现了该功能),需要我们在FeatureUnion的基础上进行优化:      在本文提出的场景中,我们对特征矩阵的第1列(花的颜色)进行定性特征编码,对第2、3、4列进行对数函数转换,对第5列进行定量特征二值化处理。使用FeatureUnionExt类进行部分并行处理的代码如下:   1fromnumpy importlog1p   2fromsklearn.preprocessing importOneHotEncoder   3fromsklearn.preprocessing importFunctionTransformer   4fromsklearn.preprocessing importBinarizer   56#新建将部分特征矩阵进行定性特征编码的对象   7step2_1 = ( 'OneHotEncoder', OneHotEncoder(sparse= False))   8#新建将部分特征矩阵进行对数函数转换的对象   9step2_2 = ( 'ToLog', FunctionTransformer(log1p))   10#新建将部分特征矩阵进行二值化类的对象   11step2_3 = ( 'ToBinary', Binarizer())   12#新建部分并行处理对象   13#参数transformer_list为需要并行处理的对象列表,该列表为二元组列表,第一元为对象的名称,   第二元为对象   14#参数idx_list为相应的需要读取的特征矩阵的列   15step2 = ( 'FeatureUnionExt', FeatureUnionExt(transformer_list=[step2_1, step2_2,
  step2_3], idx_list=[[0], [1, 2, 3], [4]]))
  3 流水线处理
  pipeline包提供了Pipeline类来进行流水线处理。流水线上除最后一个工作以外,其他都要执行fit_transform方法,且上一个工作输出作为下一个工作的输入。最后一个工作必须实现fit方法,输入为上一个工作的输出;但是不限定一定有transform方法,因为流水线的最后一个工作可能是训练!   根据本文提出的场景,结合并行处理,构建完整的流水线的代码如下:   1fromnumpy importlog1p   2fromsklearn.preprocessing importImputer   3fromsklearn.preprocessing importOneHotEncoder   4fromsklearn.preprocessing importFunctionTransformer   5fromsklearn.preprocessing importBinarizer   6fromsklearn.preprocessing importMinMaxScaler   7fromsklearn.feature_selection importSelectKBest   8fromsklearn.feature_selection importchi2   9fromsklearn.decomposition importPCA   10fromsklearn.linear_model importLogisticRegression   11fromsklearn.pipeline importPipeline   1213#新建计算缺失值的对象   14step1 = ( 'Imputer', Imputer())   15#新建将部分特征矩阵进行定性特征编码的对象   16step2_1 = ( 'OneHotEncoder', OneHotEncoder(sparse= False))   17#新建将部分特征矩阵进行对数函数转换的对象   18step2_2 = ( 'ToLog', FunctionTransformer(log1p))   19#新建将部分特征矩阵进行二值化类的对象20step2_3 = ( 'ToBinary', Binarizer())   21#新建部分并行处理对象,返回值为每个并行工作的输出的合并   22step2 = ( 'FeatureUnionExt', FeatureUnionExt(transformer_list=[step2_1,
  step2_2, step2_3], idx_list=[[0], [1, 2, 3], [4 ]]))   23#新建无量纲化对象   24step3 = ( 'MinMaxScaler', MinMaxScaler())   25#新建卡方校验选择特征的对象   26step4 = ( 'SelectKBest', SelectKBest(chi2, k=3 ))   27#新建PCA降维的对象28step5 = ( 'PCA', PCA(n_components=2 ))   29#新建逻辑回归的对象,其为待训练的模型作为流水线的最后一步   30step6 = ( 'LogisticRegression', LogisticRegression(penalty= 'l2'))   31#新建流水线处理对象   32#参数steps为需要流水线处理的对象列表,该列表为二元组列表,第一元为对象的名称,第二元为对象   33pipeline = Pipeline(steps=[step1, step2, step3, step4, step5, step6])
  4 自动化调参
  网格搜索为自动化调参的常见技术之一,grid_search包提供了自动化调参的工具,包括GridSearchCV类。对组合好的对象进行训练以及调参的代码如下:   1fromsklearn.grid_search importGridSearchCV   23#新建网格搜索对象   4#第一参数为待训练的模型   5#param_grid为待调参数组成的网格,字典格式,键为参数名称(格式“对象名称__子对象名称__参数名称   ”),值为可取的参数值列表   6grid_search = GridSearchCV(pipeline, param_grid={ 'FeatureUnionExt__ToBinary__threshold':[1.0, 2.0, 3.0, 4.0],
  'LogisticRegression__C':[0.1, 0.2, 0.4, 0.8 ]})   7#训练以及调参   8grid_search.fit(iris.data, iris.target)
  5 持久化
  externals.joblib包提供了dump和load方法来持久化和加载内存数据:   1#持久化数据   2#第一个参数为内存中的对象   3#第二个参数为保存在文件系统中的名称   4#第三个参数为压缩级别,0为不压缩,3为合适的压缩级别   5dump(grid_search, 'grid_search.dmp', compress=3 )   6#从文件系统中加载数据到内存中   7grid_search = load( 'grid_search.dmp')
  6 回顾
sklearn.pipeline
流水线处理
sklearn.pipeline
FeatureUnion
sklearn.grid_search
GridSearchCV
网格搜索调参
externals.joblib
数据持久化
externals.joblib
从文件系统中加载数据至内存
  注意:组合和持久化都会涉及pickle技术,在sklearn的技术文档中有说明,将lambda定义的函数作为FunctionTransformer的自定义转换函数将不能pickle化。   7 总结
  2015年我设计了一个基于sklearn的自动化特征工程的工具,其以Mysql数据库作为原始数据源,提供了“灵活的”特征提取、特征处理的配置方法,同时重新封装了数据、特征和模型,以方便调度系统识别。说灵活,其实也只是通过配置文件的方式定义每个特征的提取和处理的sql语句。但是纯粹使用sql语句来进行特征处理是很勉强的,除去特征提取以外,我又造了一回轮子,原来sklearn提供了这么优秀的特征处理、工作组合等功能。所以,我在这篇文章中先不提任何算法和模型,先从数据挖掘工作的第一步开始,使用基于Python的各个工具把大部分步骤都走了一遍,希望这样的梳理能够少让初学者走弯路吧。 数据挖掘入门与实战 搜索添加微信公众号:datadw 教你机器学习,教你数据挖掘 长按图片,识别二维码,点关注 公众号: weic2c
  据分析入门与实战 长按图片,识别二维码,点关注就爱阅读网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。
欢迎转载:
推荐:    

我要回帖

更多关于 sklearn pca 的文章

 

随机推荐