在机器学习中,有一些经典的数据,例如Iris数据集、波士顿房价数据集等;然而在现实生活中很少有十分整洁的数据集,所以我们要学习如何处理数据,也就是数据的预处理。
数据标准化
标准化是指将数据缩放为零均值和单位的过程,我们可以 通过从每个数据点中减去平均值(μ) 的所有数据,并将其除以方差 (σ) 的数据;也就是说,对于每个功能𝑥我们 将计算(x−μ)/σ。
from sklearn import processing
import numpy as np
X = np.array([[ 1., -2., 2.],
[ 3., 0., 0.],
[ 0., 1., -1.]])
X_scaled = preprocessing.scale(X)
X_scaled
#array([[-0.26726124, -1.33630621, 1.33630621],
[ 1.33630621, 0.26726124, -0.26726124],
[-1.06904497, 1.06904497, -1.06904497]])
标准化的:零平均值,单位方差
X_scaled.mean(axis = 0) #array([7.40148683e-17, 0.00000000e+00, 0.00000000e+00])
X_scaled.std(axis = 0) #array([1., 1., 1.])
数据归一化
与标准化类似,归一化是将单个样本缩放到有单位规范。
L1 范数(或曼哈顿距离)
X_normalized_l1 = preprocessing.normalize(X, norm='l1')
X_normalized_l1
#array([[ 0.2, -0.4, 0.4],
[ 1. , 0. , 0. ],
[ 0. , 0.5, -0.5]])
L2 范数(或欧几里得距离)
X_normalized_l2 = preprocessing.normalize(X, norm='l2')
X_normalized_l2
#array([[ 0.33333333, -0.66666667, 0.66666667],
[ 1. , 0. , 0. ],
[ 0. , 0.70710678, -0.70710678]])
二值化
我们有时候不太关心额外的数据,我们只关心某个特征是否存在,可以使用二值化来实现数据
binarizer = preprocessing.Binarizer(threshold=0.5)
X_binarized = binarizer.transform(X)
X_binarized
#array([[1., 0., 1.],
[1., 0., 0.],
[0., 1., 0.]])
#默认数据中大于等于1的数据为1
处理缺失的数据
from numpy import nan
X = np.array([[ nan, 0, 3 ],
[ 2, 9, -8 ],
[ 1, nan, 1 ],
[ 5, 2, 4 ],
[ 7, 6, -3 ]])
#nan为缺失的数据
我们有以下三个方法来处理缺失值
mean:将所有 nan 值替换为沿指定轴的平均值 矩阵(默认值: axis = 0)。
median
:沿指定轴将所有 nan 值替换为中值 矩阵(默认值:axis = 0)。
most_frequent
:将所有 nan 值替换为沿 a 的最频繁的值 矩阵的指定轴(默认值:axis = 0)。
降维
维度的诅咒:填充可用空间所需的数据点数量随着维度数量的增加呈指数级增长。
这意味着给定样本大小有一个最大特征数,超过这个数量,分类器地性能不是提升而是降低。
这就是我们需要降维的原因。
最常见的降维技术有PCA(Principal Component Analysis,主成分分析)
主成分分析的直观理解,可以认为是旋转坐标轴,使得在旋转坐标轴后这些点在新的坐标系下在各个坐标轴(变量)方向投影的方差变大。其中如果在某坐标上的方差最大,那么这个坐标轴对应的这些散点的坐标就是第一主成分,其次就是第二主成分,依此类推。