數(shù)據(jù)探索 —— 數(shù)據(jù)預(yù)處理 2

數(shù)據(jù)集成

數(shù)據(jù)挖掘需要的數(shù)據(jù)往往分布在不同的數(shù)據(jù)源中,數(shù)據(jù)集成就是將多個(gè)數(shù)據(jù)源合并存放在一個(gè)一致的數(shù)據(jù)存儲(chǔ)(如數(shù)據(jù)倉(cāng)庫(kù))中的過(guò)程。
在數(shù)據(jù)集成時(shí),來(lái)自多個(gè)數(shù)據(jù)源的現(xiàn)實(shí)世界實(shí)體的表達(dá)形式是不一樣的,有可能不匹配,要考慮實(shí)體識(shí)別問(wèn)題和屬性冗余問(wèn)題,從而將元數(shù)據(jù)在最低層上加以轉(zhuǎn)換、提煉和集成。

實(shí)體識(shí)別

實(shí)體識(shí)別是指從不同數(shù)據(jù)源識(shí)別出現(xiàn)實(shí)世界的實(shí)體,它的任務(wù)是統(tǒng)一不同源數(shù)據(jù)的矛盾之處,常見(jiàn)形式如下。

  1. 同名異議
    數(shù)據(jù)源A中的屬性ID和數(shù)據(jù)源B中的屬性ID分別描述的菜品編號(hào)和訂單編號(hào),即描述的是不同的實(shí)體。
  2. 異名同義
    數(shù)據(jù)源A中的sales_dt和數(shù)據(jù)源B中的sales_date都是描述銷售日期的,即A.sales_dt=B.sales_date。
  3. 單位不統(tǒng)一
    描述同一個(gè)實(shí)體分別用的是國(guó)際單位和中國(guó)傳統(tǒng)的計(jì)量單位。
    檢測(cè)和解決這些沖突就是實(shí)體識(shí)別的任務(wù)。

冗余屬性識(shí)別

數(shù)據(jù)集成往往導(dǎo)致數(shù)據(jù)冗余,例如,
1)統(tǒng)一屬性多次出現(xiàn);
2)同一屬性命名不一致導(dǎo)致重復(fù)。
仔細(xì)整合不同源數(shù)據(jù)能減少甚至避免數(shù)據(jù)冗余與不一致,從而提高數(shù)據(jù)挖掘的速度和質(zhì)量。對(duì)于冗余屬性要先分析,檢測(cè)到后再將其刪除。
有些冗余屬性可以用相關(guān)分析檢測(cè)。給定兩個(gè)數(shù)值型的屬性A和B,根據(jù)其屬性值,用相關(guān)系數(shù)度量一個(gè)屬性在多大程度上蘊(yùn)含另一個(gè)屬性。

數(shù)據(jù)變換

數(shù)據(jù)變換主要是對(duì)數(shù)據(jù)進(jìn)行規(guī)范化處理,將數(shù)據(jù)轉(zhuǎn)換成“適當(dāng)?shù)摹毙问?,以適用于挖掘任務(wù)及算法的需要。

簡(jiǎn)單函數(shù)變換

簡(jiǎn)單函數(shù)變換是對(duì)原始數(shù)據(jù)進(jìn)行某些數(shù)學(xué)函數(shù)變換,常用的變換包括平方、開(kāi)方、取對(duì)數(shù)、差分運(yùn)算等,即:



簡(jiǎn)單的函數(shù)變換常用來(lái)將不具有正態(tài)分布的數(shù)據(jù)變換成具有正態(tài)分布的數(shù)據(jù)。在時(shí)間序列分析中,有時(shí)簡(jiǎn)單的對(duì)數(shù)變換或者差分運(yùn)算就可以將非平穩(wěn)序列轉(zhuǎn)換成平穩(wěn)序列。在數(shù)據(jù)挖掘中,簡(jiǎn)單的函數(shù)變換可能更有必要,比如個(gè)人年收入的取值范圍為10000元到10億元,這是一個(gè)很大的區(qū)間,使用對(duì)數(shù)變換對(duì)其進(jìn)行壓縮是常用的一種變換處理方法。

