数据处理之连续数据离散化

一些数据挖掘算法,比如Apriori算法等,要求数据是分类属性形式,需要进行连续数据离散化。

连续数据离散化就是在数据的取值范围内,设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。

离散化涉及两个子任务:

1、确定分类数

2、将连续属性值映射到这些分类值

 

举例1,先导入数据,如下:

常用的离散化方法:

1、等宽法

将数据的值域分成具有相同宽度的区间。区间的个数根据数据特点或用户指定。

缺点是对离群点比较敏感,不均匀地分布数据。

R语言:

v1 = ceiling(data[,1]*10) #宽度设为1,进行等宽离散化

Python:

import pandas as pd
data = pd.read_excel('discretization_data.xls')
data = data[u'肝气郁结证型系数'].copy()
k = 4

d1 = pd.cut(data,k,labels=range(k))

2、等频法

将相同数量的记录放进每个区间。

缺点是可能将相同的数据分到不同的区间。

R语言:

names(data) = 'f' #变量重命名

attach(data)

seq(0,length(f),length(f)/6) 等频分为6组,结果是每组的索引值

v = sort(f) #按大小排序,作为离散化的依据

v2 = rep(0,930) 定义新变量,930个0

for (i in 1:930) v2[i]=ifelse(f[i]<=v[155],1,
 ifelse(f[i]<=v[310],2,
 ifelse(f[i]<=v[465],3,
 ifelse(f[i]<=v[620],4,
 ifelse(f[i]<=v[775],5,6))))) #通过ifelse()条件判断函数分组

detach(data)

Python:

w = [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))

3、基于聚类分析的方法

两个步骤:

(1)将连续属性的值用聚类算法进行聚类,需要用户指定分组个数。

(2)将聚类得到的簇进行处理,合并到一个簇的连续属性值,并做统一标记。

R语言:

result = kmeans(data,6)

v3 = result$cluster

Python:

from sklearn.cluster import KMeans

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

 

举例2:

原始数据如下:

type = 4 #离散化的分组个数

index = 8 #TNM分期数据所在列

typelabel = c("A","B","C","D","E","F") #离散化后的标识前缀

set.seed(1234)

cols = ncol(datafile[,1:6]) 

rows = nrow(datafile[,1:6])

disdata = matrix(NA,rows,cols+1) #初始化为NA

for (i in 1:cols) {
+ cl = kmeans(datafile[,i],type,nstart = 20)
+ disdata[,i] = paste(typelabel[i],cl$cluster)
+ } #分别对单个属性列进行聚类

disdata[,cols+1] = datafile[,index]
disdata[,cols+1] = paste("H",disdata[,cols+1],sep="") #增加TNM分期数据所在列

 

  • 16
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值