开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天
一、本篇笔记重点内容:
- 数据离散化
- 常用的离散化方法
- 等距离散化
- 等频离散化
- 聚类离散化
二、详细知识点介绍
数据离散化
- 数据集的字段取值通常有两种类型:连续型、离散型
- 连续型:取值为实数,通常用浮点数来表示 比如商品的销量、天气的气温、经济增长率等
- 离散型:通常用概念或符号来表示数据所包含的含义 比如用数字集合{ 1,2,3,4}量化人们对事物的偏好程度
等距离散化
- 根据连续型属性的取值,将其均匀地划分为k个宽度近似相等的区间;
- 属性的取值相应地划入对应的区间,完成离散化;
等距离散化的过程
- 用f表示需要进行离散化的连续型属性,通过属性的最大值f_max和最小值f_min计 算出区间段的宽度: w=f_max−f_min/k
- 根据求得的区间宽度,以及取值集合的最值,找到k - 1个切分点,从而完成 数据的离散化过程
对数据集data_pandas的birth_rates属性进行等距离散化
给定离散化后的子区间段个数为5,可以得到4个切分点;
data_pandas = pd.DataFrame(data,columns=['birth_rates','per_capita_income',
'proportion_of_population_farming','infant_mortality'])
cuts = pd.cut(data_pandas['birth_rates'], 5)
print (cuts)
根据代码的输出结果,birth_rates的取值区间被分为5个等宽的子区间段
等频离散化
等频离散化
- 区间段的宽度不再要求保持一致,离散化后区间内的数据量尽可能均衡
- 依照属性取值的总量n,将其划分为k个区间段
- 使得每个区间段包含的数据个数为n/k
- 每个区间所含数据的取值范围就是离散化后的新区间
对数据集data_pandas的birth_rates属性进行等频离散化
q_cuts=pd.qcut(data_pandas['birth_rates'],4)
binss= q_cuts.values
print (binss)
pd.value_counts(q_cuts)
与等距离散化不同
- cut函数还可以接收区间段的端点集合作为参数,依此划分原始取值区间
- 使用cut函数进行等频离散化,返回结果freq_cuts
freq_cuts=pd.cut(data_pandas[‘birth_rates’],bins,include_lowest=True)
print freq_cuts
- 经过等频离散化后birth_rates依然被划分到四个区间中;
- 区间宽度不再保持一致,尽力让每个区间的数据量相同;
聚类离散化
- 聚类算法将一系列数据点划分到不同的类:
- 使得同一类中的数据点有很大的相似性,
- 不同类间的数据点有大的差异性;
- 可以更好的代表原始数据的信息
K-means是一种经典的聚类算法
- 除了一般的聚类场景,K-means可用来实现连续型属性的离散化
- 与等频等距离散化相比,K-means离散化可以把原始数据的分布信息考虑进来
其他离散化方法
- 类别属性相互依赖最大化:
- 基于熵的属性离散化方法,采取自顶向下的策略。通过选择切分点p,把属性的取值空间划分为f≤p和f>p两个子区间段。衡量切分点选择优劣的度量方法是类别属性的相互依赖程度
- 信息增益离散化:思路来自于决策树模型建立时基于信息增益的评价标准,建立决策树模型时用信息增益来分裂连续型特征的准则在实际处理中效果很好 。
总结
- 离散化将连续型数据分段,数据中的异常值会直接划入相应的区间段中:
- 增强模型对于数据异常值的鲁棒性
- 离散化后的属性,其取值均转化为有明确含义的区间号,使得数据的可解释性更强,模型更易于理解和应用
- 连续型属性经离散化处理,属性取值大大减少,提升模型训练的计算效率