python八種降維方法匯總
一、 為什么降維?
1、隨著數(shù)據(jù)維度不斷降低,數(shù)據(jù)存儲所需的空間也會隨之減少。
2、低維數(shù)據(jù)有助于減少計算/訓練用時。
3、一些算法在高維度數(shù)據(jù)上容易表現(xiàn)不佳,降維可提高算法可用性。
4、降維可以用刪除冗余特征解決多重共線性問題。比如我們有兩個變量:“一段時間內(nèi)在跑步機上的耗時”和“卡路里消耗量”。這兩個變量高度相關,在跑步機上花的時間越長,燃燒的卡路里自然就越多。因此,同時存儲這兩個數(shù)據(jù)意義不大,只需一個就夠了。
5、降維有助于數(shù)據(jù)可視化。如果數(shù)據(jù)維度很高,可視化會變得相當困難,而繪制二維三維數(shù)據(jù)的圖表非常簡單。
二、降維方法
數(shù)據(jù)維度的降低方法主要有兩種:
1、僅保留原始數(shù)據(jù)集中最相關的變量(特征選擇)。
2、尋找一組較小的新變量,其中每個變量都是輸入變量的組合,包含與輸入變量基本相同的信息(降維)。
2.1 缺失值比率
假設你有一個數(shù)據(jù)集,你第一步會做什么?在構建模型前,對數(shù)據(jù)進行探索性分析必不可少。但在瀏覽數(shù)據(jù)的過程中,有時候我們會發(fā)現(xiàn)其中包含不少缺失值。如果缺失值少,我們可以填補缺失值或直接刪除這個變量;當缺失值在數(shù)據(jù)集中的占比過高時,一般我會選擇直接刪除這個變量,因為它包含的信息太少了。但具體刪不刪、怎么刪需要視情況而定,我們可以設置一個閾值,如果缺失值占比高于閾值,刪除它所在的列。閾值越高,降維方法越積極。
df.isnull().sum() #檢查每個變量中缺失值的占比 df.isnull().sum() /len(df)*100
# 設定閾值為20%:保存變量中的缺失值 a = df.isnull().sum()/len(df)*100 # 保存列名 variables = df.columns variable = [ ] for i in range(0,12): if a[i]<=20: #setting the threshold as 20% variable.append(variables[i])
2.2 低方差濾波
如果我們有一個數(shù)據(jù)集,其中某列的數(shù)值基本一致,也就是它的方差非常低,我們通常認為低方差變量攜帶的信息量也很少,所以可以把它直接刪除。放到實踐中,就是先計算所有變量的方差大小,然后刪去其中最小的幾個。需要注意的一點是:方差與數(shù)據(jù)范圍相關的,因此在采用該方法前需要對數(shù)據(jù)做歸一化處理。
實例中,我們先估算缺失值,缺失值填充完畢,進行低方差濾波分析。
# 列出了方差大于10的所有變量 umeric = train[['Item_Weight', 'Item_Visibility', 'Item_MRP', 'Outlet_Establishment_Year']] var = numeric.var() numeric = numeric.columns variable = [ ] for i in range(0,len(var)): if var[i]>=10: # 將閾值設置為10% variable.append(numeric[i+1])
2.3 高相關濾波
如果兩個變量之間是高度相關的,這意味著它們具有相似的趨勢并且可能攜帶類似的信息。同理,這類變量的存在會降低某些模型的性能(例如線性和邏輯回歸模型)。為了解決這個問題,我們可以計算獨立數(shù)值變量之間的相關性。如果相關系數(shù)超過某個閾值,就刪除其中一個變量。
首先,刪除因變量,并將剩余的變量保存在新的數(shù)據(jù)列中進行相關性分析(df.corr())。通常情況下,如果一對變量之間的相關性大于0.5-0.6,那就應該考慮是否要刪除一列了。
2.4 隨機森林
隨機森林是一種廣泛使用的特征選擇算法,它會自動計算各個特征的重要性,所以無需單獨編程。這有助于我們選擇較小的特征子集。在開始降維前,我們先把數(shù)據(jù)轉換成數(shù)字格式,因為隨機森林只接受數(shù)字輸入
from sklearn.ensemble import RandomForestRegressor df=df.drop(['Item_Identifier', 'Outlet_Identifier'], axis=1) model = RandomForestRegressor(random_state=1, max_depth=10) df=pd.get_dummies(df) model.fit(df,train.Item_Outlet_Sales)
擬合模型后,根據(jù)特征的重要性繪制成圖:
features = df.columns importances = model.feature_importances_ indices = np.argsort(importances[0:9]) # top 10 features plt.title('Feature Importances') plt.barh(range(len(indices)), importances[indices], color='b', align='center') plt.yticks(range(len(indices)), [features[i] for i in indices]) plt.xlabel('Relative Importance') plt.show()
基于上圖,我們可以手動選擇最頂層的特征來減少數(shù)據(jù)集中的維度。
注:如果你用的是sklearn,可以直接使用SelectFromModel,它根據(jù)權重的重要性選擇特征。
from sklearn.feature_selection import SelectFromModel feature = SelectFromModel(model) Fit = feature.fit_transform(df, train.Item_Outlet_Sales)
2.5 反向特征消除
1、先獲取數(shù)據(jù)集中的全部n個變量,然后用它們訓練一個模型。
2、計算模型的性能。
3、在刪除每個變量(n次)后計算模型的性能,即我們每次都去掉一個變量,用剩余的n-1個變量訓練模型。
4、確定對模型性能影響最小的變量,把它刪除。
5、重復此過程,直到不再能刪除任何變量。
在構建線性回歸或邏輯回歸時候可以使用這種方法:
from sklearn.linear_model import LinearRegression from sklearn.feature_selection import RFE from sklearn import datasets lreg = LinearRegression() rfe = RFE(lreg, 10) rfe = rfe.fit_transform(df, train.Item_Outlet_Sales)
我們需要指定算法和要選擇的特征數(shù)量,然后返回反向特征消除輸出的變量列表。此外,rfe.ranking_可以用來檢查變量排名。
2.6 前向特征選擇
前向特征選擇其實就是反向特征消除的相反過程,即找到能改善模型性能的最佳特征,而不是刪除弱影響特征。它背后的思路如下所述:
1、選擇一個特征,用每個特征訓練模型n次,得到n個模型。
2、選擇模型性能最佳的變量作為初始變量。
3、每次添加一個變量繼續(xù)訓練,重復上一過程,最后保留性能提升最大的變量。
4、一直添加,一直篩選,直到模型性能不再有明顯提高。
from sklearn.feature_selection import f_regression ffs = f_regression(df,train.Item_Outlet_Sales )
上述會返回一個數(shù)組,其中包括變量F值和每個F對應的p值。在這里,我們選擇F值大于10的變量:
variable = [ ] for i in range(0,len(df.columns)-1): if ffs[0][i] >=10: variable.append(df.columns[i])
2.7 因子分析
因子分析是一種常見的統(tǒng)計方法,它能從多個變量中提取共性因子,并得到最優(yōu)解。
基本思想:最大化類間均值,最小化類內(nèi)方差。意思就是將數(shù)據(jù)投影在低維度上,并且投影后同種類別數(shù)據(jù)的投影點盡可能的接近,不同類別數(shù)據(jù)的投影點的中心點盡可能的遠。假設我們有兩個變量:收入和教育。它們可能是高度相關的,因為總體來看,學歷高的人一般收入也更高,反之亦然。所以它們可能存在一個潛在的共性因子,比如“能力”。
在因子分析中,我們將變量按其相關性分組,即特定組內(nèi)所有變量的相關性較高,組間變量的相關性較低。我們把每個組稱為一個因子,它是多個變量的組合。和原始數(shù)據(jù)集的變量相比,這些因子在數(shù)量上更少,但攜帶的信息基本一致。
數(shù)據(jù)集:Fashion MNIST,它共有70,000張圖像,其中訓練集60,000張,測試集10,000張。我們的目標是訓練一個能分類各類服裝配飾的模型。
import pandas as pd import numpy as np from glob import glob import cv2 images = [cv2.imread(file) for file in glob('train/*.png')]
注:必須使用train文件夾的路徑替換glob函數(shù)內(nèi)的路徑。
把這些圖像轉換為numpy數(shù)組格式,以便執(zhí)行數(shù)學運算并繪制圖像。
images = np.array(images) images.shape #(60000, 28, 28, 3) --這是一個三維數(shù)組,但我們的目標是把它轉成一維,因為后續(xù)只接受一維輸入。所以我們還得展平圖像: image = [] for i in range(0,60000): img = images[i].flatten() image.append(img) image = np.array(image)
創(chuàng)建一個數(shù)據(jù)框,其中包含每個像素的像素值,以及它們對應的標簽:
train = pd.read_csv("train.csv") # Give the complete path of your train.csv file feat_cols = [ 'pixel'+str(i) for i in range(image.shape[1]) ] df = pd.DataFrame(image,columns=feat_cols) df['label'] = train['label']
用因子分析分解數(shù)據(jù)集:
from sklearn.decomposition import FactorAnalysis FA = FactorAnalysis(n_components = 3).fit_transform(df[feat_cols].values)
這里,n_components 將決定轉換數(shù)據(jù)中的因子數(shù)量。轉換完成后,可視化結果:
%matplotlib inline import matplotlib.pyplot as plt plt.figure(figsize=(12,8)) plt.title('Factor Analysis Components') plt.scatter(FA[:,0], FA[:,1]) plt.scatter(FA[:,1], FA[:,2]) plt.scatter(FA[:,2],FA[:,0])
x軸和y軸表示分解因子的值,雖然共性因子是潛在的,很難被觀察到,但我們已經(jīng)成功降維。
2.7.1 因子分析的優(yōu)缺點
優(yōu)點:
1、在降維過程中可以使用類別的先驗知識經(jīng)驗,而像PCA這樣的無監(jiān)督學習則無法使用類別先驗知識。
2、LDA在樣本分類信息依賴均值而不是方差的時候,比PCA之類的算法較優(yōu)。
缺點:
1、LDA不適合對非高斯分布樣本進行降維
2、LDA降維最多降到k-1(k為類別數(shù))的維數(shù),如果我們降維的維度大于k-1,則不能使用LDA。
3、LDA在樣本分類信息依賴方差而不是均值的時候,降維效果不好。
4、LDA可能過度擬合數(shù)據(jù)
2.8 主成分分析(PCA)
基本思想:利用降維思維,將原來具有一定相關性的指標,通過正交變換,重新組合成一組新的相互無關的綜合指標,即從原始變量中導出少數(shù)幾個主成分,使它們盡可能多地保留原始變量的信息,且彼此間互不相關。無關變量稱為主成分。
2.8.1 PCA的特點:
1、主成分是原始變量的線性組合。
2、第一個主成分具有最大的方差值。
3、第二主成分試圖解釋數(shù)據(jù)集中的剩余方差,并且與第一主成分不相關(正交)。
4、第三主成分試圖解釋前兩個主成分等沒有解釋的方差。
2.8.2 PCA計算步驟:
1.將數(shù)據(jù)標準化
2.求出協(xié)方差矩陣
3.求出協(xié)方差矩陣對應的特征值和特征向量
4.將特征向量按對應特征值大小從上到下按行排列,取k行組成矩陣p
5.Y=PX即為降維到k維后的數(shù)據(jù)
貢獻率:總方差中第i個主成分占總p個主成分的比例
載荷:
實現(xiàn)PCA:
from sklearn.decomposition import PCA pca = PCA(n_components=4) pca_result = pca.fit_transform(df[feat_cols].values) """查看PCA的一些屬性""" print(pca_result.shape) # (200000, 10) print(pca.explained_variance_) # 屬性可以查看降維后的每個特征向量上所帶的信息量大?。山忉屝苑讲畹拇笮。? print(pca.explained_variance_ratio_) # 查看降維后的每個新特征的信息量占原始數(shù)據(jù)總信息量的百分比 print(pca.explained_variance_ratio_.sum()) # 降維后信息保留量
其中n_components 將決定轉換數(shù)據(jù)中的主成分。接下來,我們看一下這四個主成分解釋了多少方差:
plt.plot(range(4), pca.explained_variance_ratio_) plt.plot(range(4), np.cumsum(pca.explained_variance_ratio_)) plt.title("Component-wise and Cumulative Explained Variance")
在上圖中,藍線表示分量解釋的方差,而橙線表示累積解釋的方差。我們只用四個成分就解釋了數(shù)據(jù)集中約60%的方差。
2.8.3 PCA優(yōu)缺點:
優(yōu)點:
1、僅僅需要以方差衡量信息量,不受數(shù)據(jù)集以外的因素影響?!?br />2、各主成分之間正交,可消除原始數(shù)據(jù)成分間的相互影響的因素。
3、計算方法簡單,主要運算是特征值分解,易于實現(xiàn)。
缺點:
1、主成分各個特征維度的含義具有一定的模糊性,不如原始樣本特征的解釋性強。
2、方差小的非主成分也可能含有對樣本差異的重要信息,因降維丟棄可能對后續(xù)數(shù)據(jù)處理有影響
2.8.4 PCA與LDA的聯(lián)系與區(qū)別: 聯(lián)系
兩者其本質(zhì)是要將初始樣本映射到維度更低的樣本空間中,都有降維和信息濃縮的方法,生成的新變量均代表了原始變量的大部分信息且相互獨立。
區(qū)別
(1)PCA是按照方差最大化的方法生成新變量,為了讓映射后的樣本具有最大的發(fā)散性,強調(diào)新變量貢獻了多大比例的方差,不關心新變量是否具有明確的實際意義。PCA是一種無監(jiān)督的降維方法。
(2)LDA著重要求新變量具有實際意義,能解釋原始變量間內(nèi)在結構,LDA不是對原始變量的重新組合,而是為了讓映射后的樣本有最好的分類性能,對原始變量進行分解,分解為公共因子和特殊因子。LDA是一種有監(jiān)督的降維方法。
三、降維方法使用場景。
缺失值比率:如果數(shù)據(jù)集的缺失值太多,我們可以用這種方法減少變量數(shù)。
低方差濾波:這個方法可以從數(shù)據(jù)集中識別和刪除常量變量,方差小的變量對目標變量影響不大,所以可以放心刪去。
高相關濾波:具有高相關性的一對變量會增加數(shù)據(jù)集中的多重共線性,所以用這種方法刪去其中一個是有必要的。
隨機森林:這是最常用的降維方法之一,它會明確算出數(shù)據(jù)集中每個特征的重要性。
前向特征選擇和反向特征消除:這兩種方法耗時較久,計算成本也都很高,所以只適用于輸入變量較少的數(shù)據(jù)集。
因子分析:這種方法適合數(shù)據(jù)集中存在高度相關的變量集的情況。
PCA:這是處理線性數(shù)據(jù)最廣泛使用的技術之一。
到此這篇關于python八種降維方法匯總的文章就介紹到這了,更多相關python 降維內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python中l(wèi)ist循環(huán)語句用法實例
這篇文章主要介紹了python中l(wèi)ist循環(huán)語句用法,以實例形式詳細介紹了Python針對list的解析,包含各種常見的遍歷操作及原理分析,需要的朋友可以參考下2014-11-11利用python-pypcap抓取帶VLAN標簽的數(shù)據(jù)包方法
今天小編就為大家分享一篇利用python-pypcap抓取帶VLAN標簽的數(shù)據(jù)包方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07詳解Python+Turtle繪制奧運標志的實現(xiàn)
turtle庫是Python標準庫之一,是入門級的圖形繪制函數(shù)庫。本文就將利用turtle庫繪制一個奧運標志—奧運五環(huán),感興趣的可以學習一下2022-02-02