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

python 数据离散化 pandas数据离散化_取值


将结果转换成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)

python 数据离散化 pandas数据离散化_离散化_02

  • 自定义分组
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

python 数据离散化 pandas数据离散化_取值_03


将结果转换成one-hot编码

pd.get_dummies(score_data)

python 数据离散化 pandas数据离散化_离散化_04

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

python 数据离散化 pandas数据离散化_python 数据离散化_05


统计每个箱子的样本数:

pd.value_counts(score_data)

可以看出qcut自动分箱,每个箱子的样本数都是一样的

python 数据离散化 pandas数据离散化_python 数据离散化_06

  • 指定分位数分组
# 指定分位数
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

分组如下:

python 数据离散化 pandas数据离散化_离散化_07

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

python 数据离散化 pandas数据离散化_python 数据离散化_08


把边界值去掉,转成one-hot编码(retbins= True会报错TypeError: unhashable type: ‘Categorical’)

pd.get_dummies(score_data)

python 数据离散化 pandas数据离散化_python 数据离散化_09

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

python 数据离散化 pandas数据离散化_数据_10


将指定列转换成one-hot 编码

pd.get_dummies(df[1])

python 数据离散化 pandas数据离散化_取值_11


将指定列进行get_dummies 后合并到原数据中

df.join(pd.get_dummies(df[1]))

python 数据离散化 pandas数据离散化_数据_12

  • 数值映射

数据准备

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

python 数据离散化 pandas数据离散化_python 数据离散化_13


设置映射关系

size_mapping = {
    'XL': 3,
    'L': 2,
    'M': 1}
df['size'] = df['size'].map(size_mapping)  
df

python 数据离散化 pandas数据离散化_数据_14


指定要进行转换的列

pd.get_dummies(df ,columns = ['size'])

python 数据离散化 pandas数据离散化_数据_15


去除第一个第一项类别值

pd.get_dummies(df ,columns = ['size'],drop_first=True)

python 数据离散化 pandas数据离散化_python 数据离散化_16