数据归一化和连续数据离散化处理

数据归一化处理

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

数据归一化和连续数据离散化处理_第1张图片

#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()

数据归一化和连续数据离散化处理_第2张图片

#等频法:以相同数量的记录放进每个区间
#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])

数据归一化和连续数据离散化处理_第3张图片

你可能感兴趣的:(数据归一化和连续数据离散化处理)