成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

十二種必須掌握的降維知識(shí)(Python代碼)

haobowd / 3105人閱讀

摘要:在研究數(shù)據(jù)時(shí),你會(huì)發(fā)現(xiàn)數(shù)據(jù)集中存在一些缺失值?,F(xiàn)在,我們將檢查每個(gè)變量中缺失值的百分比。我們可以使用適當(dāng)?shù)姆椒▉磔斎胱兞浚蛘呶覀兛梢栽O(shè)置閾值,比如,并刪除具有超過缺失值的變量。讓我們首先使用已知觀察值的中值來填充列中的缺失值。

介紹

你是否曾經(jīng)處理過具有一千多個(gè)特征的數(shù)據(jù)集?5萬(wàn)多個(gè)特征呢?我曾經(jīng)有過,讓我告訴你這是一項(xiàng)非常具有挑戰(zhàn)性的任務(wù),特別是如果你不知道從哪里開始的時(shí)候!擁有大量的變量既是好事,也是壞事。我們有大量的數(shù)據(jù)用于分析,這很棒,但由于規(guī)模太大,它變得非常具有挑戰(zhàn)性。

在微觀層面分析每個(gè)變量是不可行的。我們可能需要幾天或幾個(gè)月才能進(jìn)行任何有意義的分析,我們將會(huì)為我們的業(yè)務(wù)損失大量的時(shí)間和金錢!更不用說這將需要的計(jì)算能力。我們需要一種更好的方法來處理高維數(shù)據(jù),以便我們能夠快速?gòu)闹刑崛∧J胶鸵娊?。那么我們?nèi)绾翁幚磉@樣的數(shù)據(jù)集呢?

當(dāng)然是使用降維技術(shù)。你可以使用這個(gè)技術(shù)來減少數(shù)據(jù)集中的特征數(shù)量,而不必丟失太多信息并保持(或改進(jìn))模型的性能。正如你將在本文中看到的,這是處理大型數(shù)據(jù)集的一種非常強(qiáng)大的方法。

這是一個(gè)可以在實(shí)際場(chǎng)景中使用的各種降維技術(shù)的綜合指南。在深入介紹我所涵蓋的12種不同技術(shù)之前,我們將首先了解這個(gè)概念是什么以及為什么要使用它。并且每種技術(shù)都有自己的Python實(shí)現(xiàn)代碼,讓你更好的熟悉它。

1.什么是降維?

我們每天都在生成大量的數(shù)據(jù)。事實(shí)上,世界上90%的數(shù)據(jù)都是在過去的3到4年中產(chǎn)生的!這些數(shù)字真的令人難以置信。以下是收集的數(shù)據(jù)的一些例子:

Facebook會(huì)收集你喜歡的,分享的,發(fā)布的,訪問的地點(diǎn),你喜歡的餐館等的數(shù)據(jù)。

你的智能手機(jī)應(yīng)用程序會(huì)收集大量有關(guān)于你的個(gè)人信息

亞馬遜會(huì)收集你在其網(wǎng)站上購(gòu)買,查看,點(diǎn)擊等內(nèi)容的數(shù)據(jù)

賭場(chǎng)會(huì)跟蹤每位客戶的一舉一動(dòng)

隨著數(shù)據(jù)生成和收集量的不斷增加,可視化和繪制分析變得越來越具有挑戰(zhàn)性。進(jìn)行可視化的最常見方法之一是通過圖表。假設(shè)我們有2個(gè)變量,年齡Age和身高Height。我們可以使用Age和Height之間的散點(diǎn)圖或線圖,并輕松地將它們的關(guān)系可視化:

現(xiàn)在考慮我們有100個(gè)變量(p = 100)的情況。在這種情況下,我們可以有100(100-1)/ 2 = 5000個(gè)不同的圖。將它們分別可視化是沒有多大意義的,對(duì)吧?在我們有大量變量的情況下,最好選擇這些變量的一個(gè)子集(p << 100),它獲取的信息與原始變量集一樣多。

讓我們用一個(gè)簡(jiǎn)單的例子來理解這一點(diǎn)。考慮下面的圖像:

這里我們有類似物體的重量,單位為Kg(X1)和磅(X2)。如果我們使用這兩個(gè)變量,它們將傳達(dá)相類似的信息。因此,僅使用一個(gè)變量是有意義的。我們可以將數(shù)據(jù)從2D(X1和X2)轉(zhuǎn)換為1D(Y1),如下所示:

類似地,我們可以將數(shù)據(jù)的p維度減少為k維度的子集(k << n)。這稱為降維。

2.為什么需要降維?

以下是將降維應(yīng)用于數(shù)據(jù)集的一些好處:

隨著維度數(shù)量的減少,存儲(chǔ)數(shù)據(jù)所需的空間會(huì)減少

更少的維度導(dǎo)致更少的計(jì)算/訓(xùn)練時(shí)間

當(dāng)我們有一個(gè)大的維度時(shí),一些算法的表現(xiàn)不佳。因此,需要減少這些維度才能使算法有用

