精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么要降維?降維技術一覽

zhKF_jqr_AI ? 來源:未知 ? 作者:李倩 ? 2018-08-31 10:03 ? 次閱讀

你遇到過特征超過1000個的數據集嗎?超過5萬個的呢?我遇到過。降維是一個非常具有挑戰性的任務,尤其是當你不知道該從哪里開始的時候。擁有這么多變量既是一個恩惠——數據量越大,分析結果越可信;也是一種詛咒——你真的會感到一片茫然,無從下手。

面對這么多特征,在微觀層面分析每個變量顯然不可行,因為這至少要幾天甚至幾個月,而這背后的時間成本是難以估計的。為此,我們需要一種更好的方法來處理高維數據,比如本文介紹的降維:一種能在減少數據集中特征數量的同時,避免丟失太多信息并保持/改進模型性能的方法。

什么是降維?

每天,我們都會生成大量數據,而事實上,現在世界上約90%的數據都是在過去3到4年中產生的,這是個令人難以置信的現實。如果你不信,下面是收集數據的幾個示例:

Facebook會收集你喜歡、分享、發布、訪問的內容等數據,比如你喜歡哪家餐廳。

智能手機中的各類應用會收集大量關于你的個人信息,比如你所在的地點。

淘寶會收集你在其網站上購買、查看、點擊的內容等數據。

賭場會跟蹤每位客戶的每一步行動。

隨著數據的生成和數據收集量的不斷增加,可視化和繪制推理圖變得越來越困難。一般情況下,我們經常會通過繪制圖表來可視化數據,比如假設我們手頭有兩個變量,一個年齡,一個身高。我們就可以繪制散點圖或折線圖,輕松反映它們之間的關系。

下圖是一個簡單的例子:

其中橫坐標X1的單位為“千克”,縱坐標X2的單位為“磅”。可以發現,雖然是兩個變量,但它們傳達的信息是一致的,即物體的重量。所以我們只需選用其中的一個就能保留原始意義,把2維數據壓縮到1維(Y1)后,上圖就變成:

類似地,我們可以把數據從原本的p維轉變為一系列k維的子集(k<

為什么要降維?

以下是在數據集中應用降維的用處:

隨著數據維度不斷降低,數據存儲所需的空間也會隨之減少。

低維數據有助于減少計算/訓練用時。

一些算法在高維度數據上容易表現不佳,降維可提高算法可用性。

降維可以用刪除冗余特征解決多重共線性問題。比如我們有兩個變量:“一段時間內在跑步機上的耗時”和“卡路里消耗量”。這兩個變量高度相關,在跑步機上花的時間越長,燃燒的卡路里自然就越多。因此,同時存儲這兩個數據意義不大,只需一個就夠了。

降維有助于數據可視化。如前所述,如果數據維度很高,可視化會變得相當困難,而繪制二維三維數據的圖表非常簡單。

數據集1:Big Mart Sales III

降維技術一覽

數據維度的降低方法主要有兩種:

僅保留原始數據集中最相關的變量(特征選擇)。

尋找一組較小的新變量,其中每個變量都是輸入變量的組合,包含與輸入變量基本相同的信息(降維)。

1. 缺失值比率(Missing Value Ratio)

假設你有一個數據集,你第一步會做什么?在構建模型前,對數據進行探索性分析必不可少。但在瀏覽數據的過程中,有時候我們會發現其中包含不少缺失值。如果缺失值少,我們可以填補缺失值或直接刪除這個變量;如果缺失值過多,你會怎么辦呢?

當缺失值在數據集中的占比過高時,一般我會選擇直接刪除這個變量,因為它包含的信息太少了。但具體刪不刪、怎么刪需要視情況而定,我們可以設置一個閾值,如果缺失值占比高于閾值,刪除它所在的列。閾值越高,降維方法越積極。

下面是具體代碼:

# 導入需要的庫

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

加載數據:

# 讀取數據

train=pd.read_csv("Train_UWu5bXk.csv")

[注]:應在讀取數據時添加文件的路徑。

用.isnull().sum()檢查每個變量中缺失值的占比:

train.isnull().sum()/len(train)*100

如上表所示,缺失值很少。我們設閾值為20%:

# 保存變量中的缺失值

a = train.isnull().sum()/len(train)*100

# 保存列名

variables = train.columns

variable = [ ]

for i in range(0,12):

if a[i]<=20: ? #setting the threshold as 20%

variable.append(variables[i])

2. 低方差濾波(Low Variance Filter)

如果我們有一個數據集,其中某列的數值基本一致,也就是它的方差非常低,那么這個變量還有價值嗎?和上一種方法的思路一致,我們通常認為低方差變量攜帶的信息量也很少,所以可以把它直接刪除。

放到實踐中,就是先計算所有變量的方差大小,然后刪去其中最小的幾個。需要注意的一點是:方差與數據范圍相關的,因此在采用該方法前需要對數據做歸一化處理。

放在示例中,我們先估算缺失值:

train['Item_Weight'].fillna(train['Item_Weight'].median, inplace=True)

train['Outlet_Size'].fillna(train['Outlet_Size'].mode()[0], inplace=True)

檢查缺失值是否已經被填充:

train.isnull().sum()/len(train)*100

再計算所有數值變量的方差:

train.var()

如上圖所示,和其他變量相比,Item_Visibility的方差非常小,因此可以把它直接刪除。

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)):

