一、数学公式:
1.均值、去均值:
(1) 均值:
对每个特征求均值,即对每列求均值。
import numpy as np
data = np.array([[1, 2], [4, 3]])
print('数组为:\n', data)
mean = data.mean(axis=0)
print('均值为:\n', mean)
数组为:
[[1 2]
[4 3]]
均值为:
[2.5 2.5]
(2) 去均值:
每个特征的值减去对应特征的均值。
move_mean = data-mean
print('去均值:\n', move_mean)
去均值:
[[-1.5 -0.5]
[ 1.5 0.5]]
2.标准差(标准偏差):
(1) 标准差:
每个特征的值减去对应特征均值的平方和, 然后除以总值的数量,最后开根号。
std = np.std(data, axis=0)
print('标准差', std)
标准差 [1.5 0.5]
3.标准分数:
(1) 标准分数:
去均值除以标准差。
score = move_mean / std
print('标准分数: \n', score)
标准分数:
[[-1. -1.]
[ 1. 1.]]
二、理论:
1.中心化(零均值化):
(1) 功能:将整体数据平移,中心为(0, 0)。
事实上,就是去均值。每个特征的值相加为0。
(2) 目的:
标准化的第一步。
2.缩放:
(1) 功能:事实上,就是去均值除以标准差进行缩放。
(2) 目的:
标准化的第二步。
3.标准化:
(1) 功能:将数据的分布转为正态分布。
事实上,就是标准分数。标准化之后,每个特征的值变为均值为0,方差为1
(2) 目的:
将特征表现为标准正态分布数据(均值为0,方差为1)。
如果某个特征的方差比其他特征大几个数量级,那么它就会在学习算法中占据主导位置,导致学习器不能从其他特征中学习,从而降低精度。
加快梯度下降求解的速度。
三、StandardScaler():
1.介绍:
先通过计算训练集中特征的均值、标准差,对每个特征进行独立居中和缩放。然后,将平均值和标准偏差存储起来,在以后的测试集上有相同比例来缩放。
2.参数:
(1) copy: boolean, 默认为True
如果为False, 会尽量避免返回副本,并且直接在原数据上标准化。如果数据不是NumPy的数组或scipy.sparse的CSR矩阵,副本可能仍然被返回。
(2) with_mean: boolean, 默认为True
如果为True,会在缩放前对数据中心化。
如果为False,平均值为0。
如果输入稀疏矩阵,会引发异常。因为该矩阵中心化会建立密集矩阵,最终矩阵太大而无法保存。
(3) with_std: boolean, 默认为True
如果为True,将数据缩放到单位标准差。
如果为False,标准差为1,还可以避免破坏数据的稀疏性。
3.属性:
(1) mean_:一维数组或None
每个特征的均值。如果with_mean = False, 返回None。
(2) var_:一维数组或None
每个特征的方差,也为了计算scale_。如果with_std = False, 返回None。
(3) scale_:一维数组或None
每个特征的标准差,对var_开方获得。如果为with_std = False,返回None。
4.方法:
import numpy as np
from sklearn.preprocessing import StandardScaler
'''
代码解释:
声明两个标准缩放器。
假设s1是对样本的所有特征标准化。
假设s2是对样本的标记标准化。
学习中遇到的问题:
错误使用一个标准缩放器对特征和标记进行标准化。
原因是,训练集的特征和标记必须按相同比例来缩放。(详解见上面的介绍)
'''
s1 = StandardScaler()
s2 = StandardScaler()
(1) fit():
1.功能:
计算均值和标准差,用于以后的缩放。
2.参数:
X: 二维数组,形如(样本的数量,特征的数量)
训练集
(2) fit_transform():
1.功能:
先计算均值、标准差,再标准化
2.参数:
X: 二维数组
3.代码和学习中遇到的问题:
'''
代码解释:
使用二维数组来模拟特征,对其标准化。
使用一维数组来模拟标记,对其标准化。
学习中遇到的问题:
错误输入一维数组给fit_transform()、transform()。
原因是,标准化是对列操作的,一维数组每列中只有一个值,无法计算。
解决是,通过reshape(-1, 1),将一维数组改为二维数组。
'''
two_den_arr = np.array([[1, 2, 6], [4, 3, 8]])
one_den_arr = np.array([1, 5, 7])
two_den_arr = s1.fit_transform(two_den_arr)
print('二维数组的数值标准化后:\n', two_den_arr)
one_den_arr = s2.fit_transform(one_den_arr.reshape(-1, 1))
print('一维数组的数值标准化后:\n', one_den_arr)
二维数组的数值标准化后:
[[-1. -1. -1.]
[ 1. 1. 1.]]
一维数组的数值标准化后:
[[-1.33630621]
[ 0.26726124]
[ 1.06904497]]
(3) transform():
1.功能:
通过居中和缩放执行标准化。
2.参数:
X: 二维数组
该数据沿着特征轴。
3.代码:
'''
代码解释:
使用已训练好的标准缩放器,缩放数据。
'''
two_den_arr1 = np.array([[3, 5, 3], [8, 6, 1]])
one_den_arr1 = np.array([8, 3, 5])
two_den_arr1 = s1.transform(two_den_arr1)
print('二维数组的数值标准化后:\n', two_den_arr1)
one_den_arr1 = s2.transform(one_den_arr.reshape(-1, 1))
print('一维数组的数值标准化后:\n', one_den_arr1)
二维数组的数值标准化后:
[[ 0.33333333 5. -4. ]
[ 3.66666667 7. -6. ]]
一维数组的数值标准化后:
[[-2.27291236]
[-1.63005522]
[-1.30862664]]
(4) inverse_transform():
1. 功能:
将数据按比例恢复到以前的大小。
2. 参数:
X: 二维数组,形如(样本数量,特征数量)
3.代码:
print('二维数组标准化还原后:\n', s1.inverse_transform(two_den_arr))
print('一维数组标准化还原后:\n', s2.inverse_transform(one_den_arr).reshape(1, -1))
二维数组标准化还原后:
[[1. 2. 6.]
[4. 3. 8.]]
一维数组标准化还原后:
[[1. 5. 7.]]