【完结篇】专栏 | 基于 Jupyter 的特征工程手册:特征降维
作者:陳穎祥、楊子晗
編譯:AI有道
經(jīng)過數(shù)據(jù)預(yù)處理和特征選擇,我們已經(jīng)生成了一個很好的特征子集。但是有時該子集可能仍然包含過多特征,導(dǎo)致需要花費太多的計算能力用以訓(xùn)練模型。在這種情況下,我們可以使用降維技術(shù)進一步壓縮特征子集。但這可能會降低模型性能。
同時,如果我們沒有太多時間進行特征選擇,我們也可以在數(shù)據(jù)預(yù)處理之后直接應(yīng)用降維方法。我們可以使用降維算法來壓縮原始特征空間直接生成特征子集。
具體來說,我們將分別介紹PCA和LDA(線性判別分析)。
項目地址:
https://github.com/YC-Coder-Chen/feature-engineering-handbook/blob/master/%E4%B8%AD%E6%96%87%E7%89%88.md
本文將介紹特征工程中的特征降維。
目錄:
1.1?Unsupervised Methods 非監(jiān)督方法
1.1.1 PCA (Principal Components Analysis) 主成分分析
主成分分析(PCA)是一種無監(jiān)督機器學(xué)習(xí)模型,其目標(biāo)為利用線性變換將原始特征投影為一系列線性不相關(guān)的單位向量,而同時保留盡可能多的信息(方差)。您可以從我們在Github中編寫的repo中查看更多數(shù)學(xué)細(xì)節(jié)。
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# 直接載入數(shù)據(jù)集 from sklearn.datasets import fetch_california_housing dataset = fetch_california_housing() X, y = dataset.data, dataset.target # 利用 california_housing 數(shù)據(jù)集來演示# 選擇前15000個觀測點作為訓(xùn)練集 # 剩下的作為測試集 train_set = X[0:15000,:] test_set = X[15000:,] train_y = y[0:15000]# 在使用主成分分析前,我們需要先對變量進行縮放操作,否則PCA將會賦予高尺度的特征過多的權(quán)重 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設(shè)置為0.9 => # 即要求我們從所有主成分中選取的輸出主成分至少能保留原特征中90%的方差 # 我們也可以通過設(shè)置n_components參數(shù)為整數(shù)直接控制輸出的變量數(shù)目compressor.fit(standardized_train) # 在訓(xùn)練集上訓(xùn)練 transformed_trainset = compressor.transform(standardized_train) # 轉(zhuǎn)換訓(xùn)練集 (20000,5) # 即我們從8個主成分中選取了前5個主成分,而這前5個主成分可以保證保留原特征中90%的方差transformed_testset = compressor.transform(standardized_test) # 轉(zhuǎn)換測試集 assert transformed_trainset.shape[1] == transformed_testset.shape[1] # 轉(zhuǎn)換后訓(xùn)練集和測試集有相同的特征數(shù) # 可視化 所解釋的方差與選取的主成分?jǐn)?shù)目之間的關(guān)系import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] %matplotlib inlineplt.plot(np.array(range(len(compressor.explained_variance_ratio_))) + 1, np.cumsum(compressor.explained_variance_ratio_)) plt.xlabel('選取的主成分?jǐn)?shù)目') plt.ylabel('累計所解釋的方差累') plt.show(); # 前5個主成分可以保證保留原特征中90%的方差1.2?Supervised Methods 監(jiān)督方法
1.2.1?LDA (Linear Discriminant Analysis) 線性判別分析
與主成分分析(PCA)不同的是,線性判別分析(LDA)是一種有監(jiān)督機器學(xué)習(xí)模型,旨在找到特征子集以最大化類線性可分離性,即希望投影望同一種類別數(shù)據(jù)的投影點盡可能的接近,而不同類別的數(shù)據(jù)的類別中心之間的距離盡可能的大。線性判別分析僅適用于分類問題,其假設(shè)各個類別的樣本數(shù)據(jù)符合高斯分布,并且具有相同的協(xié)方差矩陣。
可以在sklearn的官方網(wǎng)站上了解更多原理方面的詳細(xì)信息。LDA會將原始變量壓縮為(K-1)個,其中K是目標(biāo)變量類別數(shù)。但是在sklearn中,通過將主成分分析的思想合并到LDA中,其可以進一步壓縮變量。
import numpy as np import pandas as pd from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA# LDA僅適用于分類問題 # 載入數(shù)據(jù)集 from sklearn.datasets import load_iris iris = load_iris() X, y = iris.data, iris.target# iris 數(shù)據(jù)集使用前需要被打亂順序 np.random.seed(1234) idx = np.random.permutation(len(X)) X = X[idx] y = y[idx]# 選擇前100個觀測點作為訓(xùn)練集 # 剩下的50個觀測點測試集train_set = X[0:100,:] test_set = X[100:,] train_y = y[0:100] test_y = y[100:,]# 在使用主成分分析前,我們需要先對變量進行縮放操作 # 因為LDA假定數(shù)據(jù)服從正態(tài)分布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設(shè)置為2 # n_components <= min(n_classes - 1, n_features)compressor.fit(standardized_train, train_y) # 在訓(xùn)練集上訓(xùn)練 transformed_trainset = compressor.transform(standardized_train) # 轉(zhuǎn)換訓(xùn)練集 (20000,2) transformed_testset = compressor.transform(standardized_test) # 轉(zhuǎn)換測試集 assert transformed_trainset.shape[1] == transformed_testset.shape[1] # 轉(zhuǎn)換后訓(xùn)練集和測試集有相同的特征數(shù) # 可視化 所解釋的方差與選取的特征數(shù)目之間的關(guān)系 import matplotlib.pyplot as plt plt.plot(np.array(range(len(compressor.explained_variance_ratio_))) + 1, np.cumsum(compressor.explained_variance_ratio_)) plt.xlabel('選取的特征數(shù)目') plt.ylabel('累計所解釋的方差累') plt.show(); # LDA將原始的4個變量壓縮為2個,這2個變量即能解釋100%的方差中文版 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 的特征工程專欄已全部更新完畢,歷史文章匯總?cè)缦?#xff1a;
專欄 | 基于 Jupyter 的特征工程手冊:數(shù)據(jù)預(yù)處理(一)
專欄 | 基于 Jupyter 的特征工程手冊:數(shù)據(jù)預(yù)處理(二)
專欄 | 基于 Jupyter 的特征工程手冊:數(shù)據(jù)預(yù)處理(三)
專欄 | 基于 Jupyter 的特征工程手冊:數(shù)據(jù)預(yù)處理(四)
專欄 | 基于 Jupyter 的特征工程手冊:特征選擇(一)
專欄 | 基于 Jupyter 的特征工程手冊:特征選擇(二)
專欄 | 基于 Jupyter 的特征工程手冊:特征選擇(三)
專欄 | 基于 Jupyter 的特征工程手冊:特征選擇(四)
專欄 | 基于 Jupyter 的特征工程手冊:特征選擇(五)
推薦閱讀
(點擊標(biāo)題可跳轉(zhuǎn)閱讀)
干貨 | 公眾號歷史文章精選
我的深度學(xué)習(xí)入門路線
我的機器學(xué)習(xí)入門路線圖
算法工程師必備!
AI有道年度技術(shù)文章電子版PDF來啦!
掃描下方二維碼,添加?AI有道小助手微信,可申請入群,并獲得2020完整技術(shù)文章合集PDF(一定要備注:入群?+ 地點 + 學(xué)校/公司。例如:入群+上海+復(fù)旦。?
長按掃碼,申請入群
(添加人數(shù)較多,請耐心等待)
?
最新 AI 干貨,我在看?
總結(jié)
以上是生活随笔為你收集整理的【完结篇】专栏 | 基于 Jupyter 的特征工程手册:特征降维的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员,这600单词你知道吗?
- 下一篇: Google推出了Python最牛逼的编