天天看點

【完結篇】專欄 | 基于 Jupyter 的特征工程手冊:特征降維

經過資料預處理和特征選擇,我們已經生成了一個很好的特征子集。但是有時該子集可能仍然包含過多特征,導緻需要花費太多的計算能力用以訓練模型。在這種情況下,我們可以使用降維技術進一步壓縮特征子集。但這可能會降低模型性能。

同時,如果我們沒有太多時間進行特征選擇,我們也可以在資料預處理之後直接應用降維方法。我們可以使用降維算法來壓縮原始特征空間直接生成特征子集。

具體來說,我們将分别介紹PCA和LDA(線性判别分析)。

項目位址:

https://github.com/YC-Coder-Chen/feature-engineering-handbook/blob/master/%E4%B8%AD%E6%96%87%E7%89%88.md

本文将介紹特征工程中的特征降維。

目錄:

【完結篇】專欄 | 基于 Jupyter 的特征工程手冊:特征降維

1.1 Unsupervised Methods 非監督方法

1.1.1 PCA (Principal Components Analysis) 主成分分析

主成分分析(PCA)是一種無監督機器學習模型,其目标為利用線性變換将原始特征投影為一系列線性不相關的機關向量,而同時保留盡可能多的資訊(方差)。您可以從我們在Github中編寫的repo中檢視更多數學細節。

https://github.com/YC-Coder-Chen/Unsupervised-Notes/blob/master/PCA.md

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

# 直接載入資料集
from sklearn.datasets import fetch_california_housing
dataset = fetch_california_housing()
X, y = dataset.data, dataset.target # 利用 california_housing 資料集來示範

# 選擇前15000個觀測點作為訓練集
# 剩下的作為測試集
train_set = X[0:15000,:]
test_set = X[15000:,]
train_y = y[0:15000]

# 在使用主成分分析前,我們需要先對變量進行縮放操作,否則PCA将會賦予高尺度的特征過多的權重
from sklearn.preprocessing import StandardScaler
model = StandardScaler()
model.fit(train_set) 
standardized_train = model.transform(train_set)
standardized_test = model.transform(test_set)

# 開始壓縮特征
compressor = PCA(n_components=0.9) 
# 将n_components設定為0.9 =>
# 即要求我們從所有主成分中選取的輸出主成分至少能保留原特征中90%的方差
# 我們也可以通過設定n_components參數為整數直接控制輸出的變量數目

compressor.fit(standardized_train) # 在訓練集上訓練
transformed_trainset = compressor.transform(standardized_train) # 轉換訓練集 (20000,5)
# 即我們從8個主成分中選取了前5個主成分,而這前5個主成分可以保證保留原特征中90%的方差

transformed_testset = compressor.transform(standardized_test) # 轉換測試集
assert transformed_trainset.shape[1] == transformed_testset.shape[1] 
# 轉換後訓練集和測試集有相同的特征數      
# 可視化 所解釋的方差與選取的主成分數目之間的關系

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
%matplotlib inline


plt.plot(np.array(range(len(compressor.explained_variance_ratio_))) + 1, 
         np.cumsum(compressor.explained_variance_ratio_))
plt.xlabel('選取的主成分數目')
plt.ylabel('累計所解釋的方差累')
plt.show(); # 前5個主成分可以保證保留原特征中90%的方差      
【完結篇】專欄 | 基于 Jupyter 的特征工程手冊:特征降維

1.2 Supervised Methods 監督方法

1.2.1 LDA (Linear Discriminant Analysis) 線性判别分析

與主成分分析(PCA)不同的是,線性判别分析(LDA)是一種有監督機器學習模型,旨在找到特征子集以最大化類線性可分離性,即希望投影望同一種類别資料的投影點盡可能的接近,而不同類别的資料的類别中心之間的距離盡可能的大。線性判别分析僅适用于分類問題,其假設各個類别的樣本資料符合高斯分布,并且具有相同的協方差矩陣。

可以在sklearn的官方網站上了解更多原理方面的詳細資訊。LDA會将原始變量壓縮為(K-1)個,其中K是目标變量類别數。但是在sklearn中,通過将主成分分析的思想合并到LDA中,其可以進一步壓縮變量。

import numpy as np
import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

# LDA僅适用于分類問題
# 載入資料集
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target

# iris 資料集使用前需要被打亂順序
np.random.seed(1234)
idx = np.random.permutation(len(X))
X = X[idx]
y = y[idx]

# 選擇前100個觀測點作為訓練集
# 剩下的50個觀測點測試集

train_set = X[0:100,:]
test_set = X[100:,]
train_y = y[0:100]
test_y = y[100:,]

# 在使用主成分分析前,我們需要先對變量進行縮放操作
# 因為LDA假定資料服從正态分布

from sklearn.preprocessing import StandardScaler # 我們也可以采用幂次變換
model = StandardScaler()
model.fit(train_set) 
standardized_train = model.transform(train_set)
standardized_test = model.transform(test_set)

# 開始壓縮特征
compressor = LDA(n_components=2) # 将n_components設定為2
# n_components <= min(n_classes - 1, n_features)

compressor.fit(standardized_train, train_y)  # 在訓練集上訓練
transformed_trainset = compressor.transform(standardized_train) # 轉換訓練集 (20000,2)
transformed_testset = compressor.transform(standardized_test) # 轉換測試集
assert transformed_trainset.shape[1] == transformed_testset.shape[1]
# 轉換後訓練集和測試集有相同的特征數      
# 可視化 所解釋的方差與選取的特征數目之間的關系
import matplotlib.pyplot as plt
plt.plot(np.array(range(len(compressor.explained_variance_ratio_))) + 1, 
         np.cumsum(compressor.explained_variance_ratio_))
plt.xlabel('選取的特征數目')
plt.ylabel('累計所解釋的方差累')
plt.show(); # LDA将原始的4個變量壓縮為2個,這2個變量即能解釋100%的方差      
【完結篇】專欄 | 基于 Jupyter 的特征工程手冊:特征降維

中文版 Jupyter 位址:

https://github.com/YC-Coder-Chen/feature-engineering-handbook/blob/master/%E4%B8%AD%E6%96%87%E7%89%88/3.%20%E7%89%B9%E5%BE%81%E9%99%8D%E7%BB%B4.ipynb

至此,基于 Jupyter 的特征工程專欄已全部更新完畢,曆史文章彙總如下:

專欄 | 基于 Jupyter 的特征工程手冊:資料預處理(一) 專欄 | 基于 Jupyter 的特征工程手冊:資料預處理(二) 專欄 | 基于 Jupyter 的特征工程手冊:資料預處理(三) 專欄 | 基于 Jupyter 的特征工程手冊:資料預處理(四) 專欄 | 基于 Jupyter 的特征工程手冊:特征選擇(一) 專欄 | 基于 Jupyter 的特征工程手冊:特征選擇(二) 專欄 | 基于 Jupyter 的特征工程手冊:特征選擇(三) 專欄 | 基于 Jupyter 的特征工程手冊:特征選擇(四) 專欄 | 基于 Jupyter 的特征工程手冊:特征選擇(五)

繼續閱讀