1. 0-1标准化
2. Z-score标准化
#1. 0-1标准化
#将数据的最大最小值记录下来,并通过max-min作为基数,进行数据的归一化处理
#x=(x-min)/(max-min)
df=pd.DataFrame({'v1':np.random.rand(10)*20,
'v2':np.random.rand(10)*1000})
df.head()
def f(df,*cols):
df_n=df.copy()
for col in cols:
ma=df_n[col].max()
mi=df_n[col].min()
df_n[col+'_n']=(df_n[col]-mi)/(ma-mi)
return(df_n)
df_n=f(df,'v1','v2')
df_n
#2. z-score标准化
#Z分数,是一个分数与平均数的差再除以标准差的过程
#Z值的量代表着原始分数和母体平均值之间的距离,是以标准差为单位计算,在原始分数低于平均值时,Z则为负数,反之为证书
df=pd.DataFrame({'v1':np.random.rand(10)*10,
'v2':np.random.rand(10)*100})
def f_z(df,*cols):
df_n=df.copy()
for col in cols:
u=df_n[col].mean()
std=df_n[col].std()
df_n[col+'_zn']=(df_n[col]-u)/std
return(df_n)
df_zn=f_z(df,'v1','v2')
df_zn
u_zn=df_zn['v1_zn'].mean()
std_zn=df_zn['v1_zn'].std()
print('标准化后v1的均值为:%.2f ,标准差为:%.2f' %(u_zn,std_zn))
#经过处理的数据符合标准正态分布,即均值为0,标准差为1
#什么情况下用Z-score标准化
#在分类、聚类算法中,需要使用距离来度量相似性的时候,Z-score表现更好
连续属性变换为分类属性:在数值的取值范围内设定若干个离散划分点,将取值范围化为一些离散化的区间,最后用不同的符号或整数值代表每个子区间中数据值
等宽法/等频法
#等宽法
#cut方法
ages=[20,22,25,27,21,23,37,31,61,45,42,32]
#将年龄划分为18-25,26-35,36-60,60以上
bins=[18,25,35,60,100]
cats=pd.cut(ages,bins)
print(cats.codes) #分组编号
print(cats.categories) #四个区间,结果为index
print(pd.value_counts(cats)) #按区间计数
print(pd.cut(ages,bins,right=False)) #默认右闭
group_names=['Younth','YounthAduit','MiddleAged','Senior']
print(pd.cut(ages,bins,labels=group_names))
print('---------------------------')
df = pd.DataFrame({'ages':ages})
group_names=['Younth','YounthAduit','MiddleAged','Senior']
s=pd.cut(df['ages'],bins,labels=group_names)
df['ages_a']=s
cut_counts=s.value_counts(sort=False)
cut_counts
plt.scatter(df.index,df['ages'],cmap='Reds',c=cats.codes)
plt.grid()
#等频法:以相同数量的记录放进每个区间
#qcut方法
data=np.random.randn(1000)
s=pd.Series(data)
cats=pd.qcut(s,4)
print(pd.value_counts(cats))
#qcut 根据样本分位数对数据进行面元划分,得到大小基本相等的面元,但并不能保证每个面元含有相同数据个数
#也可以设置成自定义的分位数(0-1之间的数,包含端点):pd.qcut(data,[0,0.1,0.5,0.9,1])