欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python八種降維方法匯總

 更新時(shí)間:2023年10月23日 10:52:30   作者:DB_UP  
在Python中,有多種降維方法可以使用,本文就來(lái)介紹八種降維方法以及使用場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以一下,感興趣的可以了解一下

一、 為什么降維?

1、隨著數(shù)據(jù)維度不斷降低,數(shù)據(jù)存儲(chǔ)所需的空間也會(huì)隨之減少。
2、低維數(shù)據(jù)有助于減少計(jì)算/訓(xùn)練用時(shí)。
3、一些算法在高維度數(shù)據(jù)上容易表現(xiàn)不佳,降維可提高算法可用性。
4、降維可以用刪除冗余特征解決多重共線性問(wèn)題。比如我們有兩個(gè)變量:“一段時(shí)間內(nèi)在跑步機(jī)上的耗時(shí)”和“卡路里消耗量”。這兩個(gè)變量高度相關(guān),在跑步機(jī)上花的時(shí)間越長(zhǎng),燃燒的卡路里自然就越多。因此,同時(shí)存儲(chǔ)這兩個(gè)數(shù)據(jù)意義不大,只需一個(gè)就夠了。
5、降維有助于數(shù)據(jù)可視化。如果數(shù)據(jù)維度很高,可視化會(huì)變得相當(dāng)困難,而繪制二維三維數(shù)據(jù)的圖表非常簡(jiǎn)單。

二、降維方法

數(shù)據(jù)維度的降低方法主要有兩種:
1、僅保留原始數(shù)據(jù)集中最相關(guān)的變量(特征選擇)。
2、尋找一組較小的新變量,其中每個(gè)變量都是輸入變量的組合,包含與輸入變量基本相同的信息(降維)。

2.1 缺失值比率

假設(shè)你有一個(gè)數(shù)據(jù)集,你第一步會(huì)做什么?在構(gòu)建模型前,對(duì)數(shù)據(jù)進(jìn)行探索性分析必不可少。但在瀏覽數(shù)據(jù)的過(guò)程中,有時(shí)候我們會(huì)發(fā)現(xiàn)其中包含不少缺失值。如果缺失值少,我們可以填補(bǔ)缺失值或直接刪除這個(gè)變量;當(dāng)缺失值在數(shù)據(jù)集中的占比過(guò)高時(shí),一般我會(huì)選擇直接刪除這個(gè)變量,因?yàn)樗男畔⑻倭?。但具體刪不刪、怎么刪需要視情況而定,我們可以設(shè)置一個(gè)閾值,如果缺失值占比高于閾值,刪除它所在的列。閾值越高,降維方法越積極。

df.isnull().sum()  #檢查每個(gè)變量中缺失值的占比
df.isnull().sum() /len(df)*100
# 設(shè)定閾值為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 低方差濾波

如果我們有一個(gè)數(shù)據(jù)集,其中某列的數(shù)值基本一致,也就是它的方差非常低,我們通常認(rèn)為低方差變量攜帶的信息量也很少,所以可以把它直接刪除。放到實(shí)踐中,就是先計(jì)算所有變量的方差大小,然后刪去其中最小的幾個(gè)。需要注意的一點(diǎn)是:方差與數(shù)據(jù)范圍相關(guān)的,因此在采用該方法前需要對(duì)數(shù)據(jù)做歸一化處理。
實(shí)例中,我們先估算缺失值,缺失值填充完畢,進(jìn)行低方差濾波分析。

# 列出了方差大于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:   # 將閾值設(shè)置為10%
       variable.append(numeric[i+1])

2.3 高相關(guān)濾波

如果兩個(gè)變量之間是高度相關(guān)的,這意味著它們具有相似的趨勢(shì)并且可能攜帶類似的信息。同理,這類變量的存在會(huì)降低某些模型的性能(例如線性和邏輯回歸模型)。為了解決這個(gè)問(wèn)題,我們可以計(jì)算獨(dú)立數(shù)值變量之間的相關(guān)性。如果相關(guān)系數(shù)超過(guò)某個(gè)閾值,就刪除其中一個(gè)變量。
首先,刪除因變量,并將剩余的變量保存在新的數(shù)據(jù)列中進(jìn)行相關(guān)性分析(df.corr())。通常情況下,如果一對(duì)變量之間的相關(guān)性大于0.5-0.6,那就應(yīng)該考慮是否要?jiǎng)h除一列了。

2.4 隨機(jī)森林