它通過刪除冗余的特征來處理多重共線性問題。例如,你有兩個(gè)變量 - “在跑步機(jī)上花費(fèi)的時(shí)間”和“燃燒的卡路里”。這些變量是高度相關(guān)的,因?yàn)槟阍谂懿綑C(jī)上花費(fèi)的時(shí)間越多,你燃燒的卡路里就越多。因此,存儲(chǔ)兩個(gè)變量都沒有意義,只有其中一個(gè)可以滿足需求

它有助于可視化數(shù)據(jù)。如前所述,在高維度中可視化數(shù)據(jù)是非常困難的,因此將我們的空間縮小到2D或3D可以讓我們更清晰地繪制和觀察數(shù)據(jù)

是時(shí)候深入了解本文的關(guān)鍵 - 各種降維技術(shù)!我們將使用一個(gè)實(shí)踐問題:Big Mart Sales III中的數(shù)據(jù)集點(diǎn)擊這里下載數(shù)據(jù)提取碼為:fmk0 。

3.常用的降維技術(shù)

降維可以通過兩種不同的方式完成:

僅保留原始數(shù)據(jù)集中最相關(guān)的變量(此技術(shù)稱為特征選擇)

通過查找較小的一組新變量,每個(gè)變量都是輸入變量的組合,包含與輸入變量基本相同的信息(此技術(shù)稱為降維)

我們現(xiàn)在將介紹各種降維技術(shù)以及如何在Python中實(shí)現(xiàn)它們。

3.1缺失值比率

假設(shè)你有一個(gè)數(shù)據(jù)集。你的第一步是什么?在構(gòu)建模型之前,你應(yīng)該會(huì)希望先探索數(shù)據(jù)。在研究數(shù)據(jù)時(shí),你會(huì)發(fā)現(xiàn)數(shù)據(jù)集中存在一些缺失值。怎么辦?你將嘗試找出這些缺失值的原因,然后將輸入它們或完全刪除具有缺失值的變量(使用適當(dāng)?shù)姆椒ǎ?/p>

如果我們有太多的缺失值(比如說超過50%)怎么辦?我們應(yīng)該輸入這些缺失值還是直接刪除變量?我寧愿放棄變量,因?yàn)樗鼪]有太多的信息。然而,這不是一成不變的。我們可以設(shè)置一個(gè)閾值,如果任何變量中缺失值的百分比大于該閾值,我們將刪除該變量。

讓我們?cè)赑ython中實(shí)現(xiàn)這種方法。

導(dǎo)入所需要的庫(kù)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

首先,讓我們加載數(shù)據(jù):

讀取數(shù)據(jù)

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

注意:應(yīng)在讀取數(shù)據(jù)時(shí)添加文件的路徑。

現(xiàn)在,我們將檢查每個(gè)變量中缺失值的百分比。我們可以使用.isnull().sum()來計(jì)算它。

檢查每個(gè)變量中缺失值的百分比

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

正如你在上表中所看到的,并沒有太多的缺失值(實(shí)際上只有2個(gè)變量具有缺失值)。我們可以使用適當(dāng)?shù)姆椒▉磔斎胱兞浚蛘呶覀兛梢栽O(shè)置閾值,比如20%,并刪除具有超過20%缺失值的變量。讓我們看看如何在Python中完成此操作:

保存變量中缺失的值

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

將列名保存在變量中

variables = train.columns
variable = [ ]
for i in range(0,12):
if a[i]<=20: #將閾值設(shè)置為20%
variable.append(variables[i])

因此,要使用的變量存儲(chǔ)在“variables”中,它只包含哪些缺失值小于20%的特征

3.2低方差過濾器

假設(shè)我們的數(shù)據(jù)集中的一個(gè)變量,其中所有觀察值都是相同的,例如1。如果我們要使用此變量,你認(rèn)為它可以改進(jìn)我們將要建立的模型么?答案當(dāng)然是否定的,因?yàn)檫@個(gè)變量的方差為零。

因此,我們需要計(jì)算給出的每個(gè)變量的方差。然后刪除與我們的數(shù)據(jù)集中其他變量相比方差比較小的變量。如上所述,這樣做的原因是方差較小的變量不會(huì)影響目標(biāo)變量。

讓我們首先使用已知ItemWeight觀察值的中值來填充temWeight列中的缺失值。對(duì)于OutletSize列,我們將使用已知OutletSize值的模式來填充缺失值:

train["Item_Weight"].fillna(train["Item_Weight"].median(), inplace=True)
train["Outlet_Size"].fillna(train["Outlet_Size"].mode()[0], inplace=True)

讓我們檢查一下是否所有的缺失值都已經(jīng)被填滿了:

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

嘿瞧!我們都已經(jīng)準(zhǔn)備好了?,F(xiàn)在讓我們計(jì)算所有數(shù)值變量的方差。

train.var()

如上面的輸出所示,與其他變量相比,Item_Visibility的方差非常小。我們可以安全地刪除此列。這就是我們應(yīng)用低方差過濾器的方法。讓我們?cè)赑ython中實(shí)現(xiàn)這個(gè):

numeric = 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: #將閾值設(shè)置為10%
variable.append(numeric[i+1])

上面的代碼為我們提供了方差大于10的變量列表。

3.3高度相關(guān)過濾器

