sklearn中StandardScaler()

一、数学公式:

1.均值、去均值:

	(1) 均值:
			对每个特征求均值,即对每列求均值。

sklearn中StandardScaler()_第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) 标准差:
			每个特征的值减去对应特征均值的平方和, 然后除以总值的数量,最后开根号。

sklearn中StandardScaler()_第2张图片

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.]]

你可能感兴趣的:(sklearn中标准化,机器学习)