参数标准化 | 机器学习

362 阅读2分钟

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([[1505], [1204], [1254], [803]])
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 里面就提供了另外三种选择,l1l2max。它的标准化方法为

其中s对应不同的参数有

  • L1:
  • L2:
  • Max:

例如

from sklearn.preprocessing import normalize
x = np.array([[1505], [1204], [1254], [803]])
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 排版