目录
上一篇文章机器学习入门研究(五)-特征工程之特征提取提到了特征工程的特征提取,本文将总结特征工程中的另外一个特征预处理。
1.定义
特征预处理就是通过一些转换函数将特征数据转换成适合算法模型的特征数据的处理过程。也就是将数据值数据进行无量纲化。
2.为什么要有特征的预处理
在机器学习中有一种算法KNN算法,其过程就是计算特征值之间的距离差进行排序,取最近的距离差来进行分类。其中有种计算距离差的方式叫欧式距离,就是计算特征值之间的距离。举个例子
假设在一个约会网站在统计女士对约会男士的感觉,统计的每个月飞机里程数、每周吃的冰激淋的量、每天消耗在游戏的上的时间,得出来对这男士的感觉是喜欢、不喜欢、还是一点点喜欢。
飞机里程 | 吃冰激淋的量 | 消耗在游戏时间 | 对男士的感觉 |
40920 | 8.326976 | 0.953952 | 不喜欢 |
14488 | 7.153469 | 1.673904 | 喜欢 |
6052 | 1.441871 | 0.805124 | 喜欢 |
75136 | 13.147394 | 0.428964 | 一点点喜欢 |
在KNN算法计算第一个和第二个的距离的时候会出现这种现象:
从上面计算这个距离的时候,很明显消耗在游戏时间和吃冰激凌的量这两个特征的影响几乎不起作用,但是这三个特征在判断女士对约会男士的感觉的作用却是同等作用。所以像这种特征值的单位或者大小相差较大,或者特征值的方差相差好几个数量级的时候,会使得一些算法无法学习到其他特征,所以就需要对数据进行无量纲化,主要有两种:
- 归一化
- 标准化
对应的sklearn中的API为:
sklearn.preprocessing
归一化
1.定义
通过对原始数据进行变化,将数据映射到[mi,mx]之间,其中mi为缩放区间的最小值,mx为缩放区间的最大值。
其中X''为转换之后的值,x为当前的特征值,max为所在列的最大值,min为所在列的最小值。
找一个简单的例子来说下这个计算过程
有一个3个特征值的原始值如下图:
特征1 | 特征2 | 特征3 |
1 | 100 | 1000 |
4 | 20 | 900 |
5 | 50 | 600 |
将每个特征值分别带入上面的公式,整个计算过程为:
最后得到归一化的数据为:
特征1 | 特征2 | 特征3 |
0 | 1 | 1 |
0.75 | 0 | 0.75 |
1 | 0.375 | 0 |
2.API
在sklearn中对应的API为
sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)..)
feature_range为转换之后的缩放区间,默认为(0,1),就是按照最大最小值进行转换,其中里面的迭代器:
MinMaxScaler.fit_transform(X)
x 为数组[n_samples,n_features] ;返回值:转换之后形状相同的array
from sklearn.preprocessing import MinMaxScaler
def minmax():
# 归一化
# 获取数据
data = pd.read_csv("date.csv", sep=',', usecols=['mile', 'cream', 'time'])
print( data)
data = data.iloc[[0,1,2,3],[0,1,2]]
print("归一化之前的数据为 " )
print( data)
# 实例化转换器类
scaler = MinMaxScaler()
# 调用fit_transform进行转换
data_new = scaler.fit_transform(data)
print("归一化之后的数据为")
print(data_new)
return None
我们只读取表格里面的4x3列的数据,转换之后的数据看下输出结果为:
归一化之前的数据为
mile cream time
0 40920 8.326976 0.953952
1 14488 7.153469 1.673904
2 26052 1.441871 0.805124
3 75136 13.147394 0.428964
归一化之后的数据为
[[0.43582641 0.58819286 0.42169743]
[0. 0.48794044 1. ]
[0.19067405 0. 0.30215111]
[1. 1. 0. ]]
归一化就是将数据映射到一个数值范围内,使用的方法就是最大值最小值的方法。缺点在于如果异常值较多,而异常值恰好是最大值或者最小值的话,会引起整个计算结果的。只适合传统精确小的数据场景。
标准化
1.定义
标准化就是将原始数据进行变换,把数据变换到均值为0,标准差为1的范围,其计算公式为:
其中mean为这一列数据的平均值,为标准差。
PS:标准差衡量的是数据的集中程度。如果有异常值,在有一定数据量的情况喜爱,少量的异常值对平均值和标准差不会影响太大。
2.API
在sklearn中对应着
sklearn.preprocessing.StandardScaler
其中的迭代器同MinMaxScaler
仍然是上面那个例子,对应着代码如下:
from sklearn.preprocessing import StandardScaler
def standard():
# 标准化
# 获取数据
data = pd.read_csv("date.csv", sep=',', usecols=['mile', 'cream', 'time'])
print( data)
data = data.iloc[[0,1,2,3],[0,1,2]]
print("标准化之前的数据为 " )
print( data)
# 实例化转换器类
scaler = StandardScaler()
# 调用fit_transform进行转换
data_new = scaler.fit_transform(data)
print("标准化之后的数据为")
print(data_new)
return None
运行之后的结果如下:
标准化之前的数据为
mile cream time
0 40920 8.326976 0.953952
1 14488 7.153469 1.673904
2 26052 1.441871 0.805124
3 75136 13.147394 0.428964
标准化之后的数据为
[[ 0.07770278 0.1943584 -0.02554358]
[-1.08200353 -0.08738006 1.56888597]
[-0.57463202 -1.4586346 -0.355143 ]
[ 1.57893277 1.35165626 -1.18819939]]
如果在已有样本足够多的情况下比较稳定,适合现代嘈杂的大数据场景
总结
机器学习的内容真的越来觉得越有意思了。