knn算法-归一化(七)
归一化
1.1 归一化的定义及其代码实现
问题:
观察如下样本数据,我们有两个样本,每个样本有两个特征,一个是肿瘤大小,一个是肿瘤的发现时间。
如利用欧拉距离计算上述两个样本的距离,由于两个特征的值差距较大,距离结果的值大小由发现时间决定。
如果此时修改发现时间的单位为年,则最终距离结果又由肿瘤大小决定。
综上所述,我们在训练模型时,如果特征之间的值差距较大,不能直接传入模型,需要对数据做归一化处理。
作用:将所有数据映射到同一尺度。
归一化的分类
最值归一化(Normalization):把所有数据映射到(0,1)之间
计算流程:先计算所有样本的每个特征的最大值和最小值计算出来,用每个样本的特征值减去对应的最小值,再计算最大值和最小值的差值,最后将两个结果 进 行除法操作,得到最终的特征归一化结果。
适用情况:分布有明显边界
举例:学生分数0-100有明显边界,图片像素点的值0-255有明显边界。
缺点:受outlier影响较大
观察公式,结果受和影响严重
均值方差归一化(standardization):把所有数据归一到均值为0方差为1的分布中
适用情况:数据分布没有明显边界
优点:不容易受到极端数据值的影响
利用每个特征值减去特征值均值再除以特征值的方差得到均值方差归一化结果
最值归一化实现
import numpy as np import matplotlib.pyplot as plt #随机生成长度为100的数值范围在0-100的一维数组 x = np.random.randint(0,100,size=100) #归一化代码实现 (x-np.min(x))/(np.max(x)-np.min(x)) #随机生成shape为(50,2)的值范围在0-100范围内的二维数组 X = np.random.randint(0,100,(50,2)) X[:10,:] #转换数值类型为float X = np.array(X,dtype=float) X[:10,:] #对两个样本进行最值归一化 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() #观察均值和方差 np.mean(X[:,0]) np.std(X[:,0]) np.mean(X[:,1]) np.std(X[:,1])
均值方差归一化实现
#随机生成shape为(50,2)数值范围在0-100范围内的二维数组 X2 = np.random.randint(0,100,(50,2)) #转换为float类型 X2 = np.array(X2,dtype=float) #对两个样本进行均值方差归一化 X2[:,0] = (X2[:,0]-np.mean(X2[:,0]))/np.std(X2[:,0]) X2[:,1] = (X2[:,1]-np.mean(X2[:,1]))/np.std(X2[:,1]) #绘图显示 plt.scatter(X2[:,0],X2[:,1]) plt.show() #观察均值和方差 np.mean(X2[:,0]) np.std(X2[:,0]) np.mean(X2[:,1]) np.std(X2[:,1])
通过对比发现,均值方差归一化能够将所有数据转换为均值为0,方差为1的范围内,更适合数据中存在极端数据的情况。
1.2 sklearn中的归一化
训练集和测试集的归一化
利用训练集得到均值和方差,训练集和测试集均利用训练集得到的均值和方差来进行归一化处理
sklearn中的归一化
将训练集交给scaler类,调用fit方法,将关键信息(均值、方差等)保存在scaler类中,再调用scaler类的transform方法,将训练集和测试集进行归一化转换。
代码实现:
import numpy as np from sklearn import datasets 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(iris.data,iris.target,test_size=0.2,random_state=1) #进行均值方差归一化处理 from sklearn.preprocessing import StandardScaler ss = StandardScaler() ss.fit(X_train,y_train) ss.mean_ ss.scale_ #转换训练集和测试集 X_train1 = ss.transform(X_train) X_test1 = ss.transform(X_test) #对比准确率 from sklearn.neighbors import KNeighborsClassifier knn_clf = KNeighborsClassifier(n_neighbors=3) knn_clf.fit(X_train1,y_train) knn_clf.score(X_test1,y_test) knn_clf.score(X_test,y_test)
- 点赞
- 收藏
- 关注作者
评论(0)