兩個(gè)變量之間的高度相關(guān)意味著它們具有相似的趨勢(shì),并且可能攜帶類似的信息。這可以大大降低某些模型的性能(例如線性回歸和邏輯回歸模型)。我們可以計(jì)算出本質(zhì)上是數(shù)值的獨(dú)立數(shù)值變量之間的相關(guān)性。如果相關(guān)系數(shù)超過某個(gè)閾值,我們可以刪除其中一個(gè)變量(丟棄一個(gè)變量是非常主觀的,并且應(yīng)該始終記住該變量)。

作為一般準(zhǔn)則,我們應(yīng)該保留那些與目標(biāo)變量顯示出良好或高相關(guān)性的變量。

讓我們?cè)赑ython中執(zhí)行相關(guān)計(jì)算。我們將首先刪除因變量(ItemOutletSales)并將剩余的變量保存在新的DataFrame(df)中。

df=train.drop("Item_Outlet_Sales", 1)
df.corr()

太棒了,我們的數(shù)據(jù)集中沒有任何具有高相關(guān)性的變量。通常,如果一對(duì)變量之間的相關(guān)性大于0.5-0.6,我們真的應(yīng)該認(rèn)真的考慮丟棄其中的一個(gè)變量。

3.4 隨機(jī)森林

隨機(jī)森林是最廣泛使用的特征選擇算法之一。它附帶內(nèi)置的重要功能,因此你無需多帶帶編程。這有助于我們選擇較小的特征子集。

我們需要通過應(yīng)用一個(gè)熱編碼將數(shù)據(jù)轉(zhuǎn)換為數(shù)字形式,因?yàn)殡S機(jī)森林(Scikit-Learn實(shí)現(xiàn))僅采用數(shù)字輸入。讓我們也刪除ID變量(Item_IdentifierOutlet_Identifier),因?yàn)檫@些只是唯一的數(shù)字,目前對(duì)我們來說并不重要。

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)

擬合模型后,繪制特征重要性圖:

features = df.columns
importances = model.feature_importances_
indices = np.argsort(importances)[-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()

基于上圖,我們可以手動(dòng)選擇最頂層的特征來減少數(shù)據(jù)集中的維度。值得注意的是,我們可以使用sklearn的SelectFromModel來實(shí)現(xiàn)這一點(diǎn)。它根據(jù)權(quán)重的重要性來選擇特征。

from sklearn.feature_selection import SelectFromModel
feature = SelectFromModel(model)
Fit = feature.fit_transform(df, train.Item_Outlet_Sales)

3.5 反向特征消除

按照以下步驟來理解和使用“反向特征消除”技術(shù):

我們首先獲取數(shù)據(jù)集中存在的所有的n個(gè)變量,然后使用它們訓(xùn)練模型

然后我們計(jì)算模型的性能

現(xiàn)在,我們?cè)谙總€(gè)變量(n次)后計(jì)算模型的性能,即我們每次都丟棄一個(gè)變量并在剩余的n-1個(gè)變量上訓(xùn)練模型

我們確定移除變量后對(duì)模型性能影響最?。ɑ驔]有)變化的變量,然后刪除該變量

重復(fù)此過程,直到不能刪除任何變量

在構(gòu)建線性回歸或邏輯回歸模型時(shí),可以使用此方法。我們來看看它的Python實(shí)現(xiàn):

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”命令檢查變量的排名。

3.6 正向特征選擇

這與我們?cè)谏厦婵吹降姆聪蛱卣飨倪^程相反。我們是嘗試找到改善模型性能的最佳特征,而不是消除特征。該技術(shù)的工作原理如下:

我們從一個(gè)特征開始。本質(zhì)上,我們分別使用每個(gè)特征訓(xùn)練模型n次

選擇性能最佳的變量作為起始變量

然后我們重復(fù)這個(gè)過程并每次只添加一個(gè)變量。保留產(chǎn)生最高性能增長(zhǎng)的變量

我們重復(fù)這個(gè)過程,直到模型的性能沒有顯著的改進(jìn)

讓我們用Python實(shí)現(xiàn)它:

from sklearn.feature_selection import f_regression
ffs = f_regression(df,train.Item_Outlet_Sales )

這將返回一個(gè)數(shù)組,其中包含變量的F值和與每個(gè)F值對(duì)應(yīng)的p值。為了我們的目的,我們將選擇F值大于10的變量:

variable = [ ]
for i in range(0,len(df.columns)-1):
if ffs0 >=10:
variable.append(df.columns[i])

這為我們提供了基于正向特征選擇算法的最多變量。

注意反向特征消除和正向特征選擇都是非常耗時(shí)且計(jì)算成本高的。它們實(shí)際上僅用于具有少量輸入變量的數(shù)據(jù)集。

到目前為止我們看到的技術(shù)通常在我們的數(shù)據(jù)集中沒有太多變量時(shí)使用。這些或多或少的特征選擇技術(shù),在接下來的部分中,我們將使用Fashion MNIST數(shù)據(jù)集,該數(shù)據(jù)集包含屬于不同類型服裝的圖像,例如T恤,褲子,包等。數(shù)據(jù)集可點(diǎn)擊此處下載,提取碼為:a708。

