1. 程式人生 > >python資料預處理 :資料降維

python資料預處理 :資料降維

資料為何要降維

資料降維可以降低模型的計算量並減少模型執行時間、降低噪音變數資訊對於模型結果的影響、便於通過視覺化方式展示歸約後的維度資訊並減少資料儲存空間。因此,大多數情況下,當我們面臨高維資料時,都需要對資料做降維處理。

資料降維有兩種方式:特徵選擇,維度轉換

特徵選擇

特徵選擇指根據一定的規則和經驗,直接在原有的維度中挑選一部分參與到計算和建模過程,用選擇的特徵代替所有特徵,不改變原有特徵,也不產生新的特徵值。
特徵選擇的降維方式好處是可以保留原有維度特徵的基礎上進行降維,既能滿足後續資料處理和建模需求,又能保留維度原本的業務含義,以便於業務理解和應用。對於業務分析性的應用而言,模型的可理解性和可用性很多時候要有限於模型本身的準確率、效率等技術指標。例如,決策樹得到的特徵規則,可以作為選擇使用者樣本的基礎條件,而這些特徵規則便是基於輸入的維度產生。

維度轉換

這個是按照一定數學變換方法,把給定的一組相關變數(維度)通過數學模型將高緯度空間的資料點對映到低緯度空間中,然後利用對映後變數的特徵來表示原有變數的總體特徵。這種方式是一種產生新維度的過程,轉換後的維度並非原來特徵,而是之前特徵的轉化後的表示式,新的特徵丟失了原有資料的業務含義。 通過資料維度變換的降維方法是非常重要的降維方法,這種降維方法分為線性降維和非線性降維兩種,其中常用的代表演算法包括獨立成分分析(ICA),主成分分析(PCA),因子分析(Factor Analysis,FA),線性判別分析(LDA),區域性線性嵌入(LLE),核主成分分析(Kernel PCA)等。

使用python做降維處理

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.decomposition import PCA

# 資料匯入
df = pd.read_csv('https://raw.githubusercontent.com/ffzs/dataset/master/glass.csv')

# 看一下資料是
df.head()


     RI	     Na	 Mg	Al	    Si	    K	    Ca	    Ba	    Fe	  Type
0
1.52101 13.64 4.49 1.10 71.78 0.06 8.75 0.0 0.0 1 1 1.51761 13.89 3.60 1.36 72.73 0.48 7.83 0.0 0.0 1 2 1.51618 13.53 3.55 1.54 72.99 0.39 7.78 0.0 0.0 1 3 1.51766 13.21 3.69 1.29 72.61 0.57 8.22 0.0 0.0 1 4 1.51742 13.27 3.62 1.24 73.08 0.55 8.07 0.0 0.0 1 # 有無缺失值 df.isna().values.any() # False 沒有缺失值 # 獲取特徵值 X = df.iloc[:, :-1].values # 獲取標籤值 Y = df.iloc[:,[-1]].values # 使用sklearn 的DecisionTreeClassifier判斷變數重要性 # 建立分類決策樹模型物件 dt_model = DecisionTreeClassifier(random_state=1) # 將資料集的維度和目標變數輸入模型 dt_model.fit(X, Y) # 獲取所有變數的重要性 feature_importance = dt_model.feature_importances_ feature_importance # 結果如下 # array([0.20462132, 0.06426227, 0.16799114, 0.15372793, 0.07410088, 0.02786222, 0.09301948, 0.16519298, 0.04922178]) # 做視覺化 import matplotlib.pyplot as plt x = range(len(df.columns[:-1])) plt.bar(left= x, height=feature_importance) plt.xticks(x, df.columns[:-1])

在這裡插入圖片描述
可見Rl、Mg、Al、Ba的重要性比較高,一般情況下變數重要性得分接近80%,基本上已經可以解釋大部分的特徵變化。

PCA降維

# 使用sklearn的PCA進行維度轉換
# 建立PCA模型物件 n_components控制輸出特徵個數
pca_model = PCA(n_components=3)
# 將資料集輸入模型
pca_model.fit(X)
# 對資料集進行轉換對映
pca_model.transform(X)
# 獲得轉換後的所有主成分
components = pca_model.components_
# 獲得各主成分的方差
components_var = pca_model.explained_variance_
# 獲取主成分的方差佔比
components_var_ratio = pca_model.explained_variance_ratio_
# 列印方差
print(np.round(components_var,3))
# [3.002 1.659 0.68 ]
# 列印方差佔比
print(np.round(components_var_ratio,3))
# [0.476 0.263 0.108]