隨機(jī)森林是一種廣泛使用的特征選擇算法,它會(huì)自動(dòng)計(jì)算各個(gè)特征的重要性,所以無(wú)需單獨(dú)編程。這有助于我們選擇較小的特征子集。在開(kāi)始降維前,我們先把數(shù)據(jù)轉(zhuǎn)換成數(shù)字格式,因?yàn)殡S機(jī)森林只接受數(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()

基于上圖,我們可以手動(dòng)選擇最頂層的特征來(lái)減少數(shù)據(jù)集中的維度。
:如果你用的是sklearn,可以直接使用SelectFromModel,它根據(jù)權(quán)重的重要性選擇特征。

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

2.5 反向特征消除

1、先獲取數(shù)據(jù)集中的全部n個(gè)變量,然后用它們訓(xùn)練一個(gè)模型。
2、計(jì)算模型的性能。
3、在刪除每個(gè)變量(n次)后計(jì)算模型的性能,即我們每次都去掉一個(gè)變量,用剩余的n-1個(gè)變量訓(xùn)練模型。
4、確定對(duì)模型性能影響最小的變量,把它刪除。
5、重復(fù)此過(guò)程,直到不再能刪除任何變量。
在構(gòu)建線性回歸或邏輯回歸時(shí)候可以使用這種方法:

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_可以用來(lái)檢查變量排名。

2.6 前向特征選擇

前向特征選擇其實(shí)就是反向特征消除的相反過(guò)程,即找到能改善模型性能的最佳特征,而不是刪除弱影響特征。它背后的思路如下所述:
1、選擇一個(gè)特征,用每個(gè)特征訓(xùn)練模型n次,得到n個(gè)模型。
2、選擇模型性能最佳的變量作為初始變量。
3、每次添加一個(gè)變量繼續(xù)訓(xùn)練,重復(fù)上一過(guò)程,最后保留性能提升最大的變量。
4、一直添加,一直篩選,直到模型性能不再有明顯提高。

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

上述會(huì)返回一個(gè)數(shù)組,其中包括變量F值和每個(gè)F對(duì)應(yīng)的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 因子分析

因子分析是一種常見(jiàn)的統(tǒng)計(jì)方法,它能從多個(gè)變量中提取共性因子,并得到最優(yōu)解。
基本思想:最大化類間均值,最小化類內(nèi)方差。意思就是將數(shù)據(jù)投影在低維度上,并且投影后同種類別數(shù)據(jù)的投影點(diǎn)盡可能的接近,不同類別數(shù)據(jù)的投影點(diǎn)的中心點(diǎn)盡可能的遠(yuǎn)。假設(shè)我們有兩個(gè)變量:收入和教育。它們可能是高度相關(guān)的,因?yàn)榭傮w來(lái)看,學(xué)歷高的人一般收入也更高,反之亦然。所以它們可能存在一個(gè)潛在的共性因子,比如“能力”。
在因子分析中,我們將變量按其相關(guān)性分組,即特定組內(nèi)所有變量的相關(guān)性較高,組間變量的相關(guān)性較低。我們把每個(gè)組稱為一個(gè)因子,它是多個(gè)變量的組合。和原始數(shù)據(jù)集的變量相比,這些因子在數(shù)量上更少,但攜帶的信息基本一致。
數(shù)據(jù)集:Fashion MNIST,它共有70,000張圖像,其中訓(xùn)練集60,000張,測(cè)試集10,000張。我們的目標(biāo)是訓(xùn)練一個(gè)能分類各類服裝配飾的模型。

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)的路徑。
把這些圖像轉(zhuǎn)換為numpy數(shù)組格式,以便執(zhí)行數(shù)學(xué)運(yùn)算并繪制圖像。

images = np.array(images)
images.shape   #(60000, 28, 28, 3)
--這是一個(gè)三維數(shù)組,但我們的目標(biāo)是把它轉(zhuǎn)成一維,因?yàn)楹罄m(xù)只接受一維輸入。所以我們還得展平圖像:
image = []
for i in range(0,60000):
    img = images[i].flatten()
    image.append(img)
image = np.array(image)

創(chuàng)建一個(gè)數(shù)據(jù)框,其中包含每個(gè)像素的像素值,以及它們對(duì)應(yīng)的標(biāo)簽:

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 將決定轉(zhuǎn)換數(shù)據(jù)中的因子數(shù)量。轉(zhuǎn)換完成后,可視化結(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)成功降維。