該數(shù)據(jù)集共有70,000張圖像,其中60,000張?jiān)谟?xùn)練集中,其余10,000張是測(cè)試圖像。在本文的范圍中,我們將僅處理訓(xùn)練圖像。訓(xùn)練集文件采用zip格式。解壓縮zip文件后,你將獲得一個(gè).csv文件和一個(gè)包含這60,000張圖像的訓(xùn)練集文件夾。每個(gè)圖像的相應(yīng)標(biāo)簽可以在"train.csv"文件中找到。

3.7 因子分析

假設(shè)我們有兩個(gè)變量:收入和教育。這些變量可能具有高度相關(guān)性,因?yàn)榫哂休^高教育水平的人往往具有顯著較高的收入,反之亦然。

在因子分析技術(shù)中,變量按其相關(guān)性進(jìn)行分組,即特定組內(nèi)的所有變量之間具有高度相關(guān)性,但往往與其他組的變量之間相關(guān)性較低。在這里,每個(gè)組都被稱為一個(gè)因子。與原始數(shù)據(jù)維度相比,這些因子的數(shù)量很少。但是,這些因子往往很難觀察到。

讓我們先讀入訓(xùn)練集文件夾中包含的所有圖像:

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)的路徑。

現(xiàn)在我們將這些圖像轉(zhuǎn)換為 numpy數(shù)組格式,以便我們可以執(zhí)行數(shù)學(xué)運(yùn)算并繪制圖像。

images = np.array(images)
images.shape

(60000,28,28,3)

如上所示,它是一個(gè)三維數(shù)組。我們必須將它轉(zhuǎn)換為一維的,因?yàn)樗屑磳⒊霈F(xiàn)的技術(shù)只需要一維輸入。為此,我們需要展平圖像:

image = []
for i in range(0,60000):
img = images[i].flatten()
image.append(img)
image = np.array(image)

現(xiàn)在讓我們創(chuàng)建一個(gè)DataFrame,其中包含每個(gè)圖像中每個(gè)像素的像素值,以及它們對(duì)應(yīng)的標(biāo)簽(對(duì)于標(biāo)簽,我們將使用train.csv文件)。

train = pd.read_csv("train.csv") # 給出你的train.csv文件的完整路徑
feat_cols = [ "pixel"+str(i) for i in range(image.shape[1]) ]
df = pd.DataFrame(image,columns=feat_cols)
df["label"] = train["label"]

現(xiàn)在我們將使用因子分析來分解數(shù)據(jù)集:

from sklearn.decomposition import FactorAnalysis
FA = FactorAnalysis(n_components = 3).fit_transform(df[feat_cols].values)

這里,n_components將決定轉(zhuǎn)換數(shù)據(jù)中的因子數(shù)量。轉(zhuǎn)換數(shù)據(jù)后,是時(shí)候可視化結(jié)果了:

%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)能夠成功地減少數(shù)據(jù)的維度。

3.8主成分分析(PCA)

PCA是一種技術(shù),可以幫助我們從現(xiàn)有的大量變量中提取一組新的變量。這些新提取的變量稱為主成分。為了便于你快速學(xué)習(xí)PCA降維,以下是你在進(jìn)一步處理之前應(yīng)該了解的關(guān)于PCA的一些要點(diǎn):

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

提取主成分的方法是,第一主成分解釋數(shù)據(jù)集中的最大方差

第二主成分試圖解釋數(shù)據(jù)集中的剩余方差,并與第一主成分不相關(guān)

第三主成分試圖解釋前兩個(gè)主成分無法解釋的方差等,以此類推

在繼續(xù)之前,我們將從我們的數(shù)據(jù)集中隨機(jī)繪制一些圖像:

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

讓我們使用Python實(shí)現(xiàn)PCA降維并轉(zhuǎn)換數(shù)據(jù)集:

from sklearn.decomposition import PCA
pca = PCA(n_components=4)
pca_result = pca.fit_transform(df[feat_cols].values)

在這種情況下,n_components將決定轉(zhuǎn)換數(shù)據(jù)中的主要成分的數(shù)量。讓我們看一下使用這4個(gè)成分解釋了多少差異。我們將使用explainvarianceratio_來計(jì)算相同的內(nèi)容。

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

在上圖中,藍(lán)線表示按成分解釋的方差,而橙線表示累積解釋的方差。我們只用四個(gè)組件就可以解釋數(shù)據(jù)集中大約60%的方差變化。現(xiàn)在讓我們嘗試可視化每個(gè)分解的成分:

import seaborn as sns
plt.style.use("fivethirtyeight")
fig, axarr = plt.subplots(2, 2, figsize=(12, 8))
sns.heatmap(pca.components_[0, :].reshape(28, 84), ax=axarr0, cmap="gray_r")
sns.heatmap(pca.components_[1, :].reshape(28, 84), ax=axarr0, cmap="gray_r")
sns.heatmap(pca.components_[2, :].reshape(28, 84), ax=axarr1, cmap="gray_r")
sns.heatmap(pca.components_[3, :].reshape(28, 84), ax=axarr1, cmap="gray_r")
axarr0.set_title(
"{0:.2f}% Explained Variance".format(pca.explained_variance_ratio_[0]*100),
fontsize=12
)
axarr0.set_title(
"{0:.2f}% Explained Variance".format(pca.explained_variance_ratio_[1]*100),
fontsize=12
)
axarr1.set_title(
"{0:.2f}% Explained Variance".format(pca.explained_variance_ratio_[2]*100),
fontsize=12
)
axarr1.set_title(
"{0:.2f}% Explained Variance".format(pca.explained_variance_ratio_[3]*100),
fontsize=12
)
axarr0.set_aspect("equal")
axarr0.set_aspect("equal")
axarr1.set_aspect("equal")
axarr1.set_aspect("equal")

