数据归一化

数据归一化

Posted on 2019-03-31

$x_2$

数据归一化

不同的评价指标往往具有不同的量纲(例如:对于评价房价来说量纲指:面积、房价数、楼层等;对于预测某个人患病率来说量纲指:身高、体重等。)和量纲单位(例如:面积单位:平方米、平方厘米等;身高:米、厘米等),这样的情况会影响到数据分析的结果,为了消除指标之间量纲的影响,需要进行数据标准化处理,已解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价

归一化方法:

最值归一化(normalization): 把所有数据映射到 0-1 之间; 适用于分布有明显边界的情况

$X_{scale}=\frac{X - X_{min}}{X_{max} - X_{min}}$

均值方差归一化(standardization): 把所有数据归一到均值为0方差为1的分布中; 适用于数据分布没有明显边界的, 有可能存在极端数据值

$X_{scale}=\frac{X - X_{mean}}{S}$ ($X_{mean}$为特征值的均值,S为方差)

归一化方法实现

import numpy as np
import matplotlib.pylab as plt

最值归一化

# 生成 0-100 之间的 100 个随机整数
x = np.random.randint(0, 100, size=100)
x
(x - np.min(x)) / (np.max(x) - np.min(x))
X = np.random.randint(0, 100, (50, 2))
X = np.array(X, dtype=float)
X[:10,:]
# 第0列数据归一化
X[:, 0] = (X[:, 0] - np.min(X[:, 0])) / (np.max(X[:, 0]) - np.min(X[:, 0]))
# 第1列数据归一化
X[:, 1] = (X[:, 1] - np.min(X[:, 1])) / (np.max(X[:, 1]) - np.min(X[:, 1]))
plt.scatter(X[:,0], X[:,1])
plt.show()
np.mean(X[:, 0])
np.mean(X[:, 1])
np.std(X[:, 0])
np.std(X[:, 1])

均值方差归一化

Y = np.random.randint(0, 100, (50, 2))
Y = np.array(Y, dtype=float)
Y[:10,:]
Y[:, 0] = (Y[:, 0] - np.mean(Y[:, 0])) / np.std(Y[:, 0])
Y[:, 1] = (Y[:, 1] - np.mean(Y[:, 1])) / np.std(Y[:, 1])
plt.scatter(Y[:,0], Y[:,1])
plt.show()
np.mean(Y[:, 0])
np.mean(Y[:, 1])
np.std(Y[:, 0])
np.std(Y[:, 1])

sklearn中的数据归一化

测试数据集的归一化需要是要训练数据集中的均值和方差

from sklearn import datasets
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.target
X[:10, :]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)

sklearn均值方差归一化

from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
standardScaler.fit(X_train)
# 均值
standardScaler.mean_
# 方差
standardScaler.scale_
# 归一化
X_train_standard = standardScaler.transform(X_train)
X_train_standard
X_test_standard = standardScaler.transform(X_test)
X_test_standard
from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train_standard, y_train)
knn_clf.score(X_test_standard, y_test)