2.7.1 因子分析的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):
1、在降維過(guò)程中可以使用類別的先驗(yàn)知識(shí)經(jīng)驗(yàn),而像PCA這樣的無(wú)監(jiān)督學(xué)習(xí)則無(wú)法使用類別先驗(yàn)知識(shí)。
2、LDA在樣本分類信息依賴均值而不是方差的時(shí)候,比PCA之類的算法較優(yōu)。

缺點(diǎn):
1、LDA不適合對(duì)非高斯分布樣本進(jìn)行降維
2、LDA降維最多降到k-1(k為類別數(shù))的維數(shù),如果我們降維的維度大于k-1,則不能使用LDA。
3、LDA在樣本分類信息依賴方差而不是均值的時(shí)候,降維效果不好。
4、LDA可能過(guò)度擬合數(shù)據(jù)

2.8 主成分分析(PCA)

基本思想:利用降維思維,將原來(lái)具有一定相關(guān)性的指標(biāo),通過(guò)正交變換,重新組合成一組新的相互無(wú)關(guān)的綜合指標(biāo),即從原始變量中導(dǎo)出少數(shù)幾個(gè)主成分,使它們盡可能多地保留原始變量的信息,且彼此間互不相關(guān)。無(wú)關(guān)變量稱為主成分。

2.8.1 PCA的特點(diǎn):

1、主成分是原始變量的線性組合。
2、第一個(gè)主成分具有最大的方差值。
3、第二主成分試圖解釋數(shù)據(jù)集中的剩余方差,并且與第一主成分不相關(guān)(正交)。
4、第三主成分試圖解釋前兩個(gè)主成分等沒(méi)有解釋的方差。

2.8.2 PCA計(jì)算步驟:

1.將數(shù)據(jù)標(biāo)準(zhǔn)化
2.求出協(xié)方差矩陣
3.求出協(xié)方差矩陣對(duì)應(yīng)的特征值和特征向量
4.將特征向量按對(duì)應(yīng)特征值大小從上到下按行排列,取k行組成矩陣p
5.Y=PX即為降維到k維后的數(shù)據(jù)

貢獻(xiàn)率:總方差中第i個(gè)主成分占總p個(gè)主成分的比例
載荷:

實(shí)現(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_)    # 屬性可以查看降維后的每個(gè)特征向量上所帶的信息量大?。山忉屝苑讲畹拇笮。?
print(pca.explained_variance_ratio_)  # 查看降維后的每個(gè)新特征的信息量占原始數(shù)據(jù)總信息量的百分比
print(pca.explained_variance_ratio_.sum())    # 降維后信息保留量

其中n_components 將決定轉(zhuǎn)換數(shù)據(jù)中的主成分。接下來(lái),我們看一下這四個(gè)主成分解釋了多少方差:

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%的方差。

2.8.3 PCA優(yōu)缺點(diǎn):

優(yōu)點(diǎn):
1、僅僅需要以方差衡量信息量,不受數(shù)據(jù)集以外的因素影響?!?br />2、各主成分之間正交,可消除原始數(shù)據(jù)成分間的相互影響的因素。
3、計(jì)算方法簡(jiǎn)單,主要運(yùn)算是特征值分解,易于實(shí)現(xiàn)。
缺點(diǎn):
1、主成分各個(gè)特征維度的含義具有一定的模糊性,不如原始樣本特征的解釋性強(qiáng)。
2、方差小的非主成分也可能含有對(duì)樣本差異的重要信息,因降維丟棄可能對(duì)后續(xù)數(shù)據(jù)處理有影響

2.8.4 PCA與LDA的聯(lián)系與區(qū)別: 聯(lián)系

兩者其本質(zhì)是要將初始樣本映射到維度更低的樣本空間中,都有降維和信息濃縮的方法,生成的新變量均代表了原始變量的大部分信息且相互獨(dú)立。

區(qū)別

(1)PCA是按照方差最大化的方法生成新變量,為了讓映射后的樣本具有最大的發(fā)散性,強(qiáng)調(diào)新變量貢獻(xiàn)了多大比例的方差,不關(guān)心新變量是否具有明確的實(shí)際意義。PCA是一種無(wú)監(jiān)督的降維方法。
(2)LDA著重要求新變量具有實(shí)際意義,能解釋原始變量間內(nèi)在結(jié)構(gòu),LDA不是對(duì)原始變量的重新組合,而是為了讓映射后的樣本有最好的分類性能,對(duì)原始變量進(jìn)行分解,分解為公共因子和特殊因子。LDA是一種有監(jiān)督的降維方法。

三、降維方法使用場(chǎng)景。

