Abstract:
归一化和标准化是数据预处理的常用手段,也已经有了众多文章对于概念的介绍。本文着重对归一化和标准化的一些注意事项做详细的解释。
一、概念:
1. 归一化(Normalization):
归一化是利用特征(可理解为某个数据集合)的最大值,最小值,将特征的值缩放到[0,1]区间,对于每一列的特征使用min - max函数进行缩放。利用数据集每个特征的最大值,最小值,将特征的值缩放到[0,1]区间。
公式:新数据=(原数据-极小值)/(极大值-极小值)
即:
2. 标准化(Standardization):
标准化是通过特征的平均值和标准差,将特征缩放成一个标准的正态分布,缩放后均值为0,方差为1。但即使数据不服从正态分布,也可以用此法。特别适用于数据的最大值和最小值未知,或存在孤立点。
公式:新数据=(原数据-均值)/(标准差)
即:
二、如何选择使用归一化或标准化?
经过实验,我认为归一化和标准化在大多数情况是通用的,并且效果相同。并且,甚至如果数据量较少(几百几千个),且量纲等级差别不太大(0.0001和100000这种),许多时候其实进行归一化或标准化之后和之前的结果是一样的,可能是像sklearn随机森林等众多包中因为内置的算法里面的优化吧。但是,为了精确得到结果,还是有必要进行的。以下几个方面是归一化和标准化可能不通用的地方:
1. 需要将数据映射到固定范围的情况。例如在使用梯度下降等优化算法时,需要将特征值缩放到0到1之间,以加快收敛速度。这时候应该选择归一化来处理。
2. 数据如果有可能存在异常值,标准化可能是较好的选择。因为单个或者少数异常值对于mean和std来说,影响较小。而对于max和min来说,影响就很大了。因此,此时选择标准化是合适的。
三、归一化和标准化的代码
对于归一化和标准化,使用sklearn库中preprocessing包来进行处理。具体如下:
1. 归一化(Normalization):
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
data_train = pd.read_excel("", index_col=0, usecols=range(11))
data_test = pd.read_excel("", index_col=0, usecols=range(11))
ss_ = MinxMaxScaler()
data_ss = ss_datastrength.fit_transform(data_train)
ss.transform(data_test)
2. 标准化(Standardization):
import pandas as pd
from sklearn.preprocessing import StandardScaler
data_train = pd.read_excel("", index_col=0, usecols=range(11))
data_test = pd.read_excel("", index_col=0, usecols=range(11))
ss_ = StandardScaler()
data_ss = ss_datastrength.fit_transform(data_train)
ss.transform(data_test)
以上代码是我实际使用中摘录的,具体代码不做详细解释,搜搜或gpt都有对每一行有很好解释。
3. 注意事项(重点):
(1)两个代码其实是相似的,只是导用的函数不同,都是经历fit_transform,然后transform。
(2)在进行标准化和归一化时,要将数据集先进行训练集和测试集的划分,然后对训练集fit_transform,对测试集transform。而不能对整个数据集都进行fit_transform,再划分数据集哦。这是因为对于测试集来说相当于未见数据集,应该使用的训练集的归一化或者标准化结果,而不应把他们也当作训练集一起归一化或标准化。
关注我,以一些小视角发布机器学习心得~