特征处理

归一化Normalization

由于每一组特征数据的量纲是不同的,我们需要先将他们的量纲统一,之后再去训练学习,每一组特征数据的变化对预测结果的影响。

特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间

def MinMaxScaler(feature_range=(0, 1…)):归一化。每个特征缩放到给定范围(默认[0,1])

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from sklearn.preprocessing import MinMaxScaler, StandardScaler

def mm():
"""
归一化处理
:return: NOne
"""
# 归一化容易受极值的影响
mm = MinMaxScaler(feature_range=(0, 1))

#通过fit_transform进行转换
data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])

print(data)

#如果使用transform进行测试集的时候,量纲还是fit_transform的
out = mm.fit_transform([[1, 2, 3, 4], [6, 5, 8, 7]])

print(out)
# [[-1.96666667 0. -1.4 -6 ]
# [-1.8 1.5 -0.4 -5.5 ]]
# 相当于是用 (1-90/90-60) *1 + 1 = -1.966667

return None

mm()
  1. 归一化的好处:容易更快地通过梯度下降找到最优解
  2. 归一化的弊端:由于是使用max和min数据进行处理,会很容易受极值的影响,如果max很大,而其他数据很小,那归一化后的其他数据则很接近0

注意:在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景

标准化Standardization

z-score 标准化(zero-mean normalization),最常见的标准化方法就是Z标准化,也叫标准差标准化。通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内,不是标准正态分布,只是均值为0,标准差为1的均匀分布

def StandardScaler(…):标准化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from sklearn.preprocessing import MinMaxScaler, StandardScaler

def stand():
"""
标准化缩放,不是标准正太分布,只均值为0,方差为1的分布
:return:
"""
std = StandardScaler()
data = std.fit_transform([[1., -1., 3.], [2., 4., 2.], [4., 6., -1.]])

print(data)
print(std.mean_)
print(std.var_)
print(std.n_samples_seen_) # 样本数
print('-' * 50)

stand()
  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
  • 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小

注意:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。