4.3.3 连续属性离散化

一些数据挖掘算法,要求数据是分类属性形式的。所以常常需要将连续属性变换成分类属性,即连续属性离散化。

常用的离散化方法

  • 等宽法
    将属性的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定,或者由用户指定,类似于制作频率分布表。
  • 等频法
    将相同数量的记录放进每个区间,每个区间数据值个数相同
  • 基于聚类分析的方法
    一维聚类的方法包括两个步骤,首先将连续属性的值用聚类(如K-Means算法) 进行聚类,然后再将聚类得到的簇进行处理,合并到一个簇的连续属性值并做统一标记。聚类分析的离散化方法也需要用户指定簇的个数,从而决定产生的区间数。
import numpy as pd
import pandas as pd
datafile = './data/discretization_data.xls'
data = pd.read_excel(datafile)  # 读取数据
data = data[u'肝气郁结证型系数'].copy()  # 复制此对象的索引和数据
k = 4

# 等宽离散化
d1 = pd.cut(data, k, labels=range(k))  # 等宽离散化,各个类比依次命名为: 0, 1, 2, 3
pd.value_counts(d1)

# 等频率离散化
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)
d2 = pd.cut(data, w, labels=range(k))


from sklearn.cluster import KMeans  # 引入KMeans
kmodel = KMeans(n_clusters = k, n_jobs = 4)  # 建立模型,n_jobs是并行数,一般等于CPU数
kmodel.fit(data.values.reshape(len(data), 1))  # 训练模型
c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0)  # 输出聚类中心,并且排序(默认是随机序的)
w = pd.DataFrame.rolling(c, 2).mean().iloc[1:]  # 相邻两项求中心,作为边界点
w = [0] + list(w[0]) + [data.max()]  # 把首末边界点加上
d3 = pd.cut(data, w, labels=range(k))


# 自定义作图函数来显示聚类结果
def cluster_plot(d, k):
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号
    
    plt.figure(figsize=(16, 8))  # 设置图像显示大小
    for j in range(0, k):
        plt.plot(data[d==j], [j for i in d[d==j]], 'o')
    
    plt.ylim(-0.5, k-0.5)
    return plt

cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()

image.png

你可能感兴趣的:(4.3.3 连续属性离散化)