头歌数据挖掘算法离散化 数据的离散化处理_离散化


原文:《Python 数据分析与数据化运营》第3章:11条数据化运营不得不知道的数据预处理经验

所谓离散化,就是把无限空间中有限的个体映射到有限的空间中。数据离散化操作大多是针对连续数据进行的,处理之后的数据值域分布将从连续属性变为离散属性,这种属性一般包含2个或2个以上的值域。

离散化处理的原因:

  1. 节约计算资源,提高计算效率
  2. 算法模型(特别是分类算法)的计算需要
  3. 增强模型的稳定性和准确度
  4. 特定数据处理和分析的必要步骤(图像处理方面应用广泛)
  5. 模型结果应用和部署的需要

离散化通常针对连续数据进行处理,但是在很多情况下也可以针对已经是离散化的数据进行处理。这种场景一般是离散数据本身的划分过于复杂、琐碎甚至不符合业务逻辑,需要进一步做数据聚合或重新划分。

代码示例:


import pandas as pd
from sklearn.cluster import KMeans
from sklearn import preprocessing

df = pd.read_table('F:/Data/3_data7.txt', names=['id', 'amount', 'income', 'datetime', 'age'])
print(df.head())


头歌数据挖掘算法离散化 数据的离散化处理_离散化_02


#针对时间数据的离散化
for i, signle_data in enumerate(df['datetime']): #循环得到索引和对应值
    signle_data_tmp = pd.to_datetime(signle_data) #将时间转换为datetime格式 to_datetime()无法针对数据框或Series做整体转换,因此需要循环
    df['datetime'][i] = signle_data_tmp.weekday() #离散化为周几
print(df.head())


头歌数据挖掘算法离散化 数据的离散化处理_头歌数据挖掘算法离散化_03


#针对多值离散数据的离散化
map_df = pd.DataFrame([['0-10', '0-40'], ['10-20', '0-40'], ['20-30', '0-40'], ['30-40', '0-40'], ['40-50', '40-80'], ['50-60', '40-80'],
                     ['60-70', '40-80'], ['70-80', '40-80'], ['80-90', '>80'], ['>90', '>80']], columns=['age', 'age2']) #定义要转换的新区间
print(map_df)
df_tmp = pd.merge(left=df, right=map_df, how='inner', left_on='age', right_on='age')
#df = df_tmp.drop('age', axis=1).sort_values(by=['id'])
df = df_tmp.sort_values(by=['id'])
print(df.head())


头歌数据挖掘算法离散化 数据的离散化处理_聚类_04


#针对多值离散数据的离散化(方法二)
tmp_list = []
for a in df['age']:
    if a in ('0-10', '10-20', '20-30', '30-40'):
        tmp = '0-40'
    elif a in ('40-50', '50-60', '60-70', '70-80'):
        tmp = '40-80'
    elif a in ('80-90', '>90'): #注意,这个地方的结果用else,会造成前面的经过处理后的分类最终全部变成'>80,所以每一个条件必须写清楚
        tmp = '>80'
    tmp_list.append(tmp)
df['age'] = tmp_list
df.head()

#针对连续数据的离散化
#方法1:自定义分箱区间实现离散化
bins = [0, 200, 1000, 5000, 10000] #自定义区间边界
df['amount1'] = pd.cut(df['amount'], bins) #使用边界做离散化
print(df.head())


头歌数据挖掘算法离散化 数据的离散化处理_数据_05


#方法2:聚类法实现离散化
import numpy as np
data = df['amount']
#通过pandas指定列名获得的数据默认都没有列值,形状为(100, 0),需要将输入变量做形状转换
data_reshape = np.array(data).reshape([df.shape[0], 1])
model_kmeans = KMeans(n_clusters=4, random_state=0) #创建KMeans模型并指定要聚类的数量
kmeans_result = model_kmeans.fit_predict(data_reshape) #建模聚类
df['amount2'] = kmeans_result 
print(df.head())


头歌数据挖掘算法离散化 数据的离散化处理_聚类_06


#方法3:使用4分位数实现离散化
df['amount3'] = pd.qcut(df['amount'], 4, labels=['bad', 'medium', 'good', 'awesome'])
df = df.drop('amount', 1)
print(df.head())


头歌数据挖掘算法离散化 数据的离散化处理_头歌数据挖掘算法离散化_07


#针对连续数据的二值化
binarizer_scaler = preprocessing.Binarizer(threshold=df['income'].mean()) #建立Binarizer模型对象

#Binarizer标准化转换
income_tmp = binarizer_scaler.fit_transform(np.array(df['income']).reshape([df['income'].shape[0], 1])) #需要先转为np.ndarry然后再使用
#print(income_tmp[:5])
#print(type(income_tmp)) #<class 'numpy.ndarray'>

income_tmp.resize(df['income'].shape) #转换数据形状
#print(income_tmp.shape) #(100,)
df['income'] = income_tmp
print(df.head())


头歌数据挖掘算法离散化 数据的离散化处理_头歌数据挖掘算法离散化_08


离散化其他注意事项:

  • 1.使用决策树时往往倾向于少量的离散化区间,原因是过多的离散化将使得规则过多受到碎片区间的影响。
  • 2.关联规则需要对所有特征一起离散化,原因是关联规则关注的是所有特征的关联关系,如果对每个列单独离散化将失去整体规则性。