閱讀提示
本文將接上文提到,數據預處理中的數據違約、主要預處理函數,例如主成分分析法。
4、數據違約
在大數據集上進行復雜的數據分析和挖掘需要很長的時間,數據規約產生更小但保持原數據完整性的新數據集。在規約後的數據集上進行分析和挖掘將更有效率。
數據規約的意義在於:
- 降低無效、錯誤數據對建模的影響,提高建模的準確性
- 少量且具代表性的數據將大幅縮減數據挖掘所需的時間
- 降低儲存數據的成本
a、屬性規約
屬性規約通過屬性合併來創建新屬性維數,或者直接通過刪除不相關的屬性(維)來減少數據維數,從而提高數據挖掘的效率、降低計算成本。屬性規約的目標是尋找出最小的屬性子集並確保新數據子集的概率分佈儘可能地接近原來數據集的概率分佈。
常見的方法:
屬性規約的方法 | 方法描述 |
---|---|
合併屬性 | 將一些舊屬性合爲新屬性 |
逐步向前選擇 | 從一個空屬性集開始,每次從原來屬性集合中選擇一個當前最優的屬性添加到 當前屬性子集中。直到無法選擇出最優屬性或滿足一定閾值約束爲止 |
逐步向後刪除 | 從一個全屬性集開始,每次從當前屬性子集中選擇一個當前最差的屬性並將其從當前屬性子集中消去。直到無法選擇出最差屬性爲止或滿足一定閾值約束爲止 |
決策樹歸納 | 利用決策樹的歸納方法對初始數據進行分類歸納學習,獲得一個初始決策樹, 所有沒有出現在這個決策樹上的屬性均可認爲是無關屬性,因此將這些屬性從初始集合中刪除,就可以獲得一個較優的屬性子集 |
主成分分析 | 用較少的變量去解釋原始數據中的大部分變量,即將許多相關性很 高的變量轉化成彼此相互獨立或不相關的變量 |
逐步向前選擇、逐步向後刪除和決策樹歸納是屬於直接刪除不相關屬性(維)方法。主成分分析是一種用 於連續屬性的數據降維方法,它構造了原始數據的一個正交變換,新空間的基底去除了原始空間基底下數據的相關性,只需使用少數新變量就能夠解釋原始數據中的大部分變異。在應用中,通常是選出比原始變量個數少,能解釋大部分數據中的變量的幾個新變量,即所謂主成分,來代替原始變量進行建模。
Python中,主成分分析的函數位於Scikit-Learn下:
sklearn.decomposition.PCA(n_components = None, copy = True, whiten = False)
參數說明:
(1) n_components
意義: PCA算法中所要保留的主成分個數n,也即保留下來的特徵個數n
類型: int 或者string,缺省時默認爲None,所有成分被保留。賦值爲int,比如n_compo-
nents=1,將把原始數據降到一個維度。賦值爲string, 比如n_components=‘mle’, 將自動選取特徵個數n,使得滿足所要求的方差百分比。
(2)copy
類型: bool,True或者False,缺省時默認是True
意義: 表示是否在運行算法時,將原始訓練數據複製一份。若爲True,則運行PCA
算法後,原始訓練數據的值不會有任何改變,因爲是在原始數據的副本上進行運算;若爲False,則運行PCA算法後,原始訓練數據的值會改,因爲是在原始數據上進行降維計算。
(3)whiten
類型: bool,缺省時默認爲False
意義:白化,使得每個特徵具有相同的方差
實例:
主成分分析降維
#-*- coding: utf-8 -*-
#主成分分析 降維
import pandas as pd
#參數初始化
inputfile = '../data/principal_component.xls'
outputfile = '../tmp/dimention_reducted.xls' #降維後的數據
data = pd.read_excel(inputfile, header = None) #讀入數據
from sklearn.decomposition import PCA
pca = PCA()
pca.fit(data)
print(pca.components_) #返回模型的各個特徵向量
print("*"*50)
print(pca.explained_variance_ratio_) #返回各個成分各自的方差百分比(貢獻率)
[[ 0.56788461 0.2280431 0.23281436 0.22427336 0.3358618 0.43679539
0.03861081 0.46466998]
[ 0.64801531 0.24732373 -0.17085432 -0.2089819 -0.36050922 -0.55908747
0.00186891 0.05910423]
[-0.45139763 0.23802089 -0.17685792 -0.11843804 -0.05173347 -0.20091919
-0.00124421 0.80699041]
[-0.19404741 0.9021939 -0.00730164 -0.01424541 0.03106289 0.12563004
0.11152105 -0.3448924 ]
[-0.06133747 -0.03383817 0.12652433 0.64325682 -0.3896425 -0.10681901
0.63233277 0.04720838]
[ 0.02579655 -0.06678747 0.12816343 -0.57023937 -0.52642373 0.52280144
0.31167833 0.0754221 ]
[-0.03800378 0.09520111 0.15593386 0.34300352 -0.56640021 0.18985251
-0.69902952 0.04505823]
[-0.10147399 0.03937889 0.91023327 -0.18760016 0.06193777 -0.34598258
-0.02090066 0.02137393]]
**************************************************
[7.74011263e-01 1.56949443e-01 4.27594216e-02 2.40659228e-02
1.50278048e-03 4.10990447e-04 2.07718405e-04 9.24594471e-05]
Process finished with exit code 0
對上述代碼進行續寫:
pca = PCA(3)
pca.fit(data)
low_d = pca.transform(data) # 用它來降低維度
pd.DataFrame(low_d).to_excel(outputfile) # 保存結果
pca.inverse_transform(low_d) # 必要時可以使用inverse_transform()函數覆蓋數據
print(low_d)
結果:
降維效果如下:
[[ 8.19133694 16.90402785 3.90991029]
[ 0.28527403 -6.48074989 -4.62870368]
[-23.70739074 -2.85245701 -0.4965231 ]
[-14.43202637 2.29917325 -1.50272151]
[ 5.4304568 10.00704077 9.52086923]
[ 24.15955898 -9.36428589 0.72657857]
[ -3.66134607 -7.60198615 -2.36439873]
[ 13.96761214 13.89123979 -6.44917778]
[ 40.88093588 -13.25685287 4.16539368]
[ -1.74887665 -4.23112299 -0.58980995]
[-21.94321959 -2.36645883 1.33203832]
[-36.70868069 -6.00536554 3.97183515]
[ 3.28750663 4.86380886 1.00424688]
[ 5.99885871 4.19398863 -8.59953736]]
Process finished with exit code 0
原始數據從8維降到了3維,同時這3維數據佔了原始數據95%以上的信息。
b、數值規約
數值規約指通過選擇替代的、較小的數據來減少數據量,包括有參數方法和無參數方法兩類。有參數方法是使用一個模型來評估數據,只需存放參數,而不需要存放實際數據,例如迴歸(線性迴歸和多元迴歸)和對數線性模型(近似離散屬性集中的多維概率分佈)。無參數方法就需要存放實際數據,例如直方圖、聚類、抽樣(採樣)。
(1)直方圖
直方圖使用分箱來近似數據分佈,是一種流行的數據規約形式。屬性A的直方圖將A的數據分佈劃分爲不相交的子集或桶。如果每個桶只代表單個屬性值/頻率對,則該桶稱爲單桶。通常,桶表示給定屬性的一個連續區間。
(2)聚類
聚類技術將數據元組(即記錄,數據表中的一-行) 視爲對象。它將對象劃分爲簇,使一個簇中的對象相互“相似”,而與其他簇中的對象“相異”。在數據規約中,用數據的簇替換實際數據。該技術的有效性依賴於簇的定義是否符合數據的分佈性質。
(3)抽樣
抽樣也是一種數據規約技術,它用比原始數據小得多的隨機樣本(子集)表示原始數據集。假定原始數據集D包含N個元組,可以採用抽樣方法對D進行抽樣。
- 無放回簡單隨機抽樣
- 由放回簡單隨機抽樣
- 聚類抽樣
- 分層抽樣
(4)參數迴歸
簡單線性模型和對數線性模型可以用來近似描述給定的數據。(簡單)線性模型對數據
建模,使之擬合一條直線。
5、Python主要數據預處理函數
函數名 | 函數功能 | 所屬拓展庫 |
---|---|---|
interpolate | 一維、高維數據插值 | Scipy |
unique | 去除數據中的重複元素,得到單值元素列表,它是對象的方法名 | Pandas/Numpy |
isnull | 判斷是否爲空 | Pandas |
notnull | 判斷是否非空 | Pandas |
PCA | 對指標變量矩陣進行主成分分析 | Scikit-Learn |
random | 生成隨機矩陣 | Numpy |
(1)interpolate
功能: interpolate是Scipy的一一個子庫,包含了大量的插值函數,如拉格朗日插值、樣條插值、高維插值等。使用前需要用from scipy.interpolate import *引入相應的插值函數,可以根據需要到官網查找對應的函數名。
使用格式:
f = scipy.interpolate.lagrange(x,y)
這裏僅僅展示了一維數據的拉格朗日插值的命令,其中x, y爲對應的自變量和因變量數據。插值完成後,可以通過f(a) 計算新的插值結果。類似的還有樣條插值、多維數據插值等,此處不一一展示。
(2)unique
功能: 去除數據中的重複元素,得到單值元素列表。它既是Numpy庫的一個函數(np.unique()),也是Series對象的一個方法。
使用格式:
- np.unique(D) ,D是一維數據,可以是list、array、Series
- D.unique(),D是Pandas的Series對象
實例:
求向量A中的單值元素,並返回相關索引
D = pd.Series([1, 1, 2, 3, 5])
print(D.unique())
print(np.unique(D))
結果:
[1 2 3 5]
[1 2 3 5]
Process finished with exit code 0
(3) isnull / notnull
功能: 判斷每個元素是否空值 / 非空值
使用格式: D.isnull()/ D.notnull()。這裏的D要求是Series對象,返回一個布爾Series。可以通過D [ D.isnull()]或D[D.notnull()]找出D中的空值 / 非空值。
(4)random
功能: random是Numpy的一個子庫(Python本身也自帶了random,但Numpy的更加強大),可以用該庫下的各種函數生成服從特定分佈的隨機矩陣,抽樣時可使用。
使用格式:
- np.random.randn(k, m, n,…生成一個k * m * n *… 隨機矩陣,其元素均勻分佈在區間(0,1)上
- np.random.randn(k, m, n…)_.生成一個k * m * n * …隨機矩陣,其元素服從標準正態分佈
(5)PCA
功能: 對指標變量矩陣進行主成分分析,使用前需要用from sklearn.decomposition import PCA引入該函數。
使用格式: model = PCA()。 注意,Scikit-Learn 下的PCA是一個建模式的對象,也就是說,一般的流程是建模,然後是訓練model.fit(D),D爲要進行主成分分析的數據矩陣,訓練結束後獲取模型的參如.components_獲取特徵向量,以及.explained_ variance. _ratio_獲取各個屬性的貢獻率等。
實例:
使用PCA()對一個10 * 4 維的隨機矩陣進行主成分分析
from sklearn.decomposition import PCA
D = np.random.randn(10, 4)
pca = PCA()
pca.fit(D)
PCA(copy=True, n_components=None, whiten=False)
print(pca.components_) # 返回模型的各個特徵向量
print("*" * 50)
print(pca.explained_variance_ratio_) # 返回各個成分個字的方差百分比
結果:
[[-0.73391691 0.22922579 -0.13039917 0.62595332]
[-0.41771778 0.57241446 -0.02724733 -0.70506108]
[ 0.22012336 0.49807219 0.80277934 0.24293029]
[-0.48828633 -0.60968952 0.58120475 -0.22815825]]
**************************************************
[0.50297117 0.28709267 0.14575757 0.06417859]
Process finished with exit code 0
6、小結
本次介紹了數據預處理的4個主要任務:數據清洗、數據集成、數據變換和數據規約。數據清洗主要介紹了對缺失值和異常值的處理,延續了第三天的缺失值和異常值分析的內容,本次所介紹的處理缺失值的方法分爲3類:刪除記錄、數據插補和不處理,處理異常值的方法有刪除含有異常值的記錄、不處理、平均值修正和視爲缺失值;數據集成是合併多個數據源中的數據,並存放到一個數據存儲的過程,對該部分的介紹從實體識別問題和冗餘屬性兩個方面進行;數據變換介紹瞭如何從不同的應用角度對已有屬性進行函數變換;數據規約從屬性(縱向)規約和數值(橫向)規約兩個方面介紹瞭如何對數據進行規約,使挖掘的性能和效率得到很大的提高。通過對原始數據進行相應的處理,將爲後續挖掘建模提供良好的數據基礎。
★學習Python數據挖掘純屬個人愛好,如有不足或錯誤請指出謝謝。