規(guī)范化

數(shù)據(jù)規(guī)范化(歸一化)處理是數(shù)據(jù)挖掘的一項(xiàng)基礎(chǔ)工作。不同評(píng)價(jià)指標(biāo)往往具有不同的量綱,數(shù)值間的差別可能很大,不進(jìn)行處理可能會(huì)影響到數(shù)據(jù)分析的結(jié)果。為了消除指標(biāo)之間的量綱和取值范圍差異的影響,需要進(jìn)行標(biāo)準(zhǔn)化處理,將數(shù)據(jù)按照比例進(jìn)行縮放,使之落入一個(gè)特定的區(qū)域,便于進(jìn)行綜合分析。如將工資收入屬性值映射到[-1,1]或者[0,1]內(nèi)。
數(shù)據(jù)規(guī)范化對(duì)于基于距離的挖掘算法尤為重要。
(1)最小-最大規(guī)范化
最小-最大規(guī)范化也稱為離差標(biāo)準(zhǔn)化,是對(duì)原始數(shù)據(jù)的線性變換,將數(shù)值值映射到[0,1]之間。
轉(zhuǎn)換公式如下:


其中,max為樣本數(shù)據(jù)的最大值,min為樣本數(shù)據(jù)的最小值。max-min為極差。離差標(biāo)準(zhǔn)化保留了原來(lái)數(shù)據(jù)中存在的關(guān)系,是消除量綱和數(shù)據(jù)取值范圍影響的最簡(jiǎn)單方法。這種處理方法的缺點(diǎn)是若數(shù)值集中且某個(gè)數(shù)值很大,則規(guī)范化后各值會(huì)接近于0,并且將會(huì)相差不大。若將來(lái)遇到超過(guò)目前屬性[min,max]取值范圍的時(shí)候,會(huì)引起系統(tǒng)出錯(cuò),需要重新確定min和max。
(2)零-均值規(guī)范化
零-均值規(guī)范化也稱標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化,經(jīng)過(guò)處理的數(shù)據(jù)的均值為0,標(biāo)準(zhǔn)差為1.轉(zhuǎn)化公式為:

其中
\overline{x}
為原始數(shù)據(jù)的均值,σ為原始數(shù)據(jù)的標(biāo)準(zhǔn)差,是當(dāng)前用得最多的數(shù)據(jù)標(biāo)準(zhǔn)化方法。
(3)小數(shù)定標(biāo)規(guī)范化
通過(guò)移動(dòng)屬性值得小數(shù)位數(shù),將屬性值映射到[-1,1]之間,移動(dòng)的小數(shù)位數(shù)取決于屬性值絕對(duì)值的最大值。
轉(zhuǎn)化公式:

下面通過(guò)對(duì)一個(gè)矩陣使用上面3種規(guī)范化的方法處理,對(duì)比結(jié)果。其程序代碼清單如下:

# _*_ coding:utf-8 _*_
# 數(shù)據(jù)規(guī)范化
import pandas as pd
import numpy as np

datafile = 'data/normalization_data.xls'  # 參數(shù)初始化
data = pd.read_excel(datafile, header = None)  # 讀取數(shù)據(jù)

(data - data.min()) / (data.max() - data.min())  # 最小-最大規(guī)范化
(data - data.mean()) / data.std()  # 零-均值規(guī)范化
data / 10 ** np.ceil(np.log10(data.abs().max()))  # 小數(shù)定標(biāo)規(guī)范化

執(zhí)行上面的代碼后,可以在命令行看到下面的輸出:






對(duì)于一個(gè)含有n個(gè)記錄p個(gè)屬性的數(shù)據(jù)集,分別對(duì)每一個(gè)屬性的取值進(jìn)行規(guī)范化。對(duì)原始的數(shù)據(jù)矩陣分別用最小-最大規(guī)范化、零-均值規(guī)范化、小數(shù)定標(biāo)規(guī)范化進(jìn)行規(guī)范化后的數(shù)據(jù)如上所示。

連續(xù)屬性離散化

