数据归一化——自学第三篇

1、数据归一化(normalization)

举个例子,例如下图所示的判断是否为恶性肿瘤的数据中,有两个特征,分别为肿瘤大小和肿瘤发现的时间,如果按照KNN算法中需要计算两个数据之间的欧拉距离,则发现时间的差的平方将远远大于肿瘤大小的差的平方,因此样本间的距离被“发现时间”所主导。

这里写图片描述
如果不进行数据归一化,则计算结果很可能被其中一个特征所主导

(1)最值归一化:把所有数据都映射到0-1之间

x s c a l e = x x m i n x m a x x m i n

适用于有明显边界的数据

(2)均值方差归一化(standardization):
把所有数据归一到均值为0方差为1的分布中,数据减去平均值再除以方差

x s c a l e = x x m e a n s

适用于没有明显边界的数据,可能存在极端数据

2、测试数据集的归一化

注:不可以分别对训练数据集和测试数据集进行归一化,测试数据集的归一化需要利用训练数据集的均值和方差进行归一化。(保存训练集的均值和方差)
(x_test-mean_train)/std_train
sklearn中有scalar类,通过fit求出训练集的均值和方差并保存,输入的新的样例利用保存的训练集的均值和方差得到测试集的输出结果。
这里写图片描述
下面对iris数据集用KNN分别对归一化前和归一化后的数据进行分析:

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris=datasets.load_iris()
X=iris.data
Y=iris.target

x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)

#sklearn中的StandardScalar(均值方差归一化)
from sklearn.preprocessing import StandardScaler
standardscaler=StandardScaler()
standardscaler.fit(x_train)

#训练数据集和测试数据集都要进行归一化处理
x_train_standard=standardscaler.transform(x_train)
x_test_standard=standardscaler.transform(x_test)

#用归一化后的数据进行KNN
from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsClassifier(n_neighbors=3)
knn.fit(x_train_standard,y_train)
print(knn.score(x_test,y_test)) #非归一化的测试集
print(knn.score(x_test_standard,y_test))  #归一化的测试集
#输出答案为
0.3
0.9333333333333333

可见对训练集和测试集都进行归一化后精确度明显提高

下面对最值归一化和均值方差归一化分别进行可视化:

import numpy as np
import matplotlib.pyplot as plt

#最值归一化
x=np.random.randint(0,100,size=100)  #生成0-100的一维向量
x=(x-np.min(x))/(np.max(x)-np.min(x))
X=np.random.randint(0,100,(50,2))  #生成0-100之间的50*2维的数组
#numpy中只能存储一种类型的数据,如上所示生成后只能存储整形,而归一化后都是浮点型,所以需先将X定义成浮点型
X=np.array(X,dtype=float)
X[:,0]=(X[:,0]-np.min(X[:,0]))/(np.max(X[:,0])-np.min(X[:,0]))
X[:,1]=(X[:,1]-np.min(X[:,1]))/(np.max(X[:,1])-np.min(X[:,1]))
plt.scatter(X[:,0],X[:,1])
plt.show()
#均值方差归一化
X1=X.copy()
X1[:,0]=(X[:,0]-np.mean(X[:,0]))/np.std(X[:,0])
X1[:,1]=(X[:,1]-np.mean(X[:,1]))/np.std(X[:,1])
plt.scatter(X1[:,0],X1[:,1])
plt.show()
print(np.mean(X1[:,0]))
print(np.std(X1[:,1]))
#均值方差归一化后求解的均值和方差为
-7.66053886991358e-17
1.0

最值归一化:
这里写图片描述
均值方差归一化:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/yh_1021/article/details/82469755