ifvar[i]>=10: # 將閾值設置為10%

variable.append(numeric[i+1])

以上代碼幫我們列出了方差大于10的所有變量。

3. 高相關濾波(High Correlation filter)

如果兩個變量之間是高度相關的,這意味著它們具有相似的趨勢并且可能攜帶類似的信息。同理,這類變量的存在會降低某些模型的性能(例如線性和邏輯回歸模型)。為了解決這個問題,我們可以計算獨立數值變量之間的相關性。如果相關系數超過某個閾值,就刪除其中一個變量。

作為一般準則,我們應該保留那些與目標變量顯示相當或高相關性的變量。

首先,刪除因變量(ItemOutletSales),并將剩余的變量保存在新的數據列(df)中。

df=train.drop('Item_Outlet_Sales', 1)

df.corr()

如上表所示,示例數據集中不存在高相關變量,但通常情況下,如果一對變量之間的相關性大于0.5-0.6,那就應該考慮是否要刪除一列了。

4. 隨機森林(Random Forest)

隨機森林是一種廣泛使用的特征選擇算法,它會自動計算各個特征的重要性,所以無需單獨編程。這有助于我們選擇較小的特征子集。

在開始降維前,我們先把數據轉換成數字格式,因為隨機森林只接受數字輸入。同時,ID這個變量雖然是數字,但它目前并不重要,所以可以刪去。

from sklearn.ensemble importRandomForestRegressor

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)

擬合模型后,根據特征的重要性繪制成圖:

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()

基于上圖,我們可以手動選擇最頂層的特征來減少數據集中的維度。如果你用的是sklearn,可以直接使用SelectFromModel,它根據權重的重要性選擇特征。

from sklearn.feature_selection importSelectFromModel

feature = SelectFromModel(model)

Fit = feature.fit_transform(df, train.Item_Outlet_Sales)

5. 反向特征消除(Backward Feature Elimination)

以下是反向特征消除的主要步驟:

先獲取數據集中的全部n個變量,然后用它們訓練一個模型。

計算模型的性能。

在刪除每個變量(n次)后計算模型的性能,即我們每次都去掉一個變量,用剩余的n-1個變量訓練模型。

確定對模型性能影響最小的變量,把它刪除。

重復此過程,直到不再能刪除任何變量。

在構建線性回歸或Logistic回歸模型時,可以使用這種方法。

from sklearn.linear_model importLinearRegression

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)

我們需要指定算法和要選擇的特征數量,然后返回反向特征消除輸出的變量列表。此外,rfe.ranking_可以用來檢查變量排名。

6. 前向特征選擇(Forward Feature Selection)

前向特征選擇其實就是反向特征消除的相反過程,即找到能改善模型性能的最佳特征,而不是刪除弱影響特征。它背后的思路如下所述:

選擇一個特征,用每個特征訓練模型n次,得到n個模型。

選擇模型性能最佳的變量作為初始變量。

每次添加一個變量繼續訓練,重復上一過程,最后保留性能提升最大的變量。

一直添加,一直篩選,直到模型性能不再有明顯提高。

from sklearn.feature_selection import f_regression

