【笔记】机器学习之数据归一化
数据归一化 feature scaling
在分类的时候需要进行数据归一化
那么为什么要进行数据归一化?
像是肿瘤情况,当时间单位是天,大小单位是厘米,由于时间的跨度比大小的跨度差值大的太多,会导致样本间的距离被时间所主导,同理,将时间变成以年为单位一样会因为差值太大而导致模型不行
所谓的数据归一化就是将所有的数据映射到同一尺度中
这说到了最简单的方式
最值归一化 normalization
其就是将把所有的数据映射到0到1之间
方式很简单,对于我们的每一个特征值设为x,用x这个特征点再减去xmin,再除以xmax减去xmin即可
适用于分布明显有边界的情况,但是其受outlier的影响比较大,如果没有明显边界的话,比如有个100个样本,99个年收入10万,一个年收入1000万,如果把这个数据映射到0到1之间的话,很明显,这个模型是不够好的
相应的改进的方式:均值方差归一化 standardization
均值方差归一化:我们的数据并不能保证在0和1之间,但是能保证所有数据归一到均值为0方差为1的分布中
这种方式适用于数据分布没有明显的边界,整体数据集中存在极端的数据值,即使有明显的边界,使用这种方式也是可以的,一般情况使用这种就可以
这种归一化的方式计算的方法就是用每一个特征值减去特征值对应的均值,再除以特征值对应的方差就可以了
实践部分
首先我们先确定一个随机数组
x = np.random.randint(0,100,size=100)
然后使x中的每一个都减去其最小值再除以最大值减最小值
(x - np.min(x)) / (np.max(x) - np.min(x))
这样,最终的结果就是一个向量,其中每一个数值都是在0到1中了
然后我们设置一个矩阵
X = np.random.randint(0,100,(50,2))
取前十个元素
这就有一个问题了,很明显,向量中的数据都是浮点型的数据,而我们设置的数组只能存放整形,因此我们需要将其强制转换成浮点型
X = np.array(X, dtype=float)
再取前十个元素,可以发现已经变成浮点数了
最值归一化
注意:每一个维度都是对应的列的方向上
对每一个维度进行最值归一化
先对第零这个维度,对应的列方向上,让它去等于这一列的所有的数值减去这一数列中所对应的最小值,得到的这个结果去除以这列数值对应的最大值减去这一列数值中对应的最小值,即完成了第一个特征值的最值归一化
X[:,0] = (X[:,0]- np.min(X[:,0])) / (np.max(X[:,0]) -np.min(X[:,0]))
对第一维度也最值归一化以后,再取前十个元素可得
散点图如下
其维度的均值并不会正好等于0.5,会上下的偏差
均值方差归一化
同样的设置一个矩阵
X2 = np.random.randint(0,100,(50,2))
X2 = np.array(X2, dtype=float)
计算过程,使这一列的值减去对应的平均值,然后再除以相应的方差即可
X2[:,0] = (X2[:,0] - np.mean(X2[:,0])) / np.std(X2[:,0])
通过可视化我们可以发现我们并不能保证这些数据全部在0到1之间
其均值和方差分别趋向于0和1
这样即使出现极端数值,我们的均值和方差也不会出现过大的偏移