plt.suptitle("4-Component PCA")

我們添加到PCA技術(shù)中的每個(gè)額外維度獲取模型中的方差越來越少。第一個(gè)部分是最重要的成分,其次是第二個(gè)成分,然后是第三個(gè)成分,依此類推。

我們還可以使用奇異值分解?(SVD)將我們的原始數(shù)據(jù)集分解為其成分,從而減少維數(shù)。

SVD將原始變量分解為三個(gè)組成矩陣。它主要用于從數(shù)據(jù)集中刪除冗余的特征。它使用特征值和特征向量的概念來確定這三個(gè)矩陣。由于本文的范圍,我們不會(huì)深入研究它的理論,但讓我們堅(jiān)持我們的計(jì)劃,即減少數(shù)據(jù)集中的維度。

讓我們實(shí)現(xiàn)SVD并分解我們的原始變量:

from sklearn.decomposition import TruncatedSVD?
svd = TruncatedSVD(n_components=3, random_state=42).fit_transform(df[feat_cols].values)

讓我們通過繪制前兩個(gè)主成分來可視化變換后的變量:

plt.figure(figsize=(12,8))
plt.title("SVD Components")
plt.scatter(svd[:,0], svd[:,1])
plt.scatter(svd[:,1], svd[:,2])
plt.scatter(svd[:,2],svd[:,0])

上面的散點(diǎn)圖非常清晰地向我們展示了分解的成分。如前所述,這些組件之間沒有太多相關(guān)性。

3.9獨(dú)立成分分析

獨(dú)立成分分析(ICA)是基于信息理論的,也是最廣泛使用的降維技術(shù)之一。PCA和ICA之間的主要區(qū)別在于PCA尋找不相關(guān)的因素,而ICA尋找獨(dú)立因素。

如果兩個(gè)變量不相關(guān),則意味著它們之間沒有線性關(guān)系。如果它們是獨(dú)立的,則意味著它們不依賴于任何其他變量。例如,一個(gè)人的年齡與該人吃什么或他/她看多少電視無關(guān)。

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

讓我們直觀地比較一下PCA和ICA,以便更好地了解它們的不同之處:

這里,圖像(a)表示PCA結(jié)果,而圖像(b)表示相同數(shù)據(jù)集上的ICA結(jié)果。

PCA的方程是x = W x。

x是觀察結(jié)果

W是混合矩陣

χ是來源或獨(dú)立成分

現(xiàn)在我們必須找到一個(gè)非混合矩陣,使成分盡可能的獨(dú)立。測(cè)量成分獨(dú)立性的最常用方法是非高斯性:

根據(jù)中心極限定理,獨(dú)立成分之和的分布傾向于正態(tài)分布(高斯分布)。

因此,我們可以尋找最大化獨(dú)立成分的每個(gè)分量的峰度的變換。峰度是分布的第三階段。

最大化峰度將使分布非高斯分布,因此獲得獨(dú)立成分。

上述分布是非高斯分布,這又使得各成分互相獨(dú)立。讓我們嘗試在Python中實(shí)現(xiàn)ICA:

from sklearn.decomposition import FastICA?
ICA = FastICA(n_components=3, random_state=12)?
X=ICA.fit_transform(df[feat_cols].values)

這里,n_components將決定轉(zhuǎn)換數(shù)據(jù)中的成分?jǐn)?shù)量。我們使用ICA將數(shù)據(jù)轉(zhuǎn)換為3個(gè)成分。讓我們看看它是如何改變數(shù)據(jù)的:

plt.figure(figsize=(12,8))
plt.title("ICA Components")
plt.scatter(X[:,0], X[:,1])
plt.scatter(X[:,1], X[:,2])
plt.scatter(X[:,2], X[:,0])

數(shù)據(jù)已經(jīng)被分成不同的獨(dú)立成分,在上圖中可以非常清楚地看到。X軸和Y軸表示分解的獨(dú)立成分的值。

現(xiàn)在我們將看到一些使用投影技術(shù)來減少數(shù)據(jù)維度的方法。

3.10基于投影的方法

首先,我們需要了解投影是什么。假設(shè)我們有兩個(gè)向量,矢量a和矢量b,如下所示:

我們想求a在b上的投影。那么設(shè)a和b之間的角度為?。投影(a1)看起來像:

a1是與b平行的向量因此,我們可以使用以下等式得到向量a在向量b上的投影:

a1 = a到b的投影

b = b單位矢量的方向

通過將一個(gè)矢量投影到另一個(gè)矢量上,可以降低維度。

在投影技術(shù)中,可以通過將其點(diǎn)投影到較低維空間來表示多維數(shù)據(jù)?,F(xiàn)在我們將討論不同的預(yù)測(cè)方法:

投射到有趣的方向:

有趣的方向取決于特定的問題,但一般來說,投影值是非高斯的方向被認(rèn)為是有趣的

與ICA(獨(dú)立成分分析)類似,投影尋找最大化投影值的峰度的方向,作為非高斯性的度量。

投影集合管:

曾幾何時(shí),人們認(rèn)為地球是平的。無論你去哪里,它都會(huì)保持平坦(讓我們暫時(shí)忽視山脈)。但是,如果你繼續(xù)向一個(gè)方向走,那么你最終會(huì)走向何方。如果地球是平坦的,那這就不會(huì)發(fā)生。地球只是看起來比較平坦,那是因?yàn)槲覀兛吹降呐c地球相比是微不足道的。

地球看起來平坦的這些小部分是多方面的,如果我們將所有這些方面組合在一起,我們就可以獲得地球的大尺度視圖,也就是原始數(shù)據(jù)。類似地,對(duì)于n維曲線,小的平面快是流形,并且這些流形的組合將給出我們?cè)嫉膎維曲線。讓我們看看投影到流形上的步驟:

我們首先尋找一個(gè)接近數(shù)據(jù)的流形

然后將數(shù)據(jù)投影到那個(gè)流形上

最后為了表示,我們展開了流形

有各種技術(shù)可以獲得流形,所有這些技術(shù)都包含三個(gè)步驟:

從每個(gè)數(shù)據(jù)點(diǎn)收集信息以構(gòu)建具有一個(gè)以數(shù)據(jù)點(diǎn)作為頂點(diǎn)的圖

將上面生成的圖轉(zhuǎn)換為適合嵌入步驟的輸入

計(jì)算(nXn)本征方程

讓我們通過一個(gè)例子來理解流形投影技術(shù)。

如果一個(gè)流形連續(xù)可微縮到任意階,則稱為平滑流形或可微分流形。ISOMAP是一種旨在恢復(fù)非線性流形的完整低維表示的算法。它假設(shè)流形是平滑的。

它還假設(shè)對(duì)于流形上的任何一對(duì)點(diǎn),兩點(diǎn)之間的測(cè)地距離(曲面上兩點(diǎn)之間的最短距離)等于歐幾里德距離(直線上兩點(diǎn)之間的最短距離)。讓我們首先形象化一對(duì)點(diǎn)之間的測(cè)地線和歐幾里德距離:

Dn1n2 = X1和X2之間的測(cè)地距離

dn1n2 = X1和X2之間的歐幾里德距離

ISOMAP假設(shè)這兩個(gè)距離相等。現(xiàn)在讓我們看一下這種技術(shù)更詳細(xì)的解釋。如前所述,所有這些技術(shù)都采用三步法。我們將詳細(xì)介紹這些步驟:

鄰近圖:

第一步是計(jì)算所有數(shù)據(jù)點(diǎn)對(duì)點(diǎn)之間的距離: dij =dχ(xi,xj)= || xi-xj || χ dχ(xi, xj) = xi和xj測(cè)地線距離 || xi-xj || = xi到xj的歐氏距離

在計(jì)算距離之后,我們確定流形的相鄰數(shù)據(jù)點(diǎn)

最后生成鄰域圖:G = G(V,?),其中頂點(diǎn)集合V = {x1,x2,...,xn}是輸入數(shù)據(jù)點(diǎn)和邊緣集合?= {eij}表示附近的點(diǎn)之間的距離

計(jì)算圖形距離:

現(xiàn)在我們通過圖形距離計(jì)算流形中各點(diǎn)之間的測(cè)地距離

圖形距離是圖G中所有點(diǎn)對(duì)點(diǎn)之間的最短路徑距離

嵌入:

一旦我們得到距離,我們就形成了一個(gè)方形圖距離的對(duì)稱(nXn)矩陣

現(xiàn)在我們選擇嵌入向量來最小化測(cè)地距離和圖形距離之間的差距

最后,圖形G通過(t Xn)矩陣嵌入Y中

讓我們用Python實(shí)現(xiàn)它,這樣就更清楚的理解我在說什么了。我們將通過等距映射進(jìn)行非線性降維。對(duì)于可視化,我們將只采用數(shù)據(jù)集的一個(gè)子集,因?yàn)樵谡麄€(gè)數(shù)據(jù)集上運(yùn)行它將需要花費(fèi)大量時(shí)間。

from sklearn import manifold?
trans_data = manifold.Isomap(n_neighbors=5, n_components=3, n_jobs=-1).fit_transform(dffeat_cols.values)

使用的參數(shù):

n_neighbors決定每個(gè)點(diǎn)的鄰居數(shù)量

n_components決定流形的坐標(biāo)數(shù)

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

可視化轉(zhuǎn)換后的數(shù)據(jù):

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

你可以在上面看到這些成分之間的相關(guān)性非常低。實(shí)際上,與我們之前使用SVD獲得的成分相比,它們的相關(guān)性更??!

3.11 t-分布式隨機(jī)鄰域嵌入(t-SNE)

