美文网首页
【数据分析】-005-数据预处理-数据变换

【数据分析】-005-数据预处理-数据变换

作者: 张雅琛 | 来源:发表于2020-02-15 00:56 被阅读0次

数据变换

数据变换主要是对数据进行规范化处理,将数据转换成“适当的”形式,以适用于挖掘任务及算法的需要。

简单函数变换

简单函数变换是对原始数据进行某些数学函数变换,常用的变换包括平方、开方、取对数、差分运算等,即:
x'=x^2\\ x'=\sqrt{x}\\ x'=log(x)\\ \nabla f(x_k)=f(x_{k+1})-f(x_k)
简单的函数变换常用来将不具有正态分布的数据变换成具有正态分布的数据。
在时间序列分析中,有时简单的对数变换或者差分运算就可以将非平稳序列转换成平稳序列。

规范化

数据规范化(归一化)处理是数据挖掘的一项基础工作。不同评价指标往往具有不同的量纲,数值间的差别可能很大,不进行处理可能会影响到数据分析的结果。为了消除指标之间的量纲和取值范围差异的影响,需要进行标准化处理,将数据按照比例进行缩放,使之落入一个特定的区域,便于进行综合分析。
数据规范化对于基于距离的挖掘算法尤为重要。

(1)最小-最大规范化
最小-最大规范化也称为离差标准化,是对原始数据的线性变换,将数值值映射到[0,1]之间。转换公式如下:
x^*=\frac{x-min}{max-min}
其中,max为样本数据的最大值,淅沅为样本数据的最小值。min为极差。离差标准化保留了原来数据中存在的关系,是消除量纲和数据取值范围影响的最简单方法。这种处理方法的缺点是若数值集中且某个数值很大,则规范化后各值会接近于0,并且将会相差不大。若将来遇到超过目前属性[min,max]范围的时候,会引起系统出错,需要重新确定min和max。

(2)零-均值规范化
零-均值规范化也称标准差标准化,经过处理的数据的均值为0,标准差为1。转化公式为:
x^* = \frac{x-\overline{x}}{\sigma}
其中\overline{x}为原始数据的均值,\sigma为原始数据的标准差,是当前用得最多的数据标准化方法。
(3)小数定标规范化
通过移动属性值的小数位数,将属性值映射到[-1,1]之间,移动的小数位数取决于属性值绝对值的最大值。转化公式为:
x^* = \frac{x}{10^k}

#  数据规范化代码
import pandas as pd
import numpy as np

datafile = '../data/normalization_data.xls' #参数初始化
data = pd.read_excel(datafile, header = None) #读取数据
print('最小-最大规范化')
print((data - data.min())/(data.max() - data.min())) #最小-最大规范化
print('零-均值规范化')
print((data - data.mean())/data.std()) #零-均值规范化
print('小数定标规范化')
print(data/10**np.ceil(np.log10(data.abs().max()))) #小数定标规范化

连续属性离散化

一些数据挖掘算法,特别是某些分类算法(如ID3算法、Apriori算法等),要求数据是分类属性形式。这样,常常需要将连续属性变换成分类属性,即连续属性离散化。

1.离散化的过程

连续属性的离散化就是在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。所以,离散化涉及两个子任务:确定分类数以及如何将连续属性值映射到这些分类值。

2.常用的离散化方法

常用的离散化方法有等宽法、等频法和(一维)聚类。
(1)等宽法
将属性的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定,或者由用户指定,类似于制作频率分布表。
(2)等频法
将相同数量的记录放进每个区间。
这两种方法简单,易于操作,但都需要人为地规定划分区间的个数。同时,等宽法的缺点在于它对离群点比较敏感,倾向于不均匀地把属性值分布到各个区间。有些区间包含许多数据,而另外一些区间的数据极少,这样会严重损坏建立的决策模型。等频法虽然避免了上述问题的
产生,却可能将相同的数据值分到不同的区间以满足每个区间中固定的数据个数。
(3)基于聚类分析的方法
一维聚类的方法包括两个步骤,首先将连续属性的值用聚类算法(如 K-Means 算法)进行聚类,然后再将聚类得到的簇进行处理,合并到一个簇的连续属性值并做同一标记。聚类分析的离散化方法也需要用户指定簇的个数,从而决定产生的区间数。

中医证型连续属性离散化数据

肝气郁结证型系数 0.056 0.488 0.107 0.322 0.242 0.389
# 数据规范化
import pandas as pd
from sklearn.cluster import KMeans  # 引入KMeans
import matplotlib.pyplot as plt
%matplotlib inline

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