缺失值比率:如果數(shù)據(jù)集的缺失值太多,我們可以用這種方法減少變量數(shù)。
低方差濾波:這個(gè)方法可以從數(shù)據(jù)集中識(shí)別和刪除常量變量,方差小的變量對(duì)目標(biāo)變量影響不大,所以可以放心刪去。
高相關(guān)濾波:具有高相關(guān)性的一對(duì)變量會(huì)增加數(shù)據(jù)集中的多重共線性,所以用這種方法刪去其中一個(gè)是有必要的。
隨機(jī)森林:這是最常用的降維方法之一,它會(huì)明確算出數(shù)據(jù)集中每個(gè)特征的重要性。
前向特征選擇和反向特征消除:這兩種方法耗時(shí)較久,計(jì)算成本也都很高,所以只適用于輸入變量較少的數(shù)據(jù)集。
因子分析:這種方法適合數(shù)據(jù)集中存在高度相關(guān)的變量集的情況。
PCA:這是處理線性數(shù)據(jù)最廣泛使用的技術(shù)之一。

到此這篇關(guān)于python八種降維方法匯總的文章就介紹到這了,更多相關(guān)python 降維內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python求解正態(tài)分布置信區(qū)間教程

    Python求解正態(tài)分布置信區(qū)間教程

    今天小編就為大家分享一篇Python求解正態(tài)分布置信區(qū)間教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Python通過(guò)30秒就能學(xué)會(huì)的漂亮短程序代碼(過(guò)程全解)

    Python通過(guò)30秒就能學(xué)會(huì)的漂亮短程序代碼(過(guò)程全解)

    這篇文章主要介紹了Python之30秒就能學(xué)會(huì)的漂亮短程序代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • Python中幾個(gè)比較常見(jiàn)的名詞解釋

    Python中幾個(gè)比較常見(jiàn)的名詞解釋

    這篇文章主要介紹了Python中幾個(gè)比較常見(jiàn)的名詞解釋,本文解釋同樣適應(yīng)其它編程語(yǔ)言,本文講解了循環(huán)、迭代、遞歸、遍歷等名詞的含義,需要的朋友可以參考下
    2015-07-07
  • Python實(shí)現(xiàn)簡(jiǎn)單掃雷游戲

    Python實(shí)現(xiàn)簡(jiǎn)單掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡(jiǎn)單掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 粗略分析Python中的內(nèi)存泄漏

    粗略分析Python中的內(nèi)存泄漏

    這篇文章主要介紹了粗略分析Python中的內(nèi)存泄漏,分析了包括在垃圾回收時(shí)產(chǎn)生等的原因,需要的朋友可以參考下
    2015-04-04
  • python中l(wèi)ist循環(huán)語(yǔ)句用法實(shí)例

    python中l(wèi)ist循環(huán)語(yǔ)句用法實(shí)例

    這篇文章主要介紹了python中l(wèi)ist循環(huán)語(yǔ)句用法,以實(shí)例形式詳細(xì)介紹了Python針對(duì)list的解析,包含各種常見(jiàn)的遍歷操作及原理分析,需要的朋友可以參考下
    2014-11-11
  • Python3搭建http服務(wù)器的實(shí)現(xiàn)代碼

    Python3搭建http服務(wù)器的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Python3搭建http服務(wù)器的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 利用python-pypcap抓取帶VLAN標(biāo)簽的數(shù)據(jù)包方法

    利用python-pypcap抓取帶VLAN標(biāo)簽的數(shù)據(jù)包方法

    今天小編就為大家分享一篇利用python-pypcap抓取帶VLAN標(biāo)簽的數(shù)據(jù)包方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • 詳解Python+Turtle繪制奧運(yùn)標(biāo)志的實(shí)現(xiàn)

    詳解Python+Turtle繪制奧運(yùn)標(biāo)志的實(shí)現(xiàn)

    turtle庫(kù)是Python標(biāo)準(zhǔn)庫(kù)之一,是入門(mén)級(jí)的圖形繪制函數(shù)庫(kù)。本文就將利用turtle庫(kù)繪制一個(gè)奧運(yùn)標(biāo)志—奧運(yùn)五環(huán),感興趣的可以學(xué)習(xí)一下
    2022-02-02
  • Python?Selenium彈窗處理操作指南

    Python?Selenium彈窗處理操作指南

    我們做項(xiàng)目經(jīng)常會(huì)遇到彈出框,下面這篇文章主要給大家介紹了關(guān)于Python?Selenium彈窗處理的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06

最新評(píng)論