序
在对特征数据进行提取时我们通常会遇到以不同单位(衡量单位)的数据,其中较为典型的数据就是海伦约会数据
,下面给出部分数据:
40920 8.326976 0.953952 largeDoses
14488 7.153469 1.673904 smallDoses
26052 1.441871 0.805124 didntLike
75136 13.147394 0.428964 didntLike
38344 1.669788 0.134296 didntLike
72993 10.141740 1.032955 didntLike
35948 6.830792 1.213192 largeDoses
- 第一列代表的是每年飞行里程数
- 第二列代表的是每周消耗的冰淇淋公升数
- 第三列表示的是玩游戏所消耗时间百分比
- 第四列表示的是评价
largeDoses
:有较高的兴趣;smallDoses
:一般兴趣;didntLike
:不喜欢
通过给出的数据我们可以看出,每一列数据表示的都不是同一个概念,不在同一个规格上,所以很难将其整合起来进行比较。这时我们则需要将数据进行处理,我的个人理解就是统一度量衡
,专业的名词是无量纲化
。将数据都转换成[0,1]
之间的数据或者是自定义范围
内的数据,这个过程我们就称为特征预处理
。
特征预处理的方法
特征预处理
有很多种方法,这些方法都是由前人已经总结完善的,常用预处理方法有最大-最小标准化,Z-score标准化,函数转化等等,更加详细的内容大家可以参考这位老哥的博客数据归一化处理。
最大-最小标准化
最大-最小标准化是对原始数据进行线性变换,设maxA
和minA
分别是属性A
的最大值和最小值,将一个原始值通过最大-最小标准化映射到区间[0, 1]
上,那么公式如下
若想要映射到自定义的区间[mx,mi]
中的话,则需要第二步公式
使用的数据就是海伦快速约会数据
,同时我要吐槽一下那些比较恶心的人,这些数据本就是可以找到的较为公开的数据
,可是偏偏还是有人上传到某sdn上来骗取积分(10积分呢!!
)大家可以上这个链接去下载数据。使用git clone
即可下载。
该方法在sklearn.preprocessing
中对应的方法为MinMaxScaler
,接下来给出代码如下:
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
...
def minmaxscaler():
"""
对约会对象数据进行归一化处理
:return:
"""
# 读取数据
# 由于数据是以制表符进行分割的,所以不采用默认的,进行分割
dating = pd.read_csv("datingTestSet.txt", "\t")
data = dating[["milage", "Liters", "Consumtime"]]
mm = MinMaxScaler()
data = mm.fit_transform(data)
print(data)
return None
- 数据的归一化处理也是输出数据预处理,所以使用的API在
sklearn.preprocessing
,同时本人使用的是最大-最小标准化
,对于的方法就是MinMaxScaler
- 由于需要读入数据,所以使用了
pandas
库,相信学习机器学习的同学已经对pandas
库已经有了一些了解,限于篇幅,本人将不介绍。 - 初始化实例,出入数据并使用
fit_transform
,得出结果。 MinMaxScaler()
是可以传入参数的,参数就是我们想要规定的数据范围,默认是[0,1]
。- 由于我给的数据是没有[
"milage", "Liters", "Consumtime"]
的,所以大家注意对原数据进行添加一下,最后一列大家可以写成target
。
给出输出结果
[[0.15873259 0.34195467 0.98724416]
[0.28542943 0.06892523 0.47449629]
[0.82320073 0.62848007 0.25248929]
...
[0.29115949 0.50910294 0.51079493]
[0.52711097 0.43665451 0.4290048 ]
[0.47940793 0.3768091 0.78571804]]
- 结果与原数据是一一对应的,大家可以在没有实例化之前打印输出一次
data
的值进行对比 - 这个特征预处理的方法较为简单但是也容易受到极值的影响,所以需要给出第二种特征与处理的方法。
Z-core标准化
通过对最大-最小标准化方法的数学公式进行分析我们也可以看出,这种方法是容易受到极端值
的影响的,假如我们录入的最大值或是最小值出现错误,并且出现了极大的偏差这个时候会对所有的数据的特征预处理都造成较为严重的影响。
这个时候我们可以使用Z-core标准化方法。Z-score标准化是基于原始数据的均值
和标准差
进行的数据标准化。将属性A
的原始数据x
通过Z-score标准化成结果数据x'
。Z-score标准化适用于属性的最大值或者最小值未知的情况,或有超出取值范围的离散数据的情况。
该方法在sklearn.preprocessing
中对应的方法为StandardScaler
,接下来给出代码如下:
import pandas as pd
from sklearn.preprocessing import StandardScaler
...
def starndscaler():
"""
对约会对象进行标准化处理
:return:
"""
dating = pd.read_csv("datingTestSet.txt", "\t")
data = dating[["milage", "Liters", "Consumtime"]]
ss = StandardScaler()
data = ss.fit_transform(data)
print(data)
return None
- 细心的同学想来已经发现了,和上面的代码仅仅只是实例化使用的API不一样,因为命名是
StandardScaler
,所以我们也说是标准化处理。 - 转化的结果是将没一列的值都转换为
均值为0
,标准差为1
的范围 - 我们较常使用的特征预处理方法就是这个
标准化处理
结尾
结尾当然是老套路啦
1、欢迎大家订阅我的博客,希望大家可以学到更多的知识。
2、希望大家可以给我多提建议哦,手动笔芯。