到目前為止,我們已經(jīng)了解到PCA對(duì)于具有大量變量的數(shù)據(jù)集的降維和可視化是一個(gè)很好的選擇。但是,如果我們可以使用更高級(jí)的東西呢?如果我們可以輕松地以非線性方式搜索呢?t-SNE就是這樣一種技術(shù)。我們可以使用兩種方法來映射數(shù)據(jù)點(diǎn):

局部方法:它們將流形上的附近點(diǎn)映射到低維表示中的附近點(diǎn)。

全局方法:他們?cè)噲D在所有尺度上保持幾何,即將流形上的附近點(diǎn)映射到低維表示中的附近點(diǎn)以及將遠(yuǎn)處的點(diǎn)映射到遠(yuǎn)點(diǎn)上。

t-SNE是能夠同時(shí)保留數(shù)據(jù)的本地和全局結(jié)構(gòu)的少數(shù)算法之一

計(jì)算了高維空間和低維空間中點(diǎn)的概率相似度

將數(shù)據(jù)點(diǎn)之間的高維歐氏距離被轉(zhuǎn)換為表示相似性的條件概率:

xi和xj是數(shù)據(jù)點(diǎn),|| xi-xj || 表示這些數(shù)據(jù)點(diǎn)之間的歐幾里德距離,σi是高維空間中數(shù)據(jù)點(diǎn)的方差

對(duì)于對(duì)應(yīng)于高維數(shù)據(jù)點(diǎn)xi和xj的低維數(shù)據(jù)點(diǎn)yi和yj,可以使用以下公式計(jì)算相似的條件概率:

其中:|| yi-yj || 表示yi和yj之間的歐幾里德距離

在計(jì)算兩個(gè)概率之后,它最小化了兩個(gè)概率之間的差異

現(xiàn)在我們將用Python實(shí)現(xiàn)它,并將結(jié)果可視化:

from sklearn.manifold import TSNE?
tsne = TSNE(n_components=3, n_iter=300).fit_transform(dffeat_cols.values)

n_components將決定轉(zhuǎn)換數(shù)據(jù)中的成分?jǐn)?shù)量。是時(shí)候查看可視化轉(zhuǎn)換后的數(shù)據(jù):

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

在這里,你可以清楚地看到使用強(qiáng)大的t-SNE技術(shù)轉(zhuǎn)換的不同成分。

3.12 UMAP

t-SNE在大型數(shù)據(jù)集上工作表現(xiàn)很好,但它也有它的局限性,例如丟失大型的信息,計(jì)算時(shí)間慢,無法有意義地表示非常大的數(shù)據(jù)集。統(tǒng)一流形近似和投影(UMAP)是一種降維技術(shù),與t-SNE相比,可以保留盡可能多的本地?cái)?shù)據(jù)結(jié)構(gòu)和全局?jǐn)?shù)據(jù)結(jié)構(gòu),并且運(yùn)行時(shí)間更短。聽起來很有趣,對(duì)吧。

UMAP的一些主要優(yōu)勢(shì)是:

它可以毫不費(fèi)力地處理大型數(shù)據(jù)集和高維數(shù)據(jù)

它結(jié)合了可視化的強(qiáng)大功能和減少數(shù)據(jù)維度的能力

除了保留本地結(jié)構(gòu)外,它還保留了數(shù)據(jù)的全局結(jié)構(gòu)。UMAP將流形上的附近點(diǎn)映射到低維表示中的附近點(diǎn),并對(duì)遠(yuǎn)點(diǎn)進(jìn)行相同的映射

該方法使用k-近鄰的概念,并使用隨機(jī)梯度下降來優(yōu)化結(jié)果。它首先計(jì)算高維空間中的點(diǎn)之間的距離,將它們投影到低維空間,并計(jì)算該低維空間中的點(diǎn)之間的距離。然后,它使用隨機(jī)梯度下降來最小化這些距離之間的差異。

我們現(xiàn)在將在Python中實(shí)現(xiàn)它:

import umap
umap_data = umap.UMAP(n_neighbors=5, min_dist=0.3, n_components=3).fit_transform(dffeat_cols.values)

n_neighbors確定使用的相鄰點(diǎn)的數(shù)量

min_dist控制允許嵌入的緊密程度。值越大,嵌入點(diǎn)的分布越均勻

讓我們可視化一下這個(gè)變換:

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

維度已經(jīng)減少了,我們可以想象不同的變換成分。變換后的變量之間的相關(guān)性非常小。讓我們比較UMAP和t-SNE的結(jié)果:

我們可以看到,與從t-SNE獲得的成分之間的相關(guān)性相比,從UMAP獲得的成分之間的相關(guān)性非常小。因此,UMAP傾向于提供更好的結(jié)果。

正如UMAP的GitHub代碼庫(kù)中所提到的,與t-SNE相比,它在保留數(shù)據(jù)全局結(jié)構(gòu)方面的表現(xiàn)更好。這意味著它通常可以提供更好的“全局”數(shù)據(jù)視圖以及保留本地鄰居關(guān)系。

深呼吸。我們已經(jīng)學(xué)習(xí)了相當(dāng)多的降維技術(shù)。讓我們簡(jiǎn)要總結(jié)一下在那里可以使用它們。

4. 簡(jiǎn)要總結(jié)什么時(shí)候使用什么技術(shù)