一些數(shù)據(jù)挖掘算法,特別是某些分類算法(如ID3算法、Apriori算法等),要求數(shù)據(jù)是分類屬性形式。這樣,常常需要將連續(xù)屬性變換成分類屬性,即連續(xù)屬性離散化。
1.離散化的過(guò)程
連續(xù)屬性的離散化就是在數(shù)據(jù)的取值范圍內(nèi)設(shè)定若干個(gè)離散的劃分點(diǎn),將取值范圍分為一些離散化的區(qū)間,最后用不同的符號(hào)或整數(shù)值代表落在每個(gè)子區(qū)間中的數(shù)據(jù)值。所以,離散化涉及兩個(gè)子任務(wù):確定分類數(shù)以及如何將連續(xù)屬性值映射到這些分類值。
2.常用的離散化方法
常用的離散化方法有等寬法、等頻法和(一維)聚類。
(1)等寬法
將屬性的值域分成具有相同寬度的區(qū)間,區(qū)間的個(gè)數(shù)由數(shù)據(jù)本身的特點(diǎn)決定,或者由用戶指定,類似于制作頻率分布表。
(2)等頻法
將相同數(shù)量的記錄放進(jìn)每個(gè)區(qū)間。
這兩種方法簡(jiǎn)單,易于操作,但都需要人為地規(guī)定劃分區(qū)間的個(gè)數(shù)。同時(shí),等寬法的缺點(diǎn)在于它對(duì)離群點(diǎn)比較敏感,傾向于不均勻地把屬性值分不到各個(gè)區(qū)間。有些區(qū)間包含許多數(shù)據(jù),而另外一些區(qū)間的數(shù)據(jù)極少,這樣會(huì)嚴(yán)重?fù)p壞建立的決策模型。等頻法雖然避免了上述問(wèn)題的產(chǎn)生,卻可能將相同的數(shù)據(jù)值分到不同的區(qū)間以滿足每個(gè)區(qū)間中固定的數(shù)據(jù)個(gè)數(shù)。
(3)基于聚類分析的方法
一維聚類的方法包括兩個(gè)步驟,首先將連續(xù)屬性的值用聚類算法(如K-Means算法)進(jìn)行聚類,然后再將聚類得到的簇進(jìn)行處理,合并到一個(gè)簇的連續(xù)屬性值并做同一標(biāo)記。聚類分析的離散化方法也需要用戶指定簇的個(gè)數(shù),從而決定產(chǎn)生的區(qū)間數(shù)。

# _*_ coding:utf-8 _*_
# 數(shù)據(jù)規(guī)范化
import pandas as pd

datafile = 'data/discretization_data.xls'  # 參數(shù)初始化
data = pd.read_excel(datafile)  # 讀取數(shù)據(jù)
data = data[u'肝氣郁結(jié)證型系數(shù)'].copy()
k = 4

d1 = pd.cut(data, k, labels = range(k))  # 等寬離散化,各個(gè)類比一次命名為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函數(shù)自動(dòng)計(jì)算分位數(shù)
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是并行數(shù),一般等于CPU數(shù)較好
kmodel.fit(data.reshape((len(data), 1)))  # 訓(xùn)練模型
c = pd.DataFrame(kmodel.cluster_centers_).sort(0)  # 輸出聚類中心,并且排序(默認(rèn)是隨機(jī)序的)
w = pd.rolling_mean(c, 2).iloc[1:]  # 相鄰兩項(xiàng)求中點(diǎn),作為邊界點(diǎn)
w = [0] + list(w[0]) + [data.max()]  #把首末邊界點(diǎn)加上
d3 = pd.cut(data, w, labels = range(k))

def cluster_plot(d, k):
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來(lái)正常顯示中文標(biāo)簽
    plt.rcParams['axes.unicode_minus'] = False  # 用來(lái)正常顯示負(fù)號(hào)
    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()
等寬離散化的結(jié)果

等頻離散化的結(jié)果

(一維)聚類離散化的結(jié)果

分別用等寬法、等頻法和(一維)聚類對(duì)數(shù)據(jù)進(jìn)行離散化,將數(shù)據(jù)分成4類,然后將每一類記為同一個(gè)標(biāo)識(shí),如分別記為A1、A2、A3、A4,再進(jìn)行建模。

