数据规范化就是消除量纲的影响,这点很重要。

 

对算法的作用

在以梯度和矩阵为核心的算法中,譬如逻辑回归、神经网络、svm,规范化能加快求解速度,

在以距离计算为核心的算法中,譬如KNN、Kmeans,规范化能提高模型的精度,

在树模型中,无需规范化。

 

概述

数据规范化有很多种方法,总体可以分为线性的和非线性的,线性的规范化包括中心化处理和缩放处理中心化是把数据减去某个值, 以平移到某个位置,缩放是把数据除以某个值,把数据固定在某个范围。取log也是一种缩放处理。

常用的数据规范化方法有归一化、标准化、极差标准化、log等

 

归一化

x-min/max-min,把数据规范在(0, 1)之间,当然也可以是其他范围

归一化容易受到异常值的影响,所以一般不是首选,如果标准化效果不好时,可以试试归一化

在不涉及梯度、矩阵、距离的算法中,可以先试试归一化,如图像处理

 

示例代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler


np.set_printoptions(2)
np.random.seed(10)

data = np.random.uniform(-5, 5, size=(100, 1))        # 注意数据必须是2维的
data = np.random.normal(-5, 5, size=(100, 1))
print(data.T)
plt.plot(data, '.')

# 归一化
scaler = MinMaxScaler()
scaler = scaler.fit(data)
data2 = scaler.transform(data)
print(data2.T)
plt.plot(data2, 'ro')

# 数据还原
old_data = scaler.inverse_transform(data2)           # 逆操作
print(old_data.T)

# 归一化到指定范围
scaler2 = MinMaxScaler(feature_range=[2, 4])        # 归一到指定范围内
scaler2.fit(old_data)
data3 = scaler2.transform(old_data)
plt.plot(data3, 'y*')

plt.show()


# 当特征很多时,fit会报错,表示计算不了,此时用 partial_fit
scaler3 = MinMaxScaler()
scaler3.partial_fit(data)
data4 = scaler3.transform(data)
print(data4.T)

MinMaxScaler  fit  transform  fit_transform  inverse_transform  partial_fit

 

标准化

通常说的标准化是指标准差标准化,即 x-mean/std

std在一定程度上代表了数据的"跨度",可以理解为取值范围,也可以理解为量纲,除以标准差就是消除量纲

也可以做一些其他尝试,比如 x-min/std,这叫正规化

x-mean/max-min,这叫极差标准化    

 

示例代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler


np.set_printoptions(precision=2)
np.random.seed(10)

data = np.random.uniform(-5, 5, size=(100, 1))
print(data.T)
plt.plot(data, '.')

scaler = StandardScaler()
scaler.fit(data)
print(scaler.mean_)     # [-0.15]
print(scaler.var_)      # [7.56]

data = scaler.transform(data)
print(data.mean())      # -1.97064586871e-17    0
print(data.var())       # 1

old_data = scaler.inverse_transform(data)
print(old_data.T)
plt.plot(data, 'ro')

plt.show()

 

另一个函数实现标准化

import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler, scale


data = np.random.uniform(-5, 5, size=(20, 1))

data1 = MinMaxScaler().fit_transform(data)
print(data1.T)
data2 = StandardScaler().fit_transform(data)
print(data2.T)
data3 = scale(data)
print(data3.T)      # ==data2

 

还有很多不太常用的,sklearn也提供了API