在本節(jié)中,我們將簡(jiǎn)要總結(jié)我們所涵蓋的每種降維技術(shù)的使用案例。了解在什么地方可以使用什么樣的技術(shù),因?yàn)樗兄诠?jié)省時(shí)間,精力和計(jì)算能力。

缺失值比率:如果數(shù)據(jù)集的缺失值太多,我們使用此方法來減少變量的數(shù)量。我們可以刪除其中包含大量缺失值的變量

低方差過濾器:我們使用此方法來識(shí)別和刪除數(shù)據(jù)集中的常量變量。目標(biāo)變量不會(huì)受到方差較小的變量的過度影響,因此可以安全地刪除這些變量

高相關(guān)過濾器:具有高相關(guān)性的一對(duì)變量增加了數(shù)據(jù)集中的多重共線性。因此,我們可以使用此技術(shù)來查找高度相關(guān)的功能并相應(yīng)地刪除它們

隨機(jī)森林:這是最常用的技術(shù)之一,它告訴我們數(shù)據(jù)集中存在的每個(gè)特征的重要性。我們可以找到每個(gè)特征的重要性并保留最頂層的特征,從而減少維度

這兩個(gè)反向特征消除正向特征選擇技術(shù)需要大量的計(jì)算時(shí)間,因此一般在較小的數(shù)據(jù)集使用

因子分析:該技術(shù)最適合我們具有高度相關(guān)的變量集的情況。它將變量基于它們的相關(guān)性劃分為不同的組,并用因子表示每個(gè)組

主成分分析:這是處理線性數(shù)據(jù)最廣泛使用的技術(shù)之一。它將數(shù)據(jù)劃分為一組成分,試圖解釋盡可能多的方差

獨(dú)立成分分析:我們可以使用ICA將數(shù)據(jù)轉(zhuǎn)換為獨(dú)立的成分,這些成分使用更少的成分來描述數(shù)據(jù)

ISOMAP:當(dāng)數(shù)據(jù)強(qiáng)非線性時(shí),我們使用這種技術(shù)

t-SNE:當(dāng)數(shù)據(jù)強(qiáng)非線性時(shí),這種技術(shù)也能很好地工作。它對(duì)于可視化也非常有效

UMAP:這種技術(shù)適用于高維數(shù)據(jù)。與t-SNE相比,它運(yùn)行的時(shí)間更短

結(jié)束語(yǔ)

這是一篇關(guān)于降維的全面文章,你可以在任何地方用到它!在編寫過程中我獲得了很多的樂趣,并找到了一些我之前從來沒用使用過的新方法(比如UMAP)。

處理成千上萬(wàn)的特征是任何數(shù)據(jù)科學(xué)家必備的技能。我們每天生成的數(shù)據(jù)量是前所未有的,我們需要找到不同的方法來確定如何使用它。降維是一種非常有用的方法,對(duì)我來說,無論是在專業(yè)的應(yīng)用中,還是在機(jī)器學(xué)習(xí)的比賽中,它都產(chǎn)生了奇妙的效果。

The Ultimate Guide to 12 Dimensionality Reduction Techniques (with Python codes)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43785.html

相關(guān)文章

  • 在一頭扎進(jìn)機(jī)器學(xué)習(xí)前應(yīng)該知道的那些事兒

    摘要:當(dāng)掌握機(jī)器學(xué)習(xí)基本知識(shí)以及清楚自己所要處理的任務(wù)后,應(yīng)用機(jī)器學(xué)習(xí)就不會(huì)那么難了。因此,在學(xué)習(xí)和應(yīng)用機(jī)器學(xué)習(xí)之前,我們首先應(yīng)該明確自己的任務(wù)是什么,以及適合使用哪種機(jī)器學(xué)習(xí)方法來完成。 摘要: 本文簡(jiǎn)單總結(jié)了機(jī)器學(xué)習(xí)的幾大任務(wù)及其對(duì)應(yīng)的方法,方便初學(xué)者根據(jù)自己的任務(wù)選擇合適的方法。當(dāng)掌握機(jī)器學(xué)習(xí)基本知識(shí)以及清楚自己所要處理的任務(wù)后,應(yīng)用機(jī)器學(xué)習(xí)就不會(huì)那么難了。 機(jī)器學(xué)習(xí)一直是一個(gè)火熱的研...

    moven_j 評(píng)論0 收藏0
  • 這款分布式配置中心,會(huì)是微服務(wù)降維打擊利器嗎?

    摘要:于是,市面上出現(xiàn)了分布式的配置中心。為什么呢因?yàn)橐Y(jié)合分布式配置中心微服務(wù),才能真正實(shí)現(xiàn)我們所理解的。所謂灰度發(fā)布,是說一個(gè)微服務(wù)集群里面,比如有個(gè)訂單系統(tǒng),做了一些配置上的更新。數(shù)人云分布式統(tǒng)一配置中心數(shù)人云分布式統(tǒng)一配置中心,取名。 本文來自1月18日數(shù)人云資深工程師在IT大咖說平臺(tái)的線上直播分享。 今天主要探討這幾方面: 一、配置中心的定位二、云化的微服務(wù)對(duì)于配置中心的要求三、微...

    zhaofeihao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<