数据规范化就是消除量纲的影响,这点很重要。
对算法的作用
在以梯度和矩阵为核心的算法中,譬如逻辑回归、神经网络、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