ffs = f_regression(df,train.Item_Outlet_Sales )

上述代碼會返回一個數組,其中包括變量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])

[注]:前向特征選擇和反向特征消除耗時較久,計算成本也都很高,所以只適用于輸入變量較少的數據集。

到目前為止,我們介紹的6種方法都能很好地解決示例的商場銷售預測問題,因為這個數據集本身輸入變量不多。在下文中,為了展示多變量數據集的降維方法,我們將把數據集改成Fashion MNIST,它共有70,000張圖像,其中訓練集60,000張,測試集10,000張。我們的目標是訓練一個能分類各類服裝配飾的模型。

數據集2:Fashion MNIST

7. 因子分析(Factor Analysis)

因子分析是一種常見的統計方法,它能從多個變量中提取共性因子,并得到最優解。假設我們有兩個變量:收入和教育。它們可能是高度相關的,因為總體來看,學歷高的人一般收入也更高,反之亦然。所以它們可能存在一個潛在的共性因子,比如“能力”。

在因子分析中,我們將變量按其相關性分組,即特定組內所有變量的相關性較高,組間變量的相關性較低。我們把每個組稱為一個因子,它是多個變量的組合。和原始數據集的變量相比,這些因子在數量上更少,但攜帶的信息基本一致。

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函數內的路徑。

現在我們先把這些圖像轉換為numpy數組格式,以便執行數學運算并繪制圖像。

images = np.array(images)

images.shape

返回:(60000, 28, 28, 3)

如上所示,這是一個三維數組,但我們的目標是把它轉成一維,因為后續只接受一維輸入。所以我們還得展平圖像:

image = []

for i in range(0,60000):

img = images[i].flatten()

image.append(img)

image = np.array(image)

創建一個數據框,其中包含每個像素的像素值,以及它們對應的標簽

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']

用因子分析分解數據集:

from sklearn.decomposition importFactorAnalysis

FA = FactorAnalysis(n_components = 3).fit_transform(df[feat_cols].values)

這里,n_components將決定轉換數據中的因子數量。轉換完成后,可視化結果:

%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軸表示分解因子的值,雖然共性因子是潛在的,很難被觀察到,但我們已經成功降維。

8. 主成分分析(PCA)

如果說因子分析是假設存在一系列潛在因子,能反映變量攜帶的信息,那PCA就是通過正交變換將原始的n維數據集變換到一個新的被稱做主成分的數據集中,即從現有的大量變量中提取一組新的變量。下面是關于PCA的一些要點:

主成分是原始變量的線性組合。

第一個主成分具有最大的方差值。

第二主成分試圖解釋數據集中的剩余方差,并且與第一主成分不相關(正交)。

第三主成分試圖解釋前兩個主成分等沒有解釋的方差。

再進一步降維前,我們先隨機繪制數據集中的某些圖:

rndperm = np.random.permutation(df.shape[0])

plt.gray()

fig = plt.figure(figsize=(20,10))

for i in range(0,15):

ax = fig.add_subplot(3,5,i+1)

ax.matshow(df.loc[rndperm[i],feat_cols].values.reshape((28,28*3)).astype(float))

實現PCA:

from sklearn.decomposition import PCA

pca = PCA(n_components=4)

pca_result = pca.fit_transform(df[feat_cols].values)

其中n_components將決定轉換數據中的主成分。接下來,我們看一下這四個主成分解釋了多少方差:

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")

在上圖中,藍線表示分量解釋的方差,而橙線表示累積解釋的方差。我們只用四個成分就解釋了數據集中約60%的方差。

9. 獨立分量分析(ICA)

獨立分量分析(ICA)基于信息理論,是最廣泛使用的降維技術之一。PCA和ICA之間的主要區別在于,PCA尋找不相關的因素,而ICA尋找獨立因素。

如果兩個變量不相關,它們之間就沒有線性關系。如果它們是獨立的,它們就不依賴于其他變量。例如,一個人的年齡和他吃了什么/看了什么電視無關。

該算法假設給定變量是一些未知潛在變量的線性混合。它還假設這些潛在變量是相互獨立的,即它們不依賴于其他變量,因此它們被稱為觀察數據的獨立分量。

下圖是ICA和PCA的一個直觀比較:

(a)PCA,(b)ICA

