离散化连续型数据
- 准备数据
准备数据detail.csv”,并将数据文件detail.csv放到到Linux本地的/course/DataAnalyze/data目录,并读取数据
In[1]: | import os import pandas as pd import numpy as np os.chdir('/course/DataAnalyze/data') detail = pd.read_csv('./detail.csv',encoding = 'gbk', engine = 'python') |
- 离散化连续型数据
- 等宽法
- pandas提供了cut函数,菜品售价使用cut函数进行等宽法离散化处理,如代码 42所示。
代码 42 等宽法离散化示例
In[2]: | price = pd.cut(detail['amounts'],5) print('离散化后5条记录售价分布为:\n' ,price.value_counts()) |
Out[2]: | 离散化后5条记录售价分布为: (0.823, 36.4] 818 (36.4, 71.8] 495 (71.8, 107.2] 134 (142.6, 178.0] 73 (107.2, 142.6] 26 Name: amounts, dtype: int64 |
- 使用等宽法离散化的缺陷从代码 42中可以很明显地看出:等宽法离散化对数据分布具有较高要求,若数据分布不均匀,那么各个类的数目也会变得非常不均匀,有些区间包含许多数据,而另外一些区间的数据极少,这会严重损坏所建立的模型。
- 等频法
- 对菜品售价使用等频法离散化如代码 43所示。
代码 43 等频法离散化示例
In[3]: | ##自定义等频法离散化函数 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) |
Out[3]: | 菜品数据等频法离散化后各个类别数目分布状况为: (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 |
- 代码 43所展现的等频法离散化的方法,相比较于等宽法离散化而言,避免了类分布不均匀的问题,但同时却也有可能将数值非常接近的两个值分到不同的区间以满足每个区间中固定的数据个数。
- 基于聚类分析的方法
- 菜品售价使用聚类分析的方法如代码 44所示。
代码 44 基于聚类分析的离散化
In[4]: | ##自定义数据K-Means聚类离散化函数 def KmeanCut(data,k): from sklearn.cluster import KMeans #引入KMeans kmodel=KMeans(n_clusters=k,n_jobs=4) ##建立模型,n_jobs是并行数 kmodel.fit(data.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(np.array(detail['amounts']),5).value_counts() ##菜品售价等频法离散化 print('菜品售价聚类离散化后各个类别数目分布状况为:','\n',result) |
Out[4]: | 菜品售价聚类离散化后各个类别数目分布状况为: (0.0, 22.31] 375 (22.31, 43.51] 551 (43.51, 73.945] 387 (73.945, 131.858] 160 (131.858, 178.0] 73 dtype: int64 |
- K-Means聚类分析的离散化方法可以很好地根据现有特征的数据分布状况进行聚类,但是由于K-Means算法本身的缺陷,用该方法进行离散化时依旧需要指定离散化后类别的数目。此时需要配合聚类算法评价方法,找出最优的聚类簇数目。