标准化数据的目的:将数据转化为同一量级,避免量级对结果产生不利的影响
数据转化的三种方式:离差标准化,标准差标准化,小数定标标准化
Ø 数据的整体分布情况并不会随离差标准化而发生改变,原先取值较大的数据,在做完离差标准化后的值依旧较大。
Ø 当数据和最小值相等的时候,通过离差标准化可以发现数据变为0。
Ø 若数据极差过大就会出现数据在离差标准化后数据之间的差值非常小的情况。
Ø 同时,还可以看出离差标准化的缺点:若数据集中某个数值很大,则离差标准化的值就会接近于0,并且相互之间差别不大。若将来遇到超过目前属性[min,max]取值范围的时候,会引起系统出错,这时便需要重新确定min和max。离差标准化的特点
# 1, 离差标准化 --- (x-min)/(max-min)
# 将数据转化为【0,1】之间
# 容易受到异常点的影响
def deviation(data):
'''
离差标准化
:param data: 传入数据
:return: 标准化之后的数据
'''
data = (data-data.min())/(data.max()-data.min())
return data
标准差标准化也叫零均值标准化或分数标准化,是当前使用最广泛的数据标准化方法。
# 2,标准差标准化 --- (x-mean)/std
# 转化完成的数据 - 将数据转化到标准差为1,均值为0的一种状态
# 容易受到异常值的影响
def stand_sca(data):
'''
标准差标准化
:param data: 传入数据
:return: 标准化之后传出的数据
'''
data = (data-data.mean())/data.std()
return data
通过移动数据的小数位数,将数据映射到区间[-1,1]之间,移动的小数位数取决于数据绝对值的最大值。
# 3, 小数定标标准化 --- x/10^k
# k -- lg(|x|.max())在向上取整【lg是以10为低的对数函数】
# 通过移动小数点来使得数据转化到【-1,1】之间
def desc_sca(data):
'''
小数定标标准化
:param data: 传入的数据
:return: 标准化之后的数据
'''
data = data/(10**numpy.ceil(numpy.log10(data.abs().max())))
return data
数据分析模型中有相当一部分的算法模型都要求输入的特征为数值型,但实际数据中特征的类型不一定只有数值型,还会存在相当一部分的类别型,这部分的特征需要经过哑变量处理才可以放入模型之中。
Ø 对于一个类别型特征,若其取值有m个,则经过哑变量处理后就变成了m个二元特征,并且这些特征互斥,每次只有一个激活,这使得数据变得稀疏。
Ø 对类别型特征进行哑变量处理主要解决了部分算法模型无法处理类别型数据的问题,这在一定程度上起到了扩充特征的作用。由于数据变成了稀疏矩阵的形式,因此也加速了算法模型的运算速度。 哑变量处理的特点
# 类别型数据转化为数值型数据
# 将类别型数据 转化为 哑变量矩阵
# 加载数据
detail = pandas.read_excel('data_file/meal_order_detail.xlsx')
print(detail.columns)
# 转化 哑变量矩阵
res = pandas.get_dummies(data=detail.loc[:,'dishes_name'],prefix='菜品',prefix_sep=':')
Ø 某些模型算法,特别是某些分类算法如ID3决策树算法和Apriori算法等,要求数据是离散的,此时就需要将连续型特征(数值型)变换成离散型特征(类别型)。
Ø 连续特征的离散化就是在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。
Ø 因此离散化涉及两个子任务,即确定分类数以及如何将连续型数据映射到这些类别型数据上。
使用等宽法离散化的缺陷为:等宽法离散化对数据分布具有较高要求,若数据分布不均匀,那么各个类的数目也会变得非常不均匀,有些区间包含许多数据,而另外一些区间的数据极少,这会严重损坏所建立的模型。
等频法离散化的方法相比较于等宽法离散化而言,避免了类分布不均匀的问题,但同时却也有可能将数值非常接近的两个值分到不同的区间以满足每个区间中固定的数据个数。
# 将连续型数据进行离散化---进行分组,将具体的值 转化为 区间数据
# 离散化相当于将数据转化为类别型数据
# 分组
res_cut = pandas.cut(detail.loc[:,'amounts'],bins=5,include_lowest=True)
# res_cut = pandas.cut(detail.loc[:,'amounts'],bins=5,include_lowest=False)
print(res_cut)
# 自定义分组
# # 【等宽分组】将数据的值域分成具有相同宽度的区间
# # include_lowest --是否包含最小值【自定义分组,必须包含最小值】
# ptp = detail.loc[:,'amounts'].max() - detail.loc[:,'amounts'].min()
# step = numpy.ceil(ptp / 5)
# bins = numpy.arange(detail.loc[:,'amounts'].min(),detail.loc[:,'amounts'].max()+step,step)
# 【等频分租】避免了类分布不均匀的问题,
bins = detail.loc[:,'amounts'].quantile(numpy.arange(0,1+1/5,1/5))
# 将数据离散化
res_cut = pandas.cut(detail.loc[:,'amounts'],bins=bins,include_lowest=True)
print(res_cut)
# 离散化之后各个区间数据所占数量
res_counts = pandas.value_counts(res_cut)
print(res_counts)
# 将离散化数据转化为哑变量矩阵
res_dum = pandas.get_dummies(res_cut,prefix='区间',prefix_sep=':')
print(res_dum)