数据集怎么导出_PCA算法 | 数据集特征数量太多怎么办?用这个算法对它降维打击...
今天是機(jī)器學(xué)習(xí)專題的第27文章,我們一起來聊聊數(shù)據(jù)處理領(lǐng)域的降維(dimensionality reduction)算法。
我們都知道,圖片格式當(dāng)中有一種叫做svg,這種格式的圖片無論我們將它放大多少倍,也不會(huì)失真更不會(huì)出現(xiàn)邊緣模糊的情況。原因也很簡(jiǎn)單,因?yàn)檫@種圖片是矢量圖,一般的圖片存儲(chǔ)的是每一個(gè)像素點(diǎn)的顏色值,而在矢量圖當(dāng)中,我們存儲(chǔ)的是矢量,也就是起點(diǎn)終點(diǎn)以及顏色。由于矢量圖只記錄起點(diǎn)終點(diǎn),所以無論我們?nèi)绾畏糯?#xff0c;圖片都不會(huì)失真,而傳統(tǒng)的圖片就做不到這一點(diǎn)。
其實(shí)svg就相當(dāng)于圖片的降維,我們將上百萬(wàn)的像素點(diǎn)簡(jiǎn)化成了若干個(gè)矢量完成了圖片的存儲(chǔ),大大減少了數(shù)據(jù)的規(guī)模。機(jī)器學(xué)習(xí)領(lǐng)域中的降維算法其實(shí)也是差不多的原理。
背景與原理
現(xiàn)在降維算法這個(gè)詞已經(jīng)越來越少聽到了,在面試當(dāng)中也很少被提及,這是有時(shí)代因素的。因?yàn)楝F(xiàn)在的計(jì)算資源以及存儲(chǔ)資源越來越廉價(jià)了,在以前很難承擔(dān)的計(jì)算量,現(xiàn)在變得越來越輕松。所以相對(duì)而言,降維算法沒有之前熱門了,也越來越少在面試當(dāng)中出現(xiàn)。
從現(xiàn)狀倒推回從前,我們大概可以猜到,在若干年以前,當(dāng)我們面臨海量無法承擔(dān)的數(shù)據(jù)的時(shí)候,降維算法是多么的重要。因?yàn)?#xff0c;我們都知道,機(jī)器學(xué)習(xí)訓(xùn)練的速度和它使用的數(shù)據(jù)量有這非常密切的關(guān)系,使用10維特征和使用100維特征的模型的收斂速度至少是10倍以上的差距。那么,自然而然地我們就會(huì)想到,如果有某種方法可以將100維的數(shù)據(jù)”壓縮“成10維,該有多好?
但問題來了,數(shù)據(jù)不是實(shí)體,我們真的可以隨意壓縮嗎,這其中的原理是什么呢?
最根本的原理是既然特征可以用來訓(xùn)練模型,那么特征的分布和label的分布必然是有一定的內(nèi)在聯(lián)系的。也就是說數(shù)據(jù)并不是隨意分散的,而是彼此之間有聯(lián)系的。我們各種各樣的壓縮算法,本質(zhì)上都是利用了數(shù)據(jù)之間的關(guān)聯(lián)。
舉個(gè)不是非常恰當(dāng),但是很直觀的例子。假設(shè)說我們現(xiàn)在有三個(gè)特征,分別是一個(gè)人的考試成績(jī)、智商以及努力程度。我們會(huì)很明顯地發(fā)現(xiàn),考試成績(jī)和智商以及努力程度這兩個(gè)特征高度相關(guān)。如果我們能夠找到它們之間的關(guān)聯(lián),我們完全可以去掉考試成績(jī)這個(gè)特征,而通過智商、努力程度和它的這種關(guān)聯(lián)來推算出這個(gè)值來。當(dāng)然既然是推算出來的,顯然會(huì)和原本的值有一定的誤差,這也是不可避免的。
從這個(gè)例子當(dāng)中,我們可以明確兩點(diǎn),首先,壓縮數(shù)據(jù)是利用的數(shù)據(jù)分布的關(guān)聯(lián)或者是特性,如果是完全隨機(jī)的數(shù)據(jù)是無法降維壓縮的。其次,降維壓縮必然會(huì)帶來信息損失,也就是誤差,這是不可避免的。
降維算法
降維壓縮的算法有好幾種,常見的有PCA、ICA和FA,下面我們來簡(jiǎn)單介紹一下。
首先是PCA,PCA的英文全稱是Principal Component Analysis即主成分分析。這種方法的主要原理是對(duì)數(shù)據(jù)進(jìn)行坐標(biāo)變換,即將數(shù)據(jù)從原來的坐標(biāo)系更換到新的坐標(biāo)系。新的坐標(biāo)軸是通過最大方差理論推導(dǎo)得到的,即新的坐標(biāo)軸包含了原始數(shù)據(jù)中大部分的方差,這里的方差可以理解成信息。
ICA的英文是Independent Component Analysis即獨(dú)立成分分析,在這個(gè)算法當(dāng)中它假設(shè)數(shù)據(jù)是通過N個(gè)數(shù)據(jù)源生成的。假設(shè)數(shù)據(jù)是這N個(gè)數(shù)據(jù)源數(shù)據(jù)混合觀察的結(jié)果。這些數(shù)據(jù)源在統(tǒng)計(jì)上是互相獨(dú)立的,如果數(shù)據(jù)源的數(shù)目少于原始特征的數(shù)目,也可以完成降維。
最后是FA即Factor Analysis即因子分析。在因子分析當(dāng)中,我們假設(shè)樣本當(dāng)中存在一些隱變量,我們假設(shè)樣本是這些隱變量和一些噪音的線性組合。那么只要這些隱變量的數(shù)量少于原始特征的數(shù)量,我們就可以用這些隱變量來作為新的數(shù)據(jù)從而實(shí)現(xiàn)降維。
這三種降維算法雖然各不相同,但是核心的思路都是一致的。都是假設(shè)數(shù)據(jù)的分布滿足某一種特性,通過利用這一種特性來對(duì)數(shù)據(jù)進(jìn)行壓縮。這其中使用范圍最廣的是PCA,所以我們著重來了解一下PCA的原理以及實(shí)現(xiàn)。
理論推導(dǎo)
關(guān)于PCA算法有兩種通俗的解釋,一種是最大方差理論,另外一種是最小化降維損失,這兩個(gè)思路推導(dǎo)出的結(jié)果是一樣的。相比之下,最大方差理論更加容易理解一些,所以我們就選擇最大方差理論來做個(gè)簡(jiǎn)單的解釋。
在信號(hào)系統(tǒng)當(dāng)中,我們普遍認(rèn)為信號(hào)具有較大的方差,而噪音擁有較小的方差。信噪比就是信號(hào)與噪聲的方差比,這個(gè)比值越大越好,越大說明噪音越小,信號(hào)的質(zhì)量越高。比如下圖當(dāng)中的這個(gè)數(shù)據(jù)分布,我們可以在原始數(shù)據(jù)當(dāng)中找到兩個(gè)正交軸,根據(jù)方差最大理論,我們會(huì)把方差大的那個(gè)軸看成是信號(hào),方差小的看成是噪音。
根據(jù)這個(gè)思路,最好的k維特征是將n維的樣本轉(zhuǎn)換成k維坐標(biāo)之后,擁有最大方差的k個(gè)。
協(xié)方差
到這里,我們雖然知道了要獲取方差最大的方向作為新的坐標(biāo)軸,但是如果我們直接去計(jì)算的話是會(huì)有問題的。最大的問題在于我們沒辦法選出K個(gè)來,如果只是選擇類似的K個(gè)方向,這K個(gè)軸的信息都差不多,會(huì)丟失大量的信息。所以我們不僅要選擇K個(gè)軸,而且要保證這K個(gè)軸盡可能線性無關(guān)。
要做到線性無關(guān),也就是說這K個(gè)軸應(yīng)該是彼此正交的。如果兩個(gè)軸正交,可以進(jìn)一步得到這兩個(gè)軸的協(xié)方差為零。為了簡(jiǎn)化運(yùn)算,我們可以先讓原始數(shù)據(jù)全部減去各自特征的均值。在去除均值之后,兩個(gè)特征的協(xié)方差可以表示為:
兩個(gè)特征正交等價(jià)于它們的協(xié)方差為0,我們假設(shè)去除了均值之后的矩陣為X,我們來寫出它的協(xié)方差矩陣。
協(xié)方差矩陣
對(duì)于去除了均值的矩陣X而言,有一個(gè)性質(zhì)是它的協(xié)方差矩陣
X_cov=1/m X X^T。我們可以來簡(jiǎn)單證明一下,假設(shè)矩陣當(dāng)中只有兩個(gè)特征a和b,那么我們將它按行寫成矩陣:
我們假設(shè)X的協(xié)方差矩陣為C,那么C是一個(gè)對(duì)稱矩陣,它的對(duì)角線上的元素表示各個(gè)特征的方差,其他的元素則表示特征之間的協(xié)方差。我們的目標(biāo)是希望能夠得到一個(gè)類似形式的對(duì)角矩陣,也就是說除了對(duì)角線之外的其余元素全為0,這樣這些特征之間就是正交矩陣,我們根據(jù)對(duì)角線上的值挑選出方差最大的K個(gè)特征即可。
我們的目的和方向已經(jīng)很明確了,距離終點(diǎn)只有一步之遙,但是這一步怎么邁過去呢?
對(duì)角化
這里我們采用逆向思維來思考,假設(shè)我們已經(jīng)找到了矩陣P,通過P對(duì)X進(jìn)行線性變換的結(jié)果是Y,那么Y=PX,我們假設(shè)Y的協(xié)方差矩陣為D,那么根據(jù)剛才我們推導(dǎo)的結(jié)論可以得到:
我們希望D是一個(gè)對(duì)角矩陣,所以我們要尋找的就是P,P找到之后一切都迎刃而解。因?yàn)镈是一個(gè)對(duì)角矩陣,我們將它對(duì)角的元素從大到小排列之后,對(duì)應(yīng)P的行組成的矩陣就是我們尋找的基。我們用P的前K行組成的新矩陣對(duì)原始數(shù)據(jù)X進(jìn)行線性變換,就將它從n維降低到了K維。
所以問題就只剩下了一個(gè),這個(gè)P矩陣要怎么求呢?我們干想是很困難的,其實(shí)數(shù)據(jù)家們已經(jīng)給了我們答案,就是C矩陣的特征向量。
由于C是對(duì)稱矩陣,根據(jù)線性代數(shù)的原理,它有如下兩條性質(zhì):
根據(jù)這兩條性質(zhì),我們可以得到,對(duì)于n*n的矩陣C來說,我們可以找到n個(gè)特征向量 e_1, e_2, ... , e_n。我們將它們按列組成矩陣:
我們通過E可以將C對(duì)角化:
我們對(duì)Lambda中的特征值從大到小排列,選出前K個(gè)特征值對(duì)應(yīng)的特征向量組成矩陣即得到了最終的結(jié)果P。
最后,我們整理一下上述的整個(gè)過程。
我們把這個(gè)邏輯整理一下,寫成代碼:
import numpy as npdef pca(df, k): mean = np.mean(df, axis=0) new_df = df - mean # 計(jì)算協(xié)方差矩陣,也可以用公式自己算 cov = np.cov(new_df, rowvar=0) # 求解矩陣特征值和特征向量 eigVals, eigVects = np.linalg.eig(np.mat(cov)) # 對(duì)特征值排序,選最大的K個(gè),由于是從小到大排,所以我們?nèi)》? eigValIndice = np.argsort(-eigVals) # 構(gòu)建變換矩陣 n_eigValIndice = eigValIndice[:k] n_eigVect = eigVects[:, n_eigValIndice] data_ret = new_df.dot(n_eigVect) return data_ret實(shí)戰(zhàn)驗(yàn)證
為了驗(yàn)證程序效果,我們找了一份經(jīng)典的機(jī)器學(xué)習(xí)數(shù)據(jù):http://archive.ics.uci.edu/ml/datasets/SECOM。
我們把它下載下來之后,用pandas讀入進(jìn)來:
可以看到它的特征有590維,展開看的話會(huì)發(fā)現(xiàn)特征當(dāng)中有許多空值:
我們對(duì)它進(jìn)行一個(gè)簡(jiǎn)單地預(yù)處理,將空值替換成特征均值,并且再讀入label的值:
為了驗(yàn)證PCA降維的效果,我們用同樣一份數(shù)據(jù),用同樣的模型,比較一下做PCA之前和之后模型的效果。
這里我選擇的是隨機(jī)森林,其實(shí)不管用什么模型都大同小異。我們將數(shù)據(jù)拆分成訓(xùn)練數(shù)據(jù)與測(cè)試數(shù)據(jù),并且調(diào)用skelarn庫(kù)當(dāng)中的隨機(jī)森林完成訓(xùn)練和預(yù)測(cè),最后計(jì)算模型在測(cè)試集當(dāng)中的表現(xiàn)。說起來挺復(fù)雜,但是由于sklearn替我們完成了大量的工作,所以用到的代碼并不多:
我們可以看到,在PCA之前,隨機(jī)森林在測(cè)試集上的表現(xiàn)是92.3%的準(zhǔn)確率。
接下來,我們用同樣的數(shù)據(jù)和模型來驗(yàn)證PCA之后對(duì)于模型性能的影響。為了保證數(shù)據(jù)集的完全一致,我們把測(cè)試集的隨機(jī)種子也設(shè)置成一樣。
可以看到模型在測(cè)試集上的準(zhǔn)確率完全一樣,說明PCA并沒有過多降低模型的性能,和我們的預(yù)期一致。
總結(jié)
在今天的文章當(dāng)中,我們?cè)敿?xì)介紹并推導(dǎo)了PCA背后的原理,并采取實(shí)際數(shù)據(jù)集驗(yàn)證了PCA算法的效果。從最后的結(jié)果上來看,雖然我們將590維的特征縮減到了10維,但是模型的效果卻幾乎沒有多大影響,可見PCA的威力。
當(dāng)然,這背后的因素很多,除了PCA本身的原理之外,和數(shù)據(jù)的分布以及訓(xùn)練測(cè)試樣本的數(shù)量也有關(guān)系。在極端場(chǎng)景下,可能特征的數(shù)量非常多,含有大量的噪音,如果我們不做降維直接訓(xùn)練的話,很有可能導(dǎo)致模型很難收斂。在這種情況下,使用降維算法是必要的,而且會(huì)帶來正向的提升。如果特征數(shù)量不多,模型能夠收斂,使用降維算法可能沒什么助益,而且會(huì)稍稍降低模型的效果。但在一般的情況下,數(shù)據(jù)集特征的分布也符合二八定律,即20%的特征帶來80%以上的貢獻(xiàn),大部分特征效果不明顯,或者噪音很多。在這種情況下,使用PCA進(jìn)行降維,幾乎是一定起到正向作用的。
當(dāng)然在實(shí)際的應(yīng)用場(chǎng)景當(dāng)中,降維算法用的越來越少,除了計(jì)算能力提升之外,另外一個(gè)很重要的原因是深度學(xué)習(xí)的興起。深度神經(jīng)網(wǎng)絡(luò)本身就帶有特征篩選的效果,它自己會(huì)選擇合適的特征組合達(dá)到最好的效果,所以很多特征處理和降維等操作顯得不是特別有必要了。雖然如此,但是算法本身的思想還是很有借鑒作用,PCA算法在Kaggle比賽當(dāng)中使用頻率也很高,對(duì)它進(jìn)行詳細(xì)地了解和學(xué)習(xí)還是很有必要的。
今天的文章就到這里,如果喜歡本文,可以的話,請(qǐng)點(diǎn)個(gè)贊和關(guān)注吧,給我一點(diǎn)鼓勵(lì),也方便獲取更多文章。
本文始發(fā)于公眾號(hào):TechFlow
總結(jié)
以上是生活随笔為你收集整理的数据集怎么导出_PCA算法 | 数据集特征数量太多怎么办?用这个算法对它降维打击...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基金涨幅是什么的涨幅
- 下一篇: 银行保本型理财产品是什么时候出现的