机器学习特征工程--标准化和归一化

关于归一化和标准化

1.标准化使用条件

(1)不需要对特征进行归一化:基于树模型的方法

举例:  随机森林/bagging/boosting/xgboost

  1. 需要标准化的(基于距离的模型):回归分析(逻辑回归)/神经网络 / svm

2.相关定义

什么叫归一化(标准化):归一化化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内

为什么要归一化(标准化):

一是,为了后面数据处理的方便,把不同量纲的东西放在同一量纲下比较,即把不同来源的数据统一到一个参考系下,这样比较起来才有意义。

简单的举个例子:一张表有两个变量,一个是体重kg,一个是身高cm。假设一般情况下体重这个变量均值为60(kg),身高均值为170(cm)。1,这两个变量对应的单位不一样,同样是100,对于身高来说很矮,但对于体重来说已经是超重了。另外,单位越小,数值越大,对结果的影响也越大,譬如170cm=1700mm。 简单讲,归一化的目的是可以用数值来直接进行比较,如果不归一化由于变量特性不同,同样加10,代表的意义不一样。

二是,保正程序运行时收敛加快,大部分模型归一化后收敛速度会加快。例如,下面的例子,房间数和面积数不在一个量纲上,面积数值太小,房间数太大,成椭圆状,按照梯度收敛速度会慢,理想的是数据类似圆圈的形状,经过有限几个步骤则收敛了。

3.区别

归一化和标准化的区别:网上查阅了很多资料,总结出结论:大区别没有,小区别有。

归一化:以后就认定为是最大最小值归一化或者叫0-1归一化,取值范围在[0,1]

之间。

机器学习特征工程--标准化和归一化

标准化:剩下的几种标准化方式都统一叫标准化,下面只介绍一种经常使用的z-score标准化,,经过处理后的数据均值为0,标准差为1,符合标准的正态分布。

机器学习特征工程--标准化和归一化

 

4.关于什么时候用标准化什么时候用归一化的问题:

一般有最大值/最小值偏离平均值较远时,使用归一化

如果可以用平均值来表示大致的情况的时候, 采用标准化(zscore)

 

以下为python代码实现:

#-*- coding:utf-8 -*-
import pandas as pd
import numpy as np

#方法一
#零-均值规范化
data = pd.read_csv('标准化测试数据.csv',index_col='userid')
#z-score标准化法(标准差标准化),符合标准正态分布,即均值为0,标准差为1
data2= 1.0*(data - data.mean())/data.std() #数据标准化*度 ddof默认为1,即为n-1
#data2= 1.0*(data - data.mean())/data.std(ddof=0) #数据标准化 ddof为0时,为n,和下面自己的z_score函数一样
print(data2)

'''
#方法一sklearn  
#标准化数据,方差为1,均值为0
from sklearn.preprocessing import StandardScaler
ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.transform(X_test)
'''

#方法二
#最小-最大规范化
data3=(data - data.min())/(data.max() - data.min())


#方法三
#小数定标规范化
data4=data/10**np.ceil(np.log10(data.abs().max()))


'''
注意:此函数与上面的dataframe计算方法有差异,上面默认*度为n-1,下面调的numpy的
包,直接为n,所以会有些差距,一般数据量大的时候没有太大影响
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.std.html#pandas.DataFrame.std
'''
def z_score(lst):
    '''z_score标准化函数,输入为一维列表,即[1,2,3,4,5,6,7]'''
    x = np.array(lst)
    _mean, _std = x.mean(), x.std()
    #_std = (sum([(item -_mean)**2  for item in lst])/(len(lst)-1)) **0.5 #改成这样就可以和dataframe的一样了
    if _std == 0:
        return lst
    data = [(item-_mean)/_std for item in lst]
    return data