
1. 问题
机器学习的各个参数,也叫feather,可谓千差万别。在正式建模之前,需要把这些参数标准化(Normalization)。具体情况是怎样的呢?
2. 分析
还是那之前提到的房价案例为例。简单举例,影响房价的参数可能有房价大小,以平方米记,例如从50~200平方米;还有里面的房间数量,比如一室一厅就记为2,三室两厅就记为5。
显然,房间数量和平米数有数量级的差异。140平米的房子,房间数量可能只有5。如果直接用这些原始参数计算,得到的模型必然会出现,某一方的参数掩盖了另一方参数影响的情况。
我们希望能把各个参数放到同一个数量级下进行比较,这就需要用到标准化。通常,我们用以下公式操作
其中
:
的期望;
:
的标准差;
对于多元分析,其矩阵化表示方法为
其中
为X的标准差矩阵。
2.1. NumPy
NumPy 下没有直接标准化的函数,我们需要手动操作一下。
import numpy as np
from sklearn.preprocessing import normalize
x = np.array([[150, 5], [120, 4], [125, 4], [80, 3]])
mu = np.mean(x, axis=0)
sigma = np.std(x,axis=0,ddof=0)
z = (x - mu)/sigma
print(z)
输出
[[ 1.2453387 1.41421356]
[ 0.04981355 0. ]
[ 0.24906774 0. ]
[-1.54421999 -1.41421356]]
完美达到了我们想要达到的目的。
2.2. Scikit-learn
标准化有很多不同的方法。比如Sckikit learn 里面就提供了另外三种选择,l1,l2和max。它的标准化方法为
其中s对应不同的参数有
- L1:
- L2:
- Max:
例如
from sklearn.preprocessing import normalize
x = np.array([[150, 5], [120, 4], [125, 4], [80, 3]])
normalize(x, norm='l2', axis=0)
输出
array([[0.61793311, 0.61545745],
[0.49434648, 0.49236596],
[0.51494426, 0.49236596],
[0.32956432, 0.36927447]])
也达到了我们想要的目的,只是结果不一样罢了。
3. 总结
今天我们大致介绍了标准化的几种方法。机器学习需要数据,给什么数据它都能出结果。但我们不能因此就随意把奇奇怪怪的数据丢给它。该出手时,必须出手。
还是那句老话,Garbage in, garbage out。
4. 延伸阅读

本文使用 mdnice 排版