Python数据挖掘入门与实践 第二章2.2 流水线在预处理中的应用

2.2 流水线在预处理中的应用

现实中,物体不同特征的取值范围会非常广,它们的值域可能存在天壤之别。
例如材料学里面,不同材料的特征值,
单位g重之类的,可能就是1和10的差别,
但是拉伸强度之类的,需要使用log来进行处理,一个差就是几万,
显然,单纯的使用数字来进行K近邻分析的时候,
拉伸强度就会是最显著的特征,
但特征值大小实际上与该特征的分类效果没有任何关系。

不同特征的取值范围千差万别,常见的解决方法是对不同的特征进行规范化,使它们的特征值落在相同的值域或从属于某几个确定的类别,比如小、中和大。
一旦解决这个问题,不同的特征类型对算法的影响将大大降低,分类正确率就能有大幅提升。
选择最具区分度的特征、创建新特征等都属于预处理的范畴。scikit-learn的预处理工具叫作转换器(Transformer),它接受原始数据集,返回转换后的数据集。除了处理数值型特征,转换器还能用来抽取特征。

2.2.1 预处理示例

首先对Ionosphere数据集做些破坏。虽然这里的麻烦是人为制造的,但是这 些问题在很多真实数据集里都存在。
首先,为了不破坏原来的数据集,我们为其创建一个副本。

X_broken = np.array(X)

接下来,我们就要捣乱了,每隔一行,就把第二个特征的值除以10。

X_broken[:,::2] /= 10

理论上讲,这样做对结果影响应该不大。毕竟,除以10之后,各个特征相差不大。主要的问题是,数值范围变了,奇数行的第二个特征要比偶数行的大。再次计算正确率看一下效果。

书里写的奇数行的第二个特征要比偶数行的大,看了半天X_broken[:,::2] /= 10,还是没理解。。。于是乎先深究一下,np.array的切片问题。

第一个冒号是代表所有行,逗号表示分隔,第二个冒号表示所有列,
第三个冒号是什么意思呢?

这里还是先看文档:

直接ctrl+F搜索双冒号,看看有没有例子,结果还真有如下的例子。

y = np.arange(35).reshape(5,7)
y[1:5:2,::3]
array([[ 7, 10, 13],
[21, 24, 27]])

为了方便观察,打印一下y和切片后的y[1:5:2,::3]:
结果

首先是第1行到第4行每隔2行取值,
然后是所有列,每隔3列取值。
我的理解是:取出来的数组的序号(从0开始),整除2或者3就取值。
这样看来,X_broken[:,::2] /= 10的意思似乎是:
所有行取值,所有列取值后每隔2列除以10?
所以书上的内容应该是:所有行的,奇数列的特征值,要比原始数据的奇数列的特征值要小10倍。
而且这个奇数列是指从1开始的奇数列,所以对应的序号就是可以被2整除的偶数。

验证一下:
print(X[0])
print(X_broken[0])
在这里插入图片描述
可以发现,果然是奇数列的特征值,要比原始数据的奇数列的特征值要小10倍。
再验证一下:
print(X[1])
print(X_broken[1])

在这里插入图片描述
也是奇数列的特征值,要比原始数据的奇数列的特征值要小10倍。

再验证一下所有的奇数列:

i_index = []
for i in range(34):
	if (X[:,i:i+1] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值