特征量纲对样本点间距离计算的影响:
对于以上数据表中反应的样本情况,我们可以观察到样本的第一个特征(肿瘤大小)在两样本中有$5$倍的差值,第二特征(发现天数)只有$2$倍差值。但是直接计算量样本点的距离(如欧式距离) $eluc.dist= \sqrt {(1-5)^2 + (200-100)^2}$的时候,就会出现两样本的距离大小主要被第二个特征(发现时间)所主导,也就是差值大的特征掩盖了相比之下小差值特征所反映的贡献。**这样计算的样本点距离和实际存在一定偏差,同时也不能反映出样本内每个特征对样本的重要程度。所以需要将数据映射到统一尺度。特别是在应用一些 涉及距离 的算法(如 SVM 分类器)时,需要注意数据特征的归一化处理。
数据归一化:
- 最值归一化:把所有数据映射到0-1区间;
$x_{scale} = \frac {x - x_{min}}{x_{max} - x_{min}}$
适用于分布有明显边界的情况(比如学生的分数就有明显的边界0-100分的区间,而像工资收入这种数据就属于没有明显边界的数据);受outlier影响较大。
python中x_scale = (x - np.min(x) )/ (np.max(x) - np.min(x))
- 均值方差归一化(standardization):把所有数据归一到均值为0方差为1的分布中,属于最值归一化的一种改进方法。
$x_{scale} = \frac {x - x_{mean}}{S}$
适用范围较广,对于有或没有明显边界,以及可能存在极端数据的情况都可以使用。
- 均值方差归一化(standardization):把所有数据归一到均值为0方差为1的分布中,属于最值归一化的一种改进方法。
训练集与测试集的归一化处理问题
对于一次批量采样的获取的原始数据,需要将该原始数据集分割成训练集和测试集来训练和测试调整模型。特别是对于测试集来说,其作用是为了模拟真实环境得来的数据,但是生产环境是很难或者说根本无法获得样例所属总体的均值和方差的,所以测试集的均值和方差并不是这里有限测试集本身的均值和方差。所以测试集的数据归一化过程中能使用的均值和方差只有训练集的均值和方差$x_{scale} = (x\_test - mean\_train)/std\_train$
在scikit-learn 框架中,可以使用其封装的Scaler
方法来处理训练集与测试集的数据归一化:
import numpy as np
from sklearn import datasets
digits = datasets.load_digits() ### 载入手写数字数据集
X = digits.data
y = digits.target
### test_train_split
from sklearn.model_selection import train_test_split
Train_X,Test_X,Train_Y,Test_Y = train_test_split(X,y,test_size= 0.2,random_state=666)
### data scale
from sklearn.preprocessing import StandardScaler
standarScaler = StandardScaler()
standarScaler.fit(Train_X)
standarScaler.mean_ ### 获取训练集的均值
standarScaler.std_ ### 获取训练集的方差
Train_X_scale = standarScaler.transform(Train_X) ### 对训练集进行归一化
Test_X_scale = standarScaler.transform(Test_X) ### 对测试集进行归一化