PCA的等式是x = Wχ。

這里,

x是觀察結果

W是混合矩陣

χ是來源或獨立成分

現在我們必須找到一個非混合矩陣,使成分盡可能獨立。而測試成分獨立性最常用的方法是非高斯性:

根據中心極限定理(Central Limit Theorem),多個獨立隨機變量混合之后會趨向于正態分布(高斯分布)。

因此,我們可以尋找所有獨立分量中能最大化峰度的分量。

一旦峰度被最大化,整個分布會呈現非高斯分布,我們也能得到獨立分量。

Python中實現ICA:

from sklearn.decomposition importFastICA

ICA = FastICA(n_components=3, random_state=12)

X=ICA.fit_transform(df[feat_cols].values)

10. IOSMAP

代碼:

from sklearn import manifold

trans_data = manifold.Isomap(n_neighbors=5, n_components=3, n_jobs=-1).fit_transform(df[feat_cols][:6000].values)

使用的參數

n_neighbors:決定每個點的相鄰點數

n_components:決定流形的坐標數

n_jobs = -1:使用所有可用的CPU核心

可視化:

plt.figure(figsize=(12,8))

plt.title('Decomposition using ISOMAP')

plt.scatter(trans_data[:,0], trans_data[:,1])

plt.scatter(trans_data[:,1], trans_data[:,2])

plt.scatter(trans_data[:,2], trans_data[:,0])

11. t-SNE

代碼:

from sklearn.manifold import TSNE

tsne = TSNE(n_components=3, n_iter=300).fit_transform(df[feat_cols][:6000].values)

可視化:

plt.figure(figsize=(12,8))

plt.title('t-SNE components')

plt.scatter(tsne[:,0], tsne[:,1])

plt.scatter(tsne[:,1], tsne[:,2])

plt.scatter(tsne[:,2], tsne[:,0])

12. UMAP

代碼:

import umap

umap_data = umap.UMAP(n_neighbors=5, min_dist=0.3, n_components=3).fit_transform(df[feat_cols][:6000].values)

這里,

n_neighbors:確定相鄰點的數量。

min_dist:控制允許嵌入的緊密程度,較大的值可確保嵌入點的分布更均勻。

可視化:

plt.figure(figsize=(12,8))

plt.title('Decomposition using UMAP')

plt.scatter(umap_data[:,0], umap_data[:,1])

plt.scatter(umap_data[:,1], umap_data[:,2])

plt.scatter(umap_data[:,2], umap_data[:,0])

總結

到目前為止,我們已經介紹了12種降維方法,考慮到篇幅,我們沒有仔細介紹后三種方法的原理,感興趣的讀者可以找資料查閱,因為它們中的任何一個都足夠寫一篇專門介紹的長文。本節會對這12種方法做一個總結,簡要介紹它們的優點和缺點。

缺失值比率:如果數據集的缺失值太多,我們可以用這種方法減少變量數。

低方差濾波:這個方法可以從數據集中識別和刪除常量變量,方差小的變量對目標變量影響不大,所以可以放心刪去。

高相關濾波:具有高相關性的一對變量會增加數據集中的多重共線性,所以用這種方法刪去其中一個是有必要的。

隨機森林:這是最常用的降維方法之一,它會明確算出數據集中每個特征的重要性。

前向特征選擇和反向特征消除:這兩種方法耗時較久,計算成本也都很高,所以只適用于輸入變量較少的數據集。

因子分析:這種方法適合數據集中存在高度相關的變量集的情況。

PCA:這是處理線性數據最廣泛使用的技術之一。

ICA:我們可以用ICA將數據轉換為獨立的分量,使用更少的分量來描述數據。

ISOMAP:適合非線性數據處理。

t-SNE:也適合非線性數據處理,相較上一種方法,這種方法的可視化更直接。

UMAP:適用于高維數據,與t-SNE相比,這種方法速度更快。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 降維
    +關注

    關注

    0

    文章

    10

    瀏覽量

    7643
  • 數據集
    +關注

    關注

    4

    文章

    1205

    瀏覽量

    24647

原文標題:12種降維方法終極指南(含Python代碼)