屬性構(gòu)造

在數(shù)據(jù)挖掘的過(guò)程中,為了提取更有用的信息,挖掘更深層次的模式,提高挖掘結(jié)果的精度,我們需要利用已有的屬性集構(gòu)造出新的屬性,并加入到現(xiàn)有的屬性集合中。
比如,進(jìn)行防竊漏電診斷建模時(shí),已有的屬性包括供入電量、供出電量(線路上各大用戶電量之和)。理論上供入電量和供出電量應(yīng)該是相等的,但是由于在傳輸過(guò)程中存在電能損耗,使得供入電量略大于供出電量,如果該條線路上的一個(gè)或多個(gè)大用戶存在竊漏電行為,會(huì)使得供入電量略明顯大于供出電量。反過(guò)來(lái),為了判斷是否有大用戶存在竊漏電行為,可以構(gòu)造出一個(gè)新的指標(biāo)——線損率,該過(guò)程就是構(gòu)造屬性。新構(gòu)造的屬性線損率按如下公式計(jì)算。



線損率的正常范圍一般在3%~15%,如果遠(yuǎn)遠(yuǎn)超過(guò)該范圍,就可以認(rèn)為該條線路的大用戶可能存在竊漏電等用戶異常行為。
根據(jù)線損率的計(jì)算公式,由供入電量、供出電量進(jìn)行線損率的屬性構(gòu)造代碼,代碼如下:

# _*_ coding:utf-8 _*_
# 線損率屬性構(gòu)造
import pandas as pd

# 參數(shù)初始化
inputfile = 'data/electricity_data.xls'  # 供入供出電量數(shù)據(jù)
outputfile = 'data/electricity_data.xls'  # 屬性構(gòu)造后數(shù)據(jù)文件

data = pd.read_excel(inputfile)  # 讀入數(shù)據(jù)
data[u'線損率'] = (data[u'供入電量'] - data[u'供出電量']) / data[u'供入電量']

data.to_excel(outputfile, index = False)  # 保存結(jié)果

小波變換

小波變換是一種新型的數(shù)據(jù)分析工具,是近年來(lái)興起的信號(hào)分析手段。小波分析的理論和方法在信號(hào)處理、圖像處理、語(yǔ)音處理、模式識(shí)別、量子物理等領(lǐng)域得到越來(lái)越廣泛的應(yīng)用,它被認(rèn)為是近年來(lái)在工具及方法上的重大突破。小波變換具有多分辨率的特點(diǎn),在時(shí)域和頻域都具有表征信號(hào)局部特征的能力,通過(guò)伸縮和平移等運(yùn)算過(guò)程對(duì)信號(hào)進(jìn)行多尺度聚焦分析,提供了一種非平穩(wěn)信號(hào)的時(shí)域分析手段,可以由粗及細(xì)地逐步觀察信號(hào),從中提取有用信息。
能夠刻畫(huà)某個(gè)問(wèn)題的特征量往往是隱含在一個(gè)信號(hào)中的某個(gè)或者某些分量重,小波變換可以把非平穩(wěn)信號(hào)分解為表達(dá)不同層次、不同頻帶信息的數(shù)據(jù)序列,即小波系數(shù)。選取適當(dāng)?shù)男〔ㄏ禂?shù),即完成了信號(hào)的特征提取。下面是基于小波變換的信號(hào)特征提取方法。
(1)基于小波變換的特征提取方法

