主成分分析實用指南
來源:Analytics Vidhya
編譯:Bot
編者按:Too much of anything is good for nothing! 今天我們聊聊基礎知識,主要介紹一種化繁為簡的神奇方法——主成分分析。注意,理解本文需要具備一定統計學基礎。
有時候,如果數據集里有太多變數,你會怎麼辦?以下是每一位分析師都可能遇到的幾種情況:
你會發現大部分變數都是相關的;
你會失去耐心,決定在所有數據上運行模型,然後準確率果然很低,你很絕望;
你開始懷疑人生:我的目的究竟是什麼;
你開始思考如何找出其中的重要變數。
試想一下,當自己身處這四種境地,你會怎麼做?不要逃,處理這些情況並沒有想像中的那麼困難,一些統計方法,如因子分析、主成分分析就有助於克服它們。
什麼是主成分分析?
簡而言之,主成分分析就是從數據集大量可用變數中以成分形式提取出重要變數的方法。利用正交變換,它可從高維數據集中提取低維特徵集,同時保留儘可能多的數據信息,由於變數減少了,數據的可視化也更加清晰明。在處理三維及以上維度的數據時,PCA不失為一種有效的方法。
由於PCA只在對稱相關或協方差矩陣上執行,所以如果要用它,我們就必須要先有一個由數字組成的矩陣,而且必須是標準化的數據。
假設我們有一個維數為300 (n) × 50 (p)的數據集,n表示觀測值的數量,p表示預測變數的數量。因為p = 50,這就意味著我們會有p(p-1)/2個散點圖,要用超過1000個圖表來分析變數關係。單從數據上看,這樣的工作量就已經令人乏味。
在這種情況下,我們要做的是從預測變數p (p
下圖顯示了利用PCA將高維數據(三維)映射到低維(二維)的結果。牢記一點,每個合成維度是p個特徵的線性組合。
來源:nlpca
什麼是主成分?
主成分是數據集中原始預測變數的歸一化線性組合。在上圖中,PC1和PC2是主成分。
Z1= Φ11X1+ Φ21X2+ Φ31X3+ .... +Φp1Xp
其中,
Z1是第一主成分;
Φp1表示loadings(Φ1, Φ2…),它們是主成分相對於各個維度坐標的比例,這些比例的平方和為1,因為如果數值過大,它們可能會導致更大的差異。它還定義了第一主成分Z1的方向,在p維空間中,它的方向就是距離n個觀察值歐式距離最小的那條直線;
X1, X2...,Xp已經過歸一化處理,它們的平均值是0,標準差是1。
第一主成分是原始特徵維度的線性組合,它捕捉的是數據集中的最大方差,決定了數據的主要分布規律,即最高可變性方向。捕捉到的可變性越多,主成分得到的特徵信息量就越多。相比其他主成分,第一主成分的信息量是最多的。
第一主成分產生一條最接近數據的直線,即它使數據點和直線之間的歐式距離之和最小。
第二主成分也是原始特徵維度的線性組合,但它捕捉的是數據集中的剩餘分布規律,和Z1無關。換句話說,第一主成分和第二主成分應該是正交的,它可以被表示為:
Z2= Φ12X1+ Φ22X2+ Φ32X3+ .... + Φp2Xp
以此類推,我們可以計算第三主成分、第四主成分……它們捕捉的都是剩餘特徵,與之前的主成分無關且正交。理論上來說,對於n×p維數據,我們可以創建min(n-1, p)個主成分。
可以發現,因變數Y與主成分方向無關,因此這是一種無監督的方法。
為什麼要對特徵做歸一化?
特徵為原始預測提供了標準的預測空間,但它也存在諸多局限。設想一下,如果一個數據集的單位包括千米、升、千克、光年……它們數據尺度太大了,方差也太大了,如果在這個原始基礎上執行PCA,不同特徵自帶的高方差會影響主成分判斷整體數據的方差水平。這就有點得不償失了。
如下圖所示,我們在經過歸一化和未經歸一化的數據集上執行兩次PCA。這個數據集有大約40個特徵,可以看到,第一主成分應該是變數ItemMRP,第二個主成分則是變數ItemWeight。由於特徵自帶的方差高值,我們在右圖中很難看出這兩個主成分的優勢,但在左圖中,一切就很明顯了。
在R&Python中實現PCA
所以PCA的主題圍繞的是坐標變換,對於數學狂熱分子,可能他們會覺得徒手計算樂趣多多。但為了效率和質量,我們還是乖乖用函數吧。
下文演示的數據集是大商場銷售:Big Mart Sales III
記住一點,PCA只能用於數值型數據,如果數據集中包含分類變數,請務必將其轉換為數字。為了演算法的順利進行,數據清理是必須的!
到這裡,我們已經用中位數補全數據集中的缺失值,解下來就是刪除因變數和標識符變數(如果有的話)。正如我們上面所說的,這是一種無監督學習技術,因此必須刪除因變數。
然後是檢查數據集中的可用變數(各種預測特徵):
檢查是否還包含非數值型變數:
很不幸,這9個變數里有6個是絕對變數,比如年份等,無法被歸一化。所以我們得先做一些工作,用一種熱門編碼方法將這些分類變數轉換為數字。
檢查一下這是不是個整數型數據集:
把數據集分為訓練集和測試集:
在R語言中,使用PCA的函數是prcomp(),默認情況下它會把變數平均值處理成0,為了讓它們的標準差等於1,我們還要加上:
prcomp()函數產生了5個有用的維度:
1.center和scale表示在執行PCA前,變數的平均值和標準差情況;
2.這個rotation表示的是我們之前提到的原坐標的扭轉比例,每一個特徵(維度)都有一個相應比例,它們的線性組合就是我們的主成分;
3.為了計算主成分得分向量,我們不需要將上述比例與數據相乘。相反地,我們可以理解為矩陣x在8523×44維空間中有一個主成分向量;
我們繪製合成主成分。
這個參數就是我們之前提到的特徵歸一化處理。讓我們關注圖像頂部、底部、左側、右側的極值,就目測情況看,OutletTypeSupermarket、OutletEstablishmentYear 2007、OutletLocationTypeTier1和OutletSizeother都是極具潛力的第一、第二主成分,但具體我們還是要靠計算。
4.prcomp()還可以計算每個主成分的標準差:sdev;
上圖顯示前30個主成分在總方差中佔比98.4%,考慮到之前我們一共可以構建44個主成分,用了PCA後,我們可以把它精簡到30個,提高了效率:
用PCA成分進行預測建模
當我們獲得主成分後,之後要做的是在測試數據進行預測。但這裡有一些注意事項:
我們不能妄圖把測試集和訓練集整合成一個數據集,然後一次性獲得所有PCA主成分。這樣做的後果是測試數據會被「泄漏」到訓練集中,換句話說,測試數據集將不再保持「不可見」,最後模型的通用性會變差。
我們也不能分別在測試集和訓練集上單獨執行PCA。因為特徵空間不同,最後它們獲得的主成分方向也不一樣。簡而言之,我們新建立起的兩套坐標軸不是一個坐標軸。
以下是R語言的正確做法:
如果直接用這個東西參加比賽,性能會很差,建議你用隨機森林重新優化。
下面是Python的正確做法:
要點梳理
PCA能有效解決數據集中的特徵冗餘;
這些特徵本質上是低維的;
PCA的主成分其實是原始特徵維度經歸一化後的線性組合;
這些主成分旨在準確描述數據分布和儘可能多地捕捉特徵信息;
第一主成分方差最高,其次是第二主成分、第三主成分……
各主成分必須不相關(正交);
預測特徵變數是分類數據時,要編碼處理再歸一化;
PCA適用於3維及以上數據集;
PCA只能用於數值型數據集;
PCA是一種有助於生成更好的高維數據可視化的工具
原文地址:www.analyticsvidhya.com/blog/2016/03/practical-guide-principal-component-analysis-python/


TAG:論智 |