摘要:在研究數據時,你會發現數據集中存在一些缺失值?,F在,我們將檢查每個變量中缺失值的百分比。我們可以使用適當的方法來輸入變量,或者我們可以設置閾值,比如,并刪除具有超過缺失值的變量。讓我們首先使用已知觀察值的中值來填充列中的缺失值。
介紹
你是否曾經處理過具有一千多個特征的數據集?5萬多個特征呢?我曾經有過,讓我告訴你這是一項非常具有挑戰性的任務,特別是如果你不知道從哪里開始的時候!擁有大量的變量既是好事,也是壞事。我們有大量的數據用于分析,這很棒,但由于規模太大,它變得非常具有挑戰性。
在微觀層面分析每個變量是不可行的。我們可能需要幾天或幾個月才能進行任何有意義的分析,我們將會為我們的業務損失大量的時間和金錢!更不用說這將需要的計算能力。我們需要一種更好的方法來處理高維數據,以便我們能夠快速從中提取模式和見解。那么我們如何處理這樣的數據集呢?
當然是使用降維技術。你可以使用這個技術來減少數據集中的特征數量,而不必丟失太多信息并保持(或改進)模型的性能。正如你將在本文中看到的,這是處理大型數據集的一種非常強大的方法。
這是一個可以在實際場景中使用的各種降維技術的綜合指南。在深入介紹我所涵蓋的12種不同技術之前,我們將首先了解這個概念是什么以及為什么要使用它。并且每種技術都有自己的Python實現代碼,讓你更好的熟悉它。
1.什么是降維?我們每天都在生成大量的數據。事實上,世界上90%的數據都是在過去的3到4年中產生的!這些數字真的令人難以置信。以下是收集的數據的一些例子:
Facebook會收集你喜歡的,分享的,發布的,訪問的地點,你喜歡的餐館等的數據。
你的智能手機應用程序會收集大量有關于你的個人信息
亞馬遜會收集你在其網站上購買,查看,點擊等內容的數據
賭場會跟蹤每位客戶的一舉一動
隨著數據生成和收集量的不斷增加,可視化和繪制分析變得越來越具有挑戰性。進行可視化的最常見方法之一是通過圖表。假設我們有2個變量,年齡Age和身高Height。我們可以使用Age和Height之間的散點圖或線圖,并輕松地將它們的關系可視化:
現在考慮我們有100個變量(p = 100)的情況。在這種情況下,我們可以有100(100-1)/ 2 = 5000個不同的圖。將它們分別可視化是沒有多大意義的,對吧?在我們有大量變量的情況下,最好選擇這些變量的一個子集(p << 100),它獲取的信息與原始變量集一樣多。
讓我們用一個簡單的例子來理解這一點。考慮下面的圖像:
這里我們有類似物體的重量,單位為Kg(X1)和磅(X2)。如果我們使用這兩個變量,它們將傳達相類似的信息。因此,僅使用一個變量是有意義的。我們可以將數據從2D(X1和X2)轉換為1D(Y1),如下所示:
類似地,我們可以將數據的p維度減少為k維度的子集(k << n)。這稱為降維。
2.為什么需要降維?以下是將降維應用于數據集的一些好處:
隨著維度數量的減少,存儲數據所需的空間會減少
更少的維度導致更少的計算/訓練時間
當我們有一個大的維度時,一些算法的表現不佳。因此,需要減少這些維度才能使算法有用
它通過刪除冗余的特征來處理多重共線性問題。例如,你有兩個變量 - “在跑步機上花費的時間”和“燃燒的卡路里”。這些變量是高度相關的,因為你在跑步機上花費的時間越多,你燃燒的卡路里就越多。因此,存儲兩個變量都沒有意義,只有其中一個可以滿足需求
它有助于可視化數據。如前所述,在高維度中可視化數據是非常困難的,因此將我們的空間縮小到2D或3D可以讓我們更清晰地繪制和觀察數據
是時候深入了解本文的關鍵 - 各種降維技術!我們將使用一個實踐問題:Big Mart Sales III中的數據集點擊這里下載數據提取碼為:fmk0 。
3.常用的降維技術降維可以通過兩種不同的方式完成:
僅保留原始數據集中最相關的變量(此技術稱為特征選擇)
通過查找較小的一組新變量,每個變量都是輸入變量的組合,包含與輸入變量基本相同的信息(此技術稱為降維)
我們現在將介紹各種降維技術以及如何在Python中實現它們。
3.1缺失值比率假設你有一個數據集。你的第一步是什么?在構建模型之前,你應該會希望先探索數據。在研究數據時,你會發現數據集中存在一些缺失值。怎么辦?你將嘗試找出這些缺失值的原因,然后將輸入它們或完全刪除具有缺失值的變量(使用適當的方法)。
如果我們有太多的缺失值(比如說超過50%)怎么辦?我們應該輸入這些缺失值還是直接刪除變量?我寧愿放棄變量,因為它沒有太多的信息。然而,這不是一成不變的。我們可以設置一個閾值,如果任何變量中缺失值的百分比大于該閾值,我們將刪除該變量。
讓我們在Python中實現這種方法。
導入所需要的庫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
正如你在上表中所看到的,并沒有太多的缺失值(實際上只有2個變量具有缺失值)。我們可以使用適當的方法來輸入變量,或者我們可以設置閾值,比如20%,并刪除具有超過20%缺失值的變量。讓我們看看如何在Python中完成此操作:
保存變量中缺失的值a = train.isnull().sum()/len(train)*100
將列名保存在變量中variables = train.columns
variable = [ ]
for i in range(0,12):
if a[i]<=20: #將閾值設置為20%
variable.append(variables[i])
因此,要使用的變量存儲在“variables”中,它只包含哪些缺失值小于20%的特征
3.2低方差過濾器假設我們的數據集中的一個變量,其中所有觀察值都是相同的,例如1。如果我們要使用此變量,你認為它可以改進我們將要建立的模型么?答案當然是否定的,因為這個變量的方差為零。
因此,我們需要計算給出的每個變量的方差。然后刪除與我們的數據集中其他變量相比方差比較小的變量。如上所述,這樣做的原因是方差較小的變量不會影響目標變量。
讓我們首先使用已知ItemWeight觀察值的中值來填充temWeight列中的缺失值。對于OutletSize列,我們將使用已知OutletSize值的模式來填充缺失值:
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
嘿瞧!我們都已經準備好了?,F在讓我們計算所有數值變量的方差。
train.var()
如上面的輸出所示,與其他變量相比,Item_Visibility的方差非常小。我們可以安全地刪除此列。這就是我們應用低方差過濾器的方法。讓我們在Python中實現這個:
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: #將閾值設置為10%
variable.append(numeric[i+1])
上面的代碼為我們提供了方差大于10的變量列表。
3.3高度相關過濾器兩個變量之間的高度相關意味著它們具有相似的趨勢,并且可能攜帶類似的信息。這可以大大降低某些模型的性能(例如線性回歸和邏輯回歸模型)。我們可以計算出本質上是數值的獨立數值變量之間的相關性。如果相關系數超過某個閾值,我們可以刪除其中一個變量(丟棄一個變量是非常主觀的,并且應該始終記住該變量)。
作為一般準則,我們應該保留那些與目標變量顯示出良好或高相關性的變量。
讓我們在Python中執行相關計算。我們將首先刪除因變量(ItemOutletSales)并將剩余的變量保存在新的DataFrame(df)中。
df=train.drop("Item_Outlet_Sales", 1)
df.corr()
太棒了,我們的數據集中沒有任何具有高相關性的變量。通常,如果一對變量之間的相關性大于0.5-0.6,我們真的應該認真的考慮丟棄其中的一個變量。
3.4 隨機森林隨機森林是最廣泛使用的特征選擇算法之一。它附帶內置的重要功能,因此你無需多帶帶編程。這有助于我們選擇較小的特征子集。
我們需要通過應用一個熱編碼將數據轉換為數字形式,因為隨機森林(Scikit-Learn實現)僅采用數字輸入。讓我們也刪除ID變量(Item_Identifier和Outlet_Identifier),因為這些只是唯一的數字,目前對我們來說并不重要。
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()
基于上圖,我們可以手動選擇最頂層的特征來減少數據集中的維度。值得注意的是,我們可以使用sklearn的SelectFromModel來實現這一點。它根據權重的重要性來選擇特征。
from sklearn.feature_selection import SelectFromModel
feature = SelectFromModel(model)
Fit = feature.fit_transform(df, train.Item_Outlet_Sales)
按照以下步驟來理解和使用“反向特征消除”技術:
我們首先獲取數據集中存在的所有的n個變量,然后使用它們訓練模型
然后我們計算模型的性能
現在,我們在消除每個變量(n次)后計算模型的性能,即我們每次都丟棄一個變量并在剩余的n-1個變量上訓練模型
我們確定移除變量后對模型性能影響最?。ɑ驔]有)變化的變量,然后刪除該變量
重復此過程,直到不能刪除任何變量
在構建線性回歸或邏輯回歸模型時,可以使用此方法。我們來看看它的Python實現:
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)
我們需要指定算法和要選擇的特征數量,并返回從反向特征消除中獲得的變量列表。我們還可以使用“ rfe.ranking”命令檢查變量的排名。
3.6 正向特征選擇這與我們在上面看到的反向特征消除的過程相反。我們是嘗試找到改善模型性能的最佳特征,而不是消除特征。該技術的工作原理如下:
我們從一個特征開始。本質上,我們分別使用每個特征訓練模型n次
選擇性能最佳的變量作為起始變量
然后我們重復這個過程并每次只添加一個變量。保留產生最高性能增長的變量
我們重復這個過程,直到模型的性能沒有顯著的改進
讓我們用Python實現它:
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 ffs0 >=10:
variable.append(df.columns[i])
這為我們提供了基于正向特征選擇算法的最多變量。
注意:反向特征消除和正向特征選擇都是非常耗時且計算成本高的。它們實際上僅用于具有少量輸入變量的數據集。
到目前為止我們看到的技術通常在我們的數據集中沒有太多變量時使用。這些或多或少的特征選擇技術,在接下來的部分中,我們將使用Fashion MNIST數據集,該數據集包含屬于不同類型服裝的圖像,例如T恤,褲子,包等。數據集可點擊此處下載,提取碼為:a708。
該數據集共有70,000張圖像,其中60,000張在訓練集中,其余10,000張是測試圖像。在本文的范圍中,我們將僅處理訓練圖像。訓練集文件采用zip格式。解壓縮zip文件后,你將獲得一個.csv文件和一個包含這60,000張圖像的訓練集文件夾。每個圖像的相應標簽可以在"train.csv"文件中找到。
3.7 因子分析假設我們有兩個變量:收入和教育。這些變量可能具有高度相關性,因為具有較高教育水平的人往往具有顯著較高的收入,反之亦然。
在因子分析技術中,變量按其相關性進行分組,即特定組內的所有變量之間具有高度相關性,但往往與其他組的變量之間相關性較低。在這里,每個組都被稱為一個因子。與原始數據維度相比,這些因子的數量很少。但是,這些因子往往很難觀察到。
讓我們先讀入訓練集文件夾中包含的所有圖像:
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)
現在讓我們創建一個DataFrame,其中包含每個圖像中每個像素的像素值,以及它們對應的標簽(對于標簽,我們將使用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"]
現在我們將使用因子分析來分解數據集:
from sklearn.decomposition import FactorAnalysis
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軸表示分解因子的值。正如我前面提到的,很難多帶帶觀察這些因素,但我們已經能夠成功地減少數據的維度。
3.8主成分分析(PCA)PCA是一種技術,可以幫助我們從現有的大量變量中提取一組新的變量。這些新提取的變量稱為主成分。為了便于你快速學習PCA降維,以下是你在進一步處理之前應該了解的關于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))
讓我們使用Python實現PCA降維并轉換數據集:
from sklearn.decomposition import PCA
pca = PCA(n_components=4)
pca_result = pca.fit_transform(df[feat_cols].values)
在這種情況下,n_components將決定轉換數據中的主要成分的數量。讓我們看一下使用這4個成分解釋了多少差異。我們將使用explainvarianceratio_來計算相同的內容。
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%的方差變化。現在讓我們嘗試可視化每個分解的成分:
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技術中的每個額外維度獲取模型中的方差越來越少。第一個部分是最重要的成分,其次是第二個成分,然后是第三個成分,依此類推。
我們還可以使用奇異值分解?(SVD)將我們的原始數據集分解為其成分,從而減少維數。
SVD將原始變量分解為三個組成矩陣。它主要用于從數據集中刪除冗余的特征。它使用特征值和特征向量的概念來確定這三個矩陣。由于本文的范圍,我們不會深入研究它的理論,但讓我們堅持我們的計劃,即減少數據集中的維度。
讓我們實現SVD并分解我們的原始變量:
from sklearn.decomposition import TruncatedSVD?
svd = TruncatedSVD(n_components=3, random_state=42).fit_transform(df[feat_cols].values)
讓我們通過繪制前兩個主成分來可視化變換后的變量:
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])
上面的散點圖非常清晰地向我們展示了分解的成分。如前所述,這些組件之間沒有太多相關性。
3.9獨立成分分析獨立成分分析(ICA)是基于信息理論的,也是最廣泛使用的降維技術之一。PCA和ICA之間的主要區別在于PCA尋找不相關的因素,而ICA尋找獨立因素。
如果兩個變量不相關,則意味著它們之間沒有線性關系。如果它們是獨立的,則意味著它們不依賴于任何其他變量。例如,一個人的年齡與該人吃什么或他/她看多少電視無關。
該算法假設給定變量是一些未知潛在變量的線性混合。它還假設這些潛在變量是相互獨立的,即它們不依賴于其他變量,因此它們被稱為觀察數據的獨立成分。
讓我們直觀地比較一下PCA和ICA,以便更好地了解它們的不同之處:
這里,圖像(a)表示PCA結果,而圖像(b)表示相同數據集上的ICA結果。
PCA的方程是x = W x。
x是觀察結果
W是混合矩陣
χ是來源或獨立成分
現在我們必須找到一個非混合矩陣,使成分盡可能的獨立。測量成分獨立性的最常用方法是非高斯性:
根據中心極限定理,獨立成分之和的分布傾向于正態分布(高斯分布)。
因此,我們可以尋找最大化獨立成分的每個分量的峰度的變換。峰度是分布的第三階段。
最大化峰度將使分布非高斯分布,因此獲得獨立成分。
上述分布是非高斯分布,這又使得各成分互相獨立。讓我們嘗試在Python中實現ICA:
from sklearn.decomposition import FastICA?
ICA = FastICA(n_components=3, random_state=12)?
X=ICA.fit_transform(df[feat_cols].values)
這里,n_components將決定轉換數據中的成分數量。我們使用ICA將數據轉換為3個成分。讓我們看看它是如何改變數據的:
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])
數據已經被分成不同的獨立成分,在上圖中可以非常清楚地看到。X軸和Y軸表示分解的獨立成分的值。
現在我們將看到一些使用投影技術來減少數據維度的方法。
3.10基于投影的方法首先,我們需要了解投影是什么。假設我們有兩個向量,矢量a和矢量b,如下所示:
我們想求a在b上的投影。那么設a和b之間的角度為?。投影(a1)看起來像:
a1是與b平行的向量。因此,我們可以使用以下等式得到向量a在向量b上的投影:
a1 = a到b的投影
b = b單位矢量的方向
通過將一個矢量投影到另一個矢量上,可以降低維度。
在投影技術中,可以通過將其點投影到較低維空間來表示多維數據?,F在我們將討論不同的預測方法:
投射到有趣的方向:
有趣的方向取決于特定的問題,但一般來說,投影值是非高斯的方向被認為是有趣的
與ICA(獨立成分分析)類似,投影尋找最大化投影值的峰度的方向,作為非高斯性的度量。
投影集合管:
曾幾何時,人們認為地球是平的。無論你去哪里,它都會保持平坦(讓我們暫時忽視山脈)。但是,如果你繼續向一個方向走,那么你最終會走向何方。如果地球是平坦的,那這就不會發生。地球只是看起來比較平坦,那是因為我們看到的與地球相比是微不足道的。
地球看起來平坦的這些小部分是多方面的,如果我們將所有這些方面組合在一起,我們就可以獲得地球的大尺度視圖,也就是原始數據。類似地,對于n維曲線,小的平面快是流形,并且這些流形的組合將給出我們原始的n維曲線。讓我們看看投影到流形上的步驟:
我們首先尋找一個接近數據的流形
然后將數據投影到那個流形上
最后為了表示,我們展開了流形
有各種技術可以獲得流形,所有這些技術都包含三個步驟:
從每個數據點收集信息以構建具有一個以數據點作為頂點的圖
將上面生成的圖轉換為適合嵌入步驟的輸入
計算(nXn)本征方程
讓我們通過一個例子來理解流形投影技術。
如果一個流形連續可微縮到任意階,則稱為平滑流形或可微分流形。ISOMAP是一種旨在恢復非線性流形的完整低維表示的算法。它假設流形是平滑的。
它還假設對于流形上的任何一對點,兩點之間的測地距離(曲面上兩點之間的最短距離)等于歐幾里德距離(直線上兩點之間的最短距離)。讓我們首先形象化一對點之間的測地線和歐幾里德距離:
Dn1n2 = X1和X2之間的測地距離
dn1n2 = X1和X2之間的歐幾里德距離
ISOMAP假設這兩個距離相等?,F在讓我們看一下這種技術更詳細的解釋。如前所述,所有這些技術都采用三步法。我們將詳細介紹這些步驟:
鄰近圖:
第一步是計算所有數據點對點之間的距離: dij =dχ(xi,xj)= || xi-xj || χ dχ(xi, xj) = xi和xj測地線距離 || xi-xj || = xi到xj的歐氏距離
在計算距離之后,我們確定流形的相鄰數據點
最后生成鄰域圖:G = G(V,?),其中頂點集合V = {x1,x2,...,xn}是輸入數據點和邊緣集合?= {eij}表示附近的點之間的距離
計算圖形距離:
現在我們通過圖形距離計算流形中各點之間的測地距離
圖形距離是圖G中所有點對點之間的最短路徑距離
嵌入:
一旦我們得到距離,我們就形成了一個方形圖距離的對稱(nXn)矩陣
現在我們選擇嵌入向量來最小化測地距離和圖形距離之間的差距
最后,圖形G通過(t Xn)矩陣嵌入Y中
讓我們用Python實現它,這樣就更清楚的理解我在說什么了。我們將通過等距映射進行非線性降維。對于可視化,我們將只采用數據集的一個子集,因為在整個數據集上運行它將需要花費大量時間。
from sklearn import manifold?
trans_data = manifold.Isomap(n_neighbors=5, n_components=3, n_jobs=-1).fit_transform(dffeat_cols.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])
你可以在上面看到這些成分之間的相關性非常低。實際上,與我們之前使用SVD獲得的成分相比,它們的相關性更??!
3.11 t-分布式隨機鄰域嵌入(t-SNE)到目前為止,我們已經了解到PCA對于具有大量變量的數據集的降維和可視化是一個很好的選擇。但是,如果我們可以使用更高級的東西呢?如果我們可以輕松地以非線性方式搜索呢?t-SNE就是這樣一種技術。我們可以使用兩種方法來映射數據點:
局部方法:它們將流形上的附近點映射到低維表示中的附近點。
全局方法:他們試圖在所有尺度上保持幾何,即將流形上的附近點映射到低維表示中的附近點以及將遠處的點映射到遠點上。
t-SNE是能夠同時保留數據的本地和全局結構的少數算法之一
計算了高維空間和低維空間中點的概率相似度
將數據點之間的高維歐氏距離被轉換為表示相似性的條件概率:
xi和xj是數據點,|| xi-xj || 表示這些數據點之間的歐幾里德距離,σi是高維空間中數據點的方差
對于對應于高維數據點xi和xj的低維數據點yi和yj,可以使用以下公式計算相似的條件概率:
其中:|| yi-yj || 表示yi和yj之間的歐幾里德距離
在計算兩個概率之后,它最小化了兩個概率之間的差異
現在我們將用Python實現它,并將結果可視化:
from sklearn.manifold import TSNE?
tsne = TSNE(n_components=3, n_iter=300).fit_transform(dffeat_cols.values)
n_components將決定轉換數據中的成分數量。是時候查看可視化轉換后的數據:
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])
在這里,你可以清楚地看到使用強大的t-SNE技術轉換的不同成分。
3.12 UMAPt-SNE在大型數據集上工作表現很好,但它也有它的局限性,例如丟失大型的信息,計算時間慢,無法有意義地表示非常大的數據集。統一流形近似和投影(UMAP)是一種降維技術,與t-SNE相比,可以保留盡可能多的本地數據結構和全局數據結構,并且運行時間更短。聽起來很有趣,對吧。
UMAP的一些主要優勢是:
它可以毫不費力地處理大型數據集和高維數據
它結合了可視化的強大功能和減少數據維度的能力
除了保留本地結構外,它還保留了數據的全局結構。UMAP將流形上的附近點映射到低維表示中的附近點,并對遠點進行相同的映射
該方法使用k-近鄰的概念,并使用隨機梯度下降來優化結果。它首先計算高維空間中的點之間的距離,將它們投影到低維空間,并計算該低維空間中的點之間的距離。然后,它使用隨機梯度下降來最小化這些距離之間的差異。
我們現在將在Python中實現它:
import umap
umap_data = umap.UMAP(n_neighbors=5, min_dist=0.3, n_components=3).fit_transform(dffeat_cols.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])
維度已經減少了,我們可以想象不同的變換成分。變換后的變量之間的相關性非常小。讓我們比較UMAP和t-SNE的結果:
我們可以看到,與從t-SNE獲得的成分之間的相關性相比,從UMAP獲得的成分之間的相關性非常小。因此,UMAP傾向于提供更好的結果。
正如UMAP的GitHub代碼庫中所提到的,與t-SNE相比,它在保留數據全局結構方面的表現更好。這意味著它通??梢蕴峁└玫摹叭帧睌祿晥D以及保留本地鄰居關系。
深呼吸。我們已經學習了相當多的降維技術。讓我們簡要總結一下在那里可以使用它們。
4. 簡要總結什么時候使用什么技術在本節中,我們將簡要總結我們所涵蓋的每種降維技術的使用案例。了解在什么地方可以使用什么樣的技術,因為它有助于節省時間,精力和計算能力。
缺失值比率:如果數據集的缺失值太多,我們使用此方法來減少變量的數量。我們可以刪除其中包含大量缺失值的變量
低方差過濾器:我們使用此方法來識別和刪除數據集中的常量變量。目標變量不會受到方差較小的變量的過度影響,因此可以安全地刪除這些變量
高相關過濾器:具有高相關性的一對變量增加了數據集中的多重共線性。因此,我們可以使用此技術來查找高度相關的功能并相應地刪除它們
隨機森林:這是最常用的技術之一,它告訴我們數據集中存在的每個特征的重要性。我們可以找到每個特征的重要性并保留最頂層的特征,從而減少維度
這兩個反向特征消除和正向特征選擇技術需要大量的計算時間,因此一般在較小的數據集使用
因子分析:該技術最適合我們具有高度相關的變量集的情況。它將變量基于它們的相關性劃分為不同的組,并用因子表示每個組
主成分分析:這是處理線性數據最廣泛使用的技術之一。它將數據劃分為一組成分,試圖解釋盡可能多的方差
獨立成分分析:我們可以使用ICA將數據轉換為獨立的成分,這些成分使用更少的成分來描述數據
ISOMAP:當數據強非線性時,我們使用這種技術
t-SNE:當數據強非線性時,這種技術也能很好地工作。它對于可視化也非常有效
UMAP:這種技術適用于高維數據。與t-SNE相比,它運行的時間更短
結束語這是一篇關于降維的全面文章,你可以在任何地方用到它!在編寫過程中我獲得了很多的樂趣,并找到了一些我之前從來沒用使用過的新方法(比如UMAP)。
處理成千上萬的特征是任何數據科學家必備的技能。我們每天生成的數據量是前所未有的,我們需要找到不同的方法來確定如何使用它。降維是一種非常有用的方法,對我來說,無論是在專業的應用中,還是在機器學習的比賽中,它都產生了奇妙的效果。
The Ultimate Guide to 12 Dimensionality Reduction Techniques (with Python codes)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43785.html
摘要:當掌握機器學習基本知識以及清楚自己所要處理的任務后,應用機器學習就不會那么難了。因此,在學習和應用機器學習之前,我們首先應該明確自己的任務是什么,以及適合使用哪種機器學習方法來完成。 摘要: 本文簡單總結了機器學習的幾大任務及其對應的方法,方便初學者根據自己的任務選擇合適的方法。當掌握機器學習基本知識以及清楚自己所要處理的任務后,應用機器學習就不會那么難了。 機器學習一直是一個火熱的研...
摘要:于是,市面上出現了分布式的配置中心。為什么呢因為要結合分布式配置中心微服務,才能真正實現我們所理解的。所謂灰度發布,是說一個微服務集群里面,比如有個訂單系統,做了一些配置上的更新。數人云分布式統一配置中心數人云分布式統一配置中心,取名。 本文來自1月18日數人云資深工程師在IT大咖說平臺的線上直播分享。 今天主要探討這幾方面: 一、配置中心的定位二、云化的微服務對于配置中心的要求三、微...
閱讀 2216·2021-09-07 09:58
閱讀 3391·2019-08-30 14:07
閱讀 1305·2019-08-29 12:32
閱讀 667·2019-08-29 11:06
閱讀 3692·2019-08-26 18:18
閱讀 3731·2019-08-26 17:35
閱讀 1381·2019-08-26 11:35
閱讀 611·2019-08-26 11:35