# 等频率离散化
w = [1.0*i/k for i in range(k+1)]
w = data.describe(percentiles=w)[4:4+k+1]  # 使用describe函数自动计算分位数
w[0] = w[0]*(1-1e-10)
d2 = pd.cut(data, w, labels=range(k))

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 = c.rolling(2).mean().iloc[1:]  # 相邻两项求中点,作为边界点
w = [0] + list(w[0]) + [data.max()]  # 把首末边界点加上
d3 = pd.cut(data, w, labels=range(k))


def cluster_plot(d, k):  # 自定义作图函数来显示聚类结果
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

    plt.figure(figsize=(8, 3))
    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()

分别用等宽法、等频法和(一维)聚类对数据进行离散化,将数据分成4类,然后将每一类记为同一个标识,如分别记为Al、A2、A3、A4,再进行建模。

属性构造

在数据挖掘的过程中,为了提取更有用的信息,挖掘更深层次的模式,提高挖掘结果的精度,我们需要利用已有的属性集构造出新的属性,并加入到现有的属性集合中。

  • 防窃漏电诊断建模时
    已有的属性包括供入电量、供出电量(线路上各大用户用电量之和)。理论上供入电量和供出电量应该是相等的,但是由于在传输过程中存在电能损耗,使得供入电量略大于供出电量,如果该条线路上的一个或多个大用户存在窃漏电行为,会使得供入电量明显大于供出电量。反过来,为了判断是否有大用户存在窃漏电行为,可以构造出一个新的指标一线损率,该过程就是构造属性。新构造的属性线损率按如下公式计算。

线损率=\frac{供入电量-供出电量}{供入电量}*100\%
线损率的正常范围一般在 3%〜15%,如果远远超过该范围,就可以认为该条线路的大用户很可能存在窃漏电等用电异常行为。

#线损率属性构造
import pandas as pd

#参数初始化
inputfile= '../data/electricity_data.xls' #供入供出电量数据
outputfile = '../tmp/electricity_data.xls' #属性构造后数据文件

data = pd.read_excel(inputfile) #读入数据
data[u'线损率'] = (data[u'供入电量'] - data[u'供出电量'])/data[u'供入电量']

# data.to_excel(outputfile, index = False) #保存结果
data

小波变换

小波变换的同是一种新型的数据分析工具,是近年来兴起的信号分析手段。小波分析的理论和方法在信号处理、图像处理、语音处理、模式识别、量子物理等领域得到越来越广泛的应用,它被认为是近年来在工具及方法上的重大突破。小波变换具有多分辨率的特点,在时域和频域都具有表征信号局部特征的能力,通过伸缩和平移等运算过程对信号进行多尺度聚焦分析,提供了一种非平稳信号的时频分析手段,可以由粗及细地逐步观察信号,从中提取有用信息。
能够刻画某个问题的特征量往往是隐含在一个信号中的某个或者某些分量中,小波变换可以把非平稳信号分解为表达不同层次、不同频带信息的数据序列,即小波系数。选取适当的小波系数,即完成了信号的特征提取。下面将介绍基于小波变换的信号特征提取方法。
(1)基于小波变换的特征提取方法
基于小波变换的特征提取方法主要有:基于小波变换的多尺度空间能量分布特征提取、基于小波变换的多尺度空间的模极大值特征提取、基于小波包变换的特征提取、基于适应性小波神经网络的特征提取。

  • 基于小波变换的特征提取方法
基于小波变换的特征提取方法 基于小波变换的特征提取方法
基于小波变换的多尺度空间能量分布特征提取方法 各尺度空间内的平滑信号和细节信号能提供原始信号的时频局域信息,特别是能提供不同频段上信号的构成信息。把不同分解尺度上信号的能量求解出来,就可以将这些能量尺度顺序排列,形成特征向量供识别用
基于小波变换的多尺度空间的模极大值特征提取方法 利用小波变换的信号局域化分析能力,求解小波变换的模极大值特性来检测信号的局部奇异性,将小波变换模极大值的尺度参数s、平移参数t及其幅值作为目标的特征量
基于小波包变换的特征提取方法 利用小波分解,可将时域随机信号序列映射为尺度域各子空间内的随机系数序列,按小波包分解得到的最佳子空间内随机系数序列的不确定性程度最低, 将最佳子空间的嫡值及最佳子空间在完整二叉树中的位置参数作为特征量,可以用于目标识别
基于适应性小波神经网络的特征提取方法 基于适应性小波神经网络的特征提取方法可以把信号通过分析小波拟合表示,进行特征提取

