连续属性离散化,就是将数值型变量转化为离散型变量
类似于指标转维度的那种感觉
前面说过,连续属性离散化有几种方式:
- 等宽法
- 等频法
- 聚类分析法
下面我们通过小栗子来看看如何应用
数据集
这是书中提供的例子
df = pd.read_excel(data_path)
df.head()
一共9白多条记录
df.info()
在做离散化之前,我们需要思考下,我们需要分成多少块
实际应用的时候,应该考虑该数据涉及的业务场景,或者数据本身的一些特征
我感觉可以画个散点图来瞧一瞧
df.reset_index(inplace=True)
df.plot.scatter(x='index' , y='肝气郁结证型系数')
看上去不是非常明显,但还是有5堆的感觉
但是,书中提到的是,分割成4份,下面也是按照4份来看的
等宽法
等宽法比较好处理,就是按照相同的间距进行分割
和直方图很像,可以使用pandas.cut
函数
参考:pandas函数-cut
k = 4
df1 = pd.cut(df['肝气郁结证型系数'].values , k , labels=range(k))
k就是我们要分割的份数,
df['等宽离散化'] = df1.codes
df.groupby('等宽离散化').count()
然后,我们看一下这个等宽
df2['max']-df2['min']
书中是画了个一个图来看,更加直观
sns.relplot(x='肝气郁结证型系数' , y='等宽离散化' , hue='等宽离散化' , data=df , palette=['r','y','b','g'])
等频法
这个方法就是保证每个区间内的元素个数一样,就像四分位数一样,正好书中也是分成4份
书中写了一个等频法的方法,虽然这里正巧是四分位
data = df['肝气郁结证型系数'].copy()
w = [1.0*i/k for i in range(k+1)]
w = data.describe(percentiles=w)[4:4+k+1]
w[0] = w[0]*(1-1e-10)
w
上面是构造了一个区间,然后使用describe函数,直接获取分位数
然后,依然使用cut
函数
df_dp = pd.cut(data , w , labels=range(k))
df['等频离散化'] = df_dp
df.groupby('等频离散化')['肝气郁结证型系数'].agg({'count','min','max'})
这个数量并不是完全分割,估计和中位数的算法有点儿关系,具体我没有研究
我们可以使用同样的方式来展示下最终的数据:
sns.relplot(x='肝气郁结证型系数' , y='等频离散化' , hue='等频离散化' , data=df , palette=['r','y','b','g'])
聚类分析法
这个是调用sklearn的包,这里先不说了,后面会专门来整理算法相关的内容,请期待。