这篇文章主要是想跟大家分享一下个人关于数据预处理中StandardScaler标准化的思考,同时记录一下,如果有误请见谅,欢迎一起探讨。当然,如果这篇文章还能入得了各位“看官”的法眼,麻烦点赞、关注、收藏,支持一下!
先给出数据处理前和处理后的对比图片,让大家直观感受一波
图中横轴为x1,纵轴为x2,分别表示数据点的两个特征,且蓝、红、绿黄四根线的方程如下:
蓝线方程:x1=u1-σ1
红线方程:x1=u1+σ1
绿线方程:x2=u2+σ2
黄线方程:x2=u2-σ2
其中,u1、u2分别为数据点不同特征的均值,σ1、σ2分别为数据点不同特征的标准差,StandardScaler方法处理后u1=u2=0,σ1=σ2=1
对比上面的两图片,我们可以发现:
1、经过StandardScaler方法处理后,横纵坐标的最值、数据点的中心位置,以及标准差生了明显的变化
2、数据点之间的相对方位没有发生变化,但是数据点之间的距离却减小了(简单的说就是小明站在小红东偏西30°的方向上,且与小红之间的直线距离为100m,经过StandardScaler方法处理后,小明仍然站在小红东偏西30°的方向上,但是与小红之间的直线距离变成了1m)
3、数据点多集中于蓝、红、绿、黄四条实线所围成的区域内,经过StandardScaler方法处理后数据符合标准正态分布,即数据多集中在(-1,1)的区间内
由此,我们可以将StandardScaler方法对数据的处理分成两个步骤来看:
第一步:在坐标系中将原数据整体进行平移操作,使得原数据两个特征的的均值均为0
第二步:对平移后的原数据整体进行缩放,使得数据点之间的距离减小,直至原数据两个特征的标准差均为1
下面附上了图片生成的代码,大家有需要自取:
#导入numpy
import numpy as np
#导入画图工具
import matplotlib.pyplot as plt
#导入数据集生成工具
from sklearn.datasets import make_blobs
#导入StandarScaler
from sklearn.preprocessing import StandardScaler
X,y=make_blobs(n_samples=40,centers=2,random_state=50,cluster_std=2)#cluster_std表示每个类别的标准差(方差开平方)
X_1=StandardScaler().fit_transform(X)
point=(X,X_1)
title=("Original Data",
"Standardized Data")
fig,ax=plt.subplots(1,2,figsize=(12,5.5))
plt.subplots_adjust(wspace=0.2,hspace=0.2)
#subplots_adjust函数的功能为调整子图的布局参数。对于没有设置的参数保持不变
for point,title,ax in zip(point,title,ax.flatten()):
ax.scatter(point[:,0], point[:,1],c=y,cmap=plt.cm.cool)
ax.set_xlim(min(point[:,0])-1, max(point[:,0])+1)#设置横轴的最大值和最小值
ax.set_ylim(min(point[:,1])-1, max(point[:,1])+1)#设置纵轴的最大值和最小值
feature0_std=np.std(point[:,0])#获取数据点第一个特征的标准差
feature1_std=np.std(point[:,1])#获取数据点第二个特征的标准差
feature0_mean=np.mean(point[:,0])#获取数据点第一个特征的均值
feature1_mean=np.mean(point[:,1])#获取数据点第二个特征的均值
#根据均值、标准差,针对数据点的两个特征分别画出距离各特征均值一个标准差的直线,也就是四条线
ax.plot([feature0_std+feature0_mean,feature0_std+feature0_mean],
[min(point[:,1])-1,max(point[:,1])+1],color='red',linestyle='-')
ax.plot([-feature0_std+feature0_mean,-feature0_std+feature0_mean],
[min(point[:,1])-1,max(point[:,1])+1],color='blue',linestyle='-')
ax.plot([min(point[:,0])-1,max(point[:,0])+1],
[feature1_std+feature1_mean,feature1_std+feature1_mean],color='green',linestyle='-')
ax.plot([min(point[:,0])-1,max(point[:,0])+1],
[-feature1_std+feature1_mean,-feature1_std+feature1_mean],color='yellow',linestyle='-')
ax.set_title(title)
#显示图像
plt.show()