1、什么是数据的离散化
连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数值代表落在每个子区间中的属性值。
2、为什么要离散化
- 为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具
- 扔掉一些信息,可以让模型更健壮,泛化能力更强
3、离散化之pandas.cut()
等宽分箱或自定义分组
- 等宽分箱
import pandas as pd
import numpy as np
'''
pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise')
常用参数说明:
x:被切分的类数组(array-like)数据,必须是1维的
bins:被切割后的区间,一般为整型,但也可以为标量序列
若为整型,表示将x切割成bins等份
若为标量序列,表示被分割后每一个bin的区间边缘
right:默认为True,表示是右边区间为闭合状态。
labels:给分割后的bins打标签
'''
score = np.array([50,87,92,82,99,72,65,55,78,75,88,81])
score_data = pd.cut(score,3)
score_data
将结果转换成one-hot编码
'''
pd.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
常用参数说明:
data:array-like, Series, or DataFrame
prefix : 转换后,列名的前缀
columns :指定需要实现类别转换的列名
dummy_na :增加一列表示空缺值,如果False就忽略空缺值
drop_first : 获得k中的k-1个类别值,去除第一个
'''
pd.get_dummies(score_data)
- 自定义分组
score = np.array([50,87,92,82,99,72,65,55,78,75,88,81])
# 自定义区间边缘值
score_data = pd.cut(score,[50,65,85,100])
score_data
将结果转换成one-hot编码
pd.get_dummies(score_data)
3、离散化之pandas.qcut()
等频分箱或等深分箱,根据样本的分位数对数据划分,每个区间中含有的样本数量相同。
- 自动分组
'''
pd.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')
常用参数说明:
x:要被切分的数据,一维数组
q:整数或由分位数组成的数组
若为整数,表示将x切割成q份
若为分位数,10用于十分位,4用于四分位,依此类推。eg: [0,.25,.5,.75,1.]
labels:给分割后的q个区间打标签
'''
score = np.array([50,87,92,82,99,72,65,55,78,75,88,81])
score_data = pd.qcut(score,3)
score_data
统计每个箱子的样本数:
pd.value_counts(score_data)
可以看出qcut自动分箱,每个箱子的样本数都是一样的
- 指定分位数分组
# 指定分位数
score = np.array([50,87,92,82,99,72,65,55,78,75,88,81])
score_data = pd.qcut(score,[0,0.5,0.6,0.8,1])
score_data
分组如下:
score = np.array([50,87,92,82,99,72,65,55,78,75,88,81])
# retbins返回边界值,labels指定各分组标签
score_data = pd.qcut(score,[0,0.5,0.6,0.8,1],retbins= True,labels=['D','C','B','A'])
score_data
把边界值去掉,转成one-hot编码(retbins= True会报错TypeError: unhashable type: ‘Categorical’)
pd.get_dummies(score_data)
4、离散值特征提取
1、离散特征的取值之间没有大小的意义,比如color:[red,blue],那么就使用one-hot编码
2、离散特征的取值有大小的意义,比如size:[X,XL,XXL],那么就使用数值的映射{X:1,XL:2,XXL:3}
- one-hot encoding
将离散型特征的每一种取值都看成一种状态,若这一特征中有N个不相同的取值,那么我们就可以将该特征抽象成N种不同的状态,one-hot编码保证了每一个取值只会使得一种状态处于“激活态”,也就是说这N种状态中只有一个状态位值为1,其他状态位都是0。
数据如下:
df = pd.DataFrame([['A','Red']
,['B','Green']
,['C','Orange']
,['D','Red']
,['E','Red']
,['F','Green']])
df
将指定列转换成one-hot 编码
pd.get_dummies(df[1])
将指定列进行get_dummies 后合并到原数据中
df.join(pd.get_dummies(df[1]))
- 数值映射
数据准备
df = pd.DataFrame([
['Ada', 'M', 10.1],
['Lily', 'M', 10.1],
['Tom', 'L', 13.5],
['Anne', 'M', 10.1],
['Jim', 'XL', 15.3]])
df.columns = ['color', 'size', 'prize']
df
设置映射关系
size_mapping = {
'XL': 3,
'L': 2,
'M': 1}
df['size'] = df['size'].map(size_mapping)
df
指定要进行转换的列
pd.get_dummies(df ,columns = ['size'])
去除第一个第一项类别值
pd.get_dummies(df ,columns = ['size'],drop_first=True)