基于小波變換的特征提取方法 方法描述
基于小波變換的多尺度空間能量分布特征提取方法 各尺度空間內(nèi)的平滑信號(hào)和細(xì)節(jié)信號(hào)能提供原始信號(hào)的時(shí)頻局域信息,特別是能提供不同頻段上信號(hào)的構(gòu)成信息。把不同分解尺度上信號(hào)的能力求解出來(lái),就可以將這些能量尺度順序排列,形成特征向量供識(shí)別用
基于小波變換的多尺度空間的模極大值特征提取方法 利用小波變換的信號(hào)局域化分析能力,求解小波變換的模極大值特征來(lái)檢測(cè)信號(hào)的局部奇異性,將小波變換模極大值的尺度參數(shù)s、平移參數(shù)t及其幅值作為目標(biāo)的特征量
基于小波包變換的特征提取方法 利用小波分解,可將時(shí)域隨機(jī)信號(hào)列映射為尺度域各子空間內(nèi)的隨機(jī)系數(shù)序列,按小波包分解得到的最佳子空間內(nèi)隨機(jī)系數(shù)序列的不確定性程度最低,將最佳子空間的熵值即最佳子空間在完整二叉樹(shù)中的位置參數(shù)作為特征量,可以用于目標(biāo)識(shí)別
基于適應(yīng)性小波神經(jīng)網(wǎng)絡(luò)的特征提取方法 基于適應(yīng)性小波神經(jīng)網(wǎng)絡(luò)的特征提取方法可以把信號(hào)通過(guò)分析小波擬合表示,進(jìn)行特征提取

(2)小波基函數(shù)
小波基函數(shù)是一種具有局部支集的函數(shù),并且平均值為0,小波基函數(shù)滿足ψ(0)=∫ψ(t)dt=0。常用的小波基友Haar小波基、db系列小波基等。Haar小波基函數(shù)如下圖所示:

Haar小波基函數(shù)

(3)小波變換
對(duì)小波基函數(shù)進(jìn)行伸縮和平移變換:

其中,a為伸縮因子,b為平移因子。
任意函數(shù)
f(t)
的連續(xù)小波變換(CWT)為:

可知,連續(xù)小波變換為
f(t)→W_f(a,b)
的映射,對(duì)小波基函數(shù)
ψ(t)
增加約束條件
C_ψ=∫\displaystyle\frac{|\hat{ψ}(t)|^2}{t}dt < ∞
,就可以有
W_f(a,b)
逆變換得到
f(t)
。其中
\hat{ψ}(t)
ψ(t)
的傅里葉變換。
其逆變換為:

(4)基于小波變換的多尺度空間能量分布特征提取方法
應(yīng)用小波分析技術(shù)可以把信號(hào)在各頻率波段中的特征提取出來(lái),基于小波變換的多尺度空間能量分布特征提取方法是對(duì)信號(hào)進(jìn)行頻帶分析,在分別以計(jì)算所得的各個(gè)頻帶的能量作為特征向量。
信號(hào)f(t)的二進(jìn)小波分解可表示為:

其中A是近似信號(hào),為低頻部分;D是細(xì)節(jié)信號(hào),為高頻部分,此時(shí)信號(hào)的頻帶分布如下圖所示:
多尺度分解的信號(hào)頻帶分布

信號(hào)總能量為:

選擇第j層的近似信號(hào)和各層的細(xì)節(jié)信號(hào)的能量作為特征,構(gòu)造特征向量:

利用小波變換可以對(duì)聲波信號(hào)進(jìn)行特征提取,提取出可以代表聲波信號(hào)的向量數(shù)據(jù),即完成從聲波信號(hào)到特征向量數(shù)據(jù)的變換。本例利用小波函數(shù)對(duì)聲波信號(hào)數(shù)據(jù)進(jìn)行分解,得到5個(gè)層次的小波系數(shù)。利用這些小波系數(shù)求得各個(gè)能量值,這些能量值即可作為聲波信號(hào)的特征數(shù)據(jù)。

# _*_ coding:utf-8 _*_
# 利用小波分析進(jìn)行特征分析

# 參數(shù)初始化
inputfile = 'data/leleccum.mat'  # 提取自Matlab的信號(hào)文件

from scipy.io import loadmat  # mat是Python專用格式,需要用loadmat讀取它
mat = loadmat(inputfile)
signal = mat['leleccum'][0]

import pywt  # 導(dǎo)入PyWavelets
coeffs = pywt.wavedec(signal, 'bior3.7', level = 5)
# 返回結(jié)果為level+1個(gè)數(shù)字,第一個(gè)數(shù)組為逼近系數(shù)組數(shù),后面的依次是細(xì)節(jié)系數(shù)數(shù)組
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容