背景:现实的数据采集中,由于对不同的特征值采用不同的单位,会导致不同特征值的取值范围会有很多的差距。比如房价以“元”为单位,取值范围可能是1万到10万之间;食物支出占比的取值范围可能是0到1之间。这一问题会严重影响许多模型的创建,针对此我们一般会采用“归一化”对不均衡的数据进行预处理。
归一化的意义
- 使数据类型一致且均匀
- 提高模型精度
- 加快梯度下降求最优解的速度
- 概率模型可以不做归一化如决策树
算法思路
- 数据归一化:所有特征值介于0-1之间
- 数学原理: newValue = (newValue-min) / (max -min)
- max: 当前特征的最大特征值
- min: 当前特征的最小特征值
代码实现
from numpy import *
'''数值归一化:特征值转化为0-1之间:newValue = (oldValue-min)/(max-min)'''
def norm_dataset(dataset):
minVals = dataset.min(0) # 参数0是取得列表中的最小值,而不是行中最小值
maxVals = dataset.max(0)
ranges = maxVals - minVals
normdataset = zeros(shape(dataset)) # 生成原矩阵一样大小的0矩阵
m = dataset.shape[0]
# tile:复制同样大小的矩阵
molecular = dataset - tile(minVals,(m,1)) # 分子: (oldValue-min)
Denominator = tile(ranges,(m,1)) # 分母:(max-min)
normdataset = molecular / Denominator # 归一化结果。
print('归一化的数据结果:\n'+str(normdataset))
return normdataset,ranges,minVals