文章目录
5.4 转换数据
5.4.1 哑变量处理类别型数据
代码 5-30 哑变量处理示例
数据分析模型中有相当一部分的算法模型都要求输入的特征为数值型,但实际数据中特征的类型不一定只有数值型,还会存在相当一部分的类别型,这部分的特征需要经过哑变量处理才可以放入模型之中。哑变量处理的原理示例如图。
%%html
<img src = './image/5-4-1.png',width=100,height=100>
<img src = ‘./image/5-4-1.png’,width=100,height=100>
get_dummies函数
%%html
<img src = './image/5-4-2.png',width=700,height=400>
<img src = ‘./image/5-4-2.png’,width=700,height=400>
import pandas as pd
import numpy as np
detail = pd.read_csv('../data/detail.csv',encoding = 'gbk')
data=detail.loc[0:5,'dishes_name'] ##抽取部分数据做演示
print('哑变量处理前的数据为:\n',data)
print('哑变量处理后的数据为:\n',pd.get_dummies(data))
哑变量处理前的数据为:
0 蒜蓉生蚝
1 蒙古烤羊腿
2 大蒜苋菜
3 芝麻烤紫菜
4 蒜香包
5 白斩鸡
Name: dishes_name, dtype: object
哑变量处理后的数据为:
大蒜苋菜 白斩鸡 芝麻烤紫菜 蒙古烤羊腿 蒜蓉生蚝 蒜香包
0 0 0 0 0 1 0
1 0 0 0 1 0 0
2 1 0 0 0 0 0
3 0 0 1 0 0 0
4 0 0 0 0 0 1
5 0 1 0 0 0 0
对于一个类别型特征,若其取值有m个,则经过哑变量处理后就变成了m个二元特征,并且这些特征互斥,每次只有一个激活,这使得数据变得稀疏。
对类别型特征进行哑变量处理主要解决了部分算法模型无法处理类别型数据的问题,这在一定程度上起到了扩充特征的作用。由于数据变成了稀疏矩阵的形式,因此也加速了算法模型的运算速度。
5.4.2 离散化连续型数据
代码 5-31 等宽法离散化示例
数据的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定或者用户指定,与制作频率分布表类似。pandas提供了cut函数,可以进行连续型数据的等宽离散化,其基础语法格式如下。
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
%%html
<img src = './image/5-4-3.png',width=100,height=100>
<img src = ‘./image/5-4-3.png’,width=100,height=100>
price = pd.cut(detail['amounts'],5)
print('离散化后5条记录分布:\n',price.value_counts())
离散化后5条记录分布:
(0.823, 36.4] 5461
(36.4, 71.8] 3157
(71.8, 107.2] 839
(142.6, 178.0] 426
(107.2, 142.6] 154
Name: amounts, dtype: int64
代码 5-32 等频法离散化示例
def SameRateCut(data,k):
w=data.quantile(np.arange(0,1+1.0/k,1.0/k))
data=pd.cut(data,w)
return data
result=SameRateCut(detail['amounts'],5).value_counts() ##菜品售价等频法离散化
print('菜品数据等频法离散化后各个类别数目分布状况为:','\n',result)
菜品数据等频法离散化后各个类别数目分布状况为:
(18.0, 32.0] 2107
(39.0, 58.0] 2080
(32.0, 39.0] 1910
(1.0, 18.0] 1891
(58.0, 178.0] 1863
Name: amounts, dtype: int64
代码 5-33 基于聚类分析的离散化
一维聚类的方法包括两个步骤:
将连续型数据用聚类算法(如K-Means算法等)进行聚类。
处理聚类得到的簇,将合并到一个簇的连续型数据做同一标记。
聚类分析的离散化方法需要用户指定簇的个数,用来决定产生的区间数。
k-Means聚类分析的离散化方法可以很好地根据现有特征的数据分布状况进行聚类,但是由于k-Means算法本身的缺陷,用该方法进行离散化时依旧需要指定离散化后类别的数目。此时需要配合聚类算法评价方法,找出最优的聚类簇数目。
def KmeanCut(data,k):
from sklearn.cluster import KMeans #引入KMeans
kmodel=KMeans(n_clusters=k) #建立模型
kmodel.fit(data.values.reshape((len(data), 1))) #训练模型
c=pd.DataFrame(kmodel.cluster_centers_).sort_values(0) #输出聚类中心并排序
w=c.rolling(2).mean().iloc[1:] #相邻两项求中点,作为边界点
w=[0]+list(w[0])+[data.max()] #把首末边界点加上
data=pd.cut(data,w)
return data
#菜品售价等频法离散化
result=KmeanCut(detail['amounts'],5).value_counts()
print('菜品售价聚类离散化后各个类别数目分布状况为:','\n',result)
菜品售价聚类离散化后各个类别数目分布状况为:
(22.31, 43.51] 3690
(43.51, 73.945] 2474
(0.0, 22.31] 2454
(73.945, 131.858] 993
(131.858, 178.0] 426
Name: amounts, dtype: int64
代码 5-34 菜品dishes_name哑变量处理
# 代码 5-34
data=detail.loc[:,'dishes_name']
print('哑变量处理前的数据为:\n',data.iloc[:5])
print('哑变量处理后的数据为:\n',pd.get_dummies(data).iloc[:5,:5])
哑变量处理前的数据为:
0 蒜蓉生蚝
1 蒙古烤羊腿
2 大蒜苋菜
3 芝麻烤紫菜
4 蒜香包
Name: dishes_name, dtype: object
哑变量处理后的数据为:
38度剑南春 42度海之蓝 50度古井贡酒 52度泸州老窖 53度茅台
0 0 0 0 0 0
1 0 0 0 0 0
2 0 0 0 0 0
3 0 0 0 0 0
4 0 0 0 0 0
代码 5-35 菜品售价等频法离散化
##自定义等频法离散化函数
def SameRateCut(data,k):
w=data.quantile(np.arange(0,1+1.0/k,1.0/k))
data=pd.cut(data,w)
return data
result=SameRateCut(detail['amounts'],5).value_counts() ##菜品售价等频法离散化
print('菜品数据等频法离散化后各个类别数目分布状况为:','\n',result)
菜品数据等频法离散化后各个类别数目分布状况为:
(18.0, 32.0] 2107
(39.0, 58.0] 2080
(32.0, 39.0] 1910
(1.0, 18.0] 1891
(58.0, 178.0] 1863
Name: amounts, dtype: int64
小结
本章以菜品数据为例子,实现了数据分析的数据预处理过程,即数据清洗、数据合并、数据标准化和数据转换。这四个步骤并不存在严格的先后关系,实际工作中往往需要交叉工作。
数据清洗主要介绍了对重复数据、缺失值和异常值的处理。
重复数据处理细分为记录去重和特征去重。
缺失值处理方法分为删除、替换和插值。
异常值介绍了3σ原则和箱线图识别这两种识别方法。
数据合并是将多个数据源中的数据合并存放到一个数据存储的过程。
数据标准化介绍了如何将不同量纲的数据转化为可以相互比较的标准化数据。
数据转换介绍了如何从不同的应用角度对已有特征进行转换。