(2)小波基函数
小波基函数『种朝局部姓的函数,并且平均值为0,小波基函数满足 \psi (0)=f_{\psi}dt=0 。 常用的小波基有Haar小波基、db系列小波基等。
(3)小波变换
对小波基函数进行伸缩和平移变换:
\psi_{a,b}(t)=\frac{1}{\sqrt{|a|}}\psi (\frac{t-b}{a})
其中,a为伸缩因子,b为平移因子。
任意函数f(t)的连续小波变换(CWT)为:
w_f(a,b)=|a|^{-1/2}\int f(t)\psi(\frac{t-b}{a})dt
可知,连续小波变换为 f(t)\rightarrow w_f(a,b)的映射,对小波基函数\psi (t)增加约束条件C_{\psi}=\int \frac{|\hat{\psi}(t)|^2}{t}dt,就可以
w_f(a,b) 逆变换得到f(t)。其中照\hat{\psi}(t) 为\psi(t)的傅里叶变换。
其逆变换为:
f(t)=\frac{1}{C_{\psi}}\iint \frac{1}{a^2}\psi(\frac{t-b}{a})da \cdot db
(4)基于小波变换的多尺度空间能量分布特征提取方法
应用小波分析技术可以把信号在各频率波段中的特征提取出来,基于小波变换的多尺度空间能量分布特征提取方法是对信号进行频带分析,再分别以计算所得的各个频带的能量作为特征向量。
信号f(t)的二进小波分解可表示为:
f(t)=A^j+\sum D^j
其中A是近似信号,为低频部分;D是细节信号,为高频部分,此时信号的频带分布如图 4-6 所
示。
信号的总能量为:E=EA_j+\sum ED_j
选择第j层的近似信号和各层的细节信号的能量作为特征,构造特征向量: F=[EA_j,ED_1,ED_2,...,ED_j]

利用小波变换可以对声波信号进行特征提取,提取出可以代表声波信号的向量数据,即完成从声波信号到特征向量数据的变换。本例利用小波函数对声波信号数据进行分解,得到5个层次的小波系数。利用这些小波系数求得各个能量值,这些能量值即可作为声波信号的特征数据。

#小波变换特征提取代码
#参数初始化
inputfile= '../data/leleccum.mat' #提取自Matlab的信号文件

from scipy.io import loadmat #mat是MATLAB专用格式,需要用loadmat读取它
mat = loadmat(inputfile)
signal = mat['leleccum'][0]
print("signal:")
print(signal)
import pywt #导入PyWavelets
coeffs = pywt.wavedec(signal, 'bior3.7', level = 5)
#返回结果为level+1个数字,第一个数组为逼近系数数组,后面的依次是细节系数数组
print('coeffs:')
print(coeffs)

相关文章

  • 【数据分析】-005-数据预处理-数据变换

    数据变换 数据变换主要是对数据进行规范化处理,将数据转换成“适当的”形式,以适用于挖掘任务及算法的需要。 简单函数...

  • 1分钟了解数据分析挖掘体系

    总体上来讲,数据分析挖掘体系可分为数据预处理、分析挖掘、数据探索、数据展现和分析工具。 数据预处理 数据预处理包含...

  • CPDA_数据的获取_2019-07-15

    数据分析的主要流程涵盖:数据的获取、数据预处理、数据模型分析、数据可视化等,其中数据预处理很重要,数据模型分析较为...

  • Day1|Python数据分析与挖掘实战|数据预处理(一)

    数据预处理(一)数据清洗、数据集成和数据变换 http://nbviewer.jupyter.org/github...

  • R数据分析实战—LOL中游戏时长对双方阵营胜率的影响

    复杂数据分析处理的一般过程为:理解数据——>数据导入——>数据预处理——>数据计算——>数据显示其中,数据的预处理...

  • 3. 数据预处理

    数据预处理主要包括4个部分: 数据清洗 数据集成 数据变换 数据规约 1. 数据清洗 缺失值处理: 删除数据 不处...

  • 第三章-数据预处理

    数据预处理的主要内容包括数据清洗、数据集成、数据变换和数据规约。 3.1数据清洗 数据清洗主要是删除原始数据集中的...

  • 非均衡数据处理--如何评价?

    ​在分类问题中, 常见的数据预处理包括: 数据缺失(Missing), 奇值处理(Outlier), 数据变换(T...

  • 数据挖掘算法(一)

    数据挖掘,根据我的学习,包括数据预处理、数据模式分析、数据分类、数据聚类分析、离群值分析等。 前言 其实我们在中学...

  • 如何做好数据预处理(一)

    数据分析中,需要先挖掘数据,然后对数据进行处理。数据预处理的字面意思就是对于数据的预先处理,数据预处理的作用就是为...

网友评论

      本文标题:【数据分析】-005-数据预处理-数据变换

      本文链接:https://www.haomeiwen.com/subject/iugsfhtx.html