文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    求助,SVM分類時要不要先進行PCA呢?

    大家知道,既然SVM可以較好地解決小樣本、非線性、高數等分類問題,那對于高樣本輸入,需不需要提前進行PCA呢?PCA
    發表于 10-27 20:13

    文本分類中種混合型特征方法

    提出種基于特征選擇和特征抽取的混合型文本特征方法,分析基于選擇和抽取的特征方法各自的特點,借助特征項的類別分布差異信息對特征集進行
    發表于 04-01 08:46 ?7次下載

    基于圖嵌入和最大互信息組合的

    在特征方面,圖嵌入框架統了PCA, LDA 等系列特征算法,方便求解,但相似度矩陣計
    發表于 08-21 10:24 ?9次下載

    空時自適應處理研究

    是空時自適應處理(STAP :SPACE-TIME ADAPTIVE PROCESSING)實用化的重要手段,基于雜波協方差矩陣特征分解的
    發表于 12-18 16:46 ?13次下載

    卡諾圖在邏輯函數設計中的應用

    給出了由邏輯函數表達式直接做卡諾圖、用卡諾圖化簡邏輯函數的具體步驟和方法,并分析了在設計組合邏輯電路中,用
    發表于 04-18 15:27 ?44次下載
    <b class='flag-5'>降</b><b class='flag-5'>維</b>卡諾圖在邏輯函數設計中的應用

    基于圖論的人臉圖像數據方法綜述

    近幾年基于圖論的方法越來越得到人們的關注,本文針對人臉識別中的核心問題即對高數據進行的目的,首先介紹了有關圖論的基本概念,通過總結
    發表于 09-03 16:13 ?0次下載

    基于FPGA的高光譜圖像奇異值分解技術

    基于FPGA的高光譜圖像奇異值分解技術
    發表于 08-30 15:10 ?2次下載

    種基于局部結構保持的數據方法

    種基于局部結構保持的數據方法_張琳
    發表于 01-07 18:56 ?2次下載

    基于Wasserstein距離概率分布模型的非線性算法

    Wasserstein距離引入,提出個基于Wasserstein距離概率分布模型的非線性算法W-map。W-map模型在高
    發表于 11-24 17:13 ?3次下載

    基于間距的方法_間距判別投影

    針對全局方法判別信息不足,局部方法對鄰域關系的判定存在缺陷的問題,提出種新的基于間距的
    發表于 12-03 11:20 ?1次下載

    由淺入深的對其原理進行了詳細總結

    矩陣是由多個列向量組成的,因此矩陣思想與向量思想樣,只要求得矩陣在各基向量的投影即可,基向量可以理解為新的坐標系,投影就是
    的頭像 發表于 03-22 14:01 ?8138次閱讀
    由淺入深的對其<b class='flag-5'>降</b><b class='flag-5'>維</b>原理進行了詳細總結

    如何使用FPGA實現高光譜圖像奇異值分解技術

    了解決高光譜圖像數高、數據量巨大、實時處理技術實現難的問題,提出了高光譜圖像實時處理技術。采用奇異值分解(SVD)算法對高光譜圖像進行
    發表于 03-11 16:07 ?10次下載
    如何使用FPGA實現高光譜圖像奇異值分解<b class='flag-5'>降</b><b class='flag-5'>維</b><b class='flag-5'>技術</b>

    種新型的數據采集多視圖算法技術

    。為更好地利用多視圖數據,促進算法在實際中的應用,對多視圖算法進行研究。分析多視圖數據和多視圖學習,在典型相關分析(CCA)的基礎上追溯多視圖CCA和核CCA,介紹多視圖
    發表于 05-28 10:53 ?5次下載

    關于Python 的11種經典數據算法

    、TSNE 等,并附有相關資料、展示效果;非常適合機器學習初學者和剛剛入坑數據挖掘的小伙伴。 、為什么進行數據? 所謂
    的頭像 發表于 06-04 15:03 ?1806次閱讀

    淺析卷積與池化的對比

    在學習深度學習中卷積網絡過程中,有卷積層,池化層,全連接層等等,其中卷積層與池化層均可以對特征圖,本次實驗針對控制其他層次致的情況下,使用卷積
    的頭像 發表于 02-17 14:58 ?1043次閱讀
    淺析卷積<b class='flag-5'>降</b><b class='flag-5'>維</b>與池化<b class='flag-5'>降</b><b class='flag-5'>維</b>的對比