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

2021-03-02 AI有道

作者:陳穎祥、楊子晗

編譯:AI有道

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

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

具體來說,我們將分別介紹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 非監督方法

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 npimport pandas as pdfrom sklearn.decomposition import PCA
# 直接載入數據集from sklearn.datasets import fetch_california_housingdataset = 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 StandardScalermodel = 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 pltplt.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%的方差

1.2 Supervised Methods 監督方法

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

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

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

import numpy as npimport pandas as pdfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
# LDA僅適用於分類問題# 載入數據集from sklearn.datasets import load_irisiris = 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 pltplt.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 地址:

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 的特徵工程手冊:特徵選擇(五)

算法工程師必備

AI有道年度技術文章電子版PDF來啦!

掃描下方二維碼,添加 AI有道小助手微信,可申請入群,並獲得2020完整技術文章合集PDF(一定要備註:入群 + 地點 + 學校/公司。例如:入群+上海+復旦。 

長按掃碼,申請入群

(添加人數較多,請耐心等待)

 

最新 AI 乾貨,我在看 

相關焦點

  • 特徵選擇、特徵提取最全總結
    本篇將介紹特徵選擇與特徵提取方法,其主要內容如下所示。
  • 模板識別:使用OpenCV實現基於特徵的圖像對齊
    我們將使用的技術通常被稱為「基於特徵圖像對齊」,因為在該技術中,在一個圖像中檢測稀疏的特徵集並且在另一圖像中進行特徵匹配。然後基於這些匹配特徵將原圖像映射到另一個圖像,實現圖像對齊。也就是說我們可以通過描述子找到要匹配的特徵點,然後根據這些匹配的特徵點,計算兩個圖像相關的單應性,實現圖像映射。ORB其他信息可以見https://www.jianshu.com/p/387b8ac04c942 OpenCV的圖像對齊2.1 基於特徵的圖像對齊的步驟現在我們可以總結圖像對齊所涉及的步驟。
  • 特徵選擇及基於Sklearn的實現
    sklearn.feature_selection模塊被廣泛應用於樣本數據集的特徵選擇和特徵降維,以減少特徵數量,增強對特徵和特徵值之間的理解,提高預測準確性或提高在高維數據集上的性能。本文將依據官方文檔對sklearn.feature_selection模塊進行介紹。
  • 推薦系統之特徵構建
    用戶歷史行為特徵 用戶的歷史行為特徵主要通過分窗口的方式來構建。比如用戶上一刷點擊過和未點擊過的文章,用戶上次打開app閱讀的文章,用戶最近閱讀的5篇文章,用戶最近一周閱讀的文章,用戶一個月閱讀的文章。
  • 特徵點的檢測與匹配--系統總結
    特徵點:檢測子(給一副圖像找到特徵點的位置)+描述子(特徵向量,用於特徵匹配)一、圖像特徵介紹1、圖像特徵點的應用相機標定:棋盤格角點陰影格式固定,不同視角檢測到點可以得到匹配結果,標定相機內參圖像拼接:不同視角匹配恢復相機姿態稠密重建:間接使用特徵點作為種子點擴散匹配得到稠密點雲
  • 使用Python進行數據降維|線性降維
    作者:劉早起早起來源:早起Python使用Python進行數據降維為什麼要進行數據降維?直觀地好處是維度降低了,便於計算和可視化,其深層次的意義在於有效信息的提取綜合及無用信息的擯棄,並且數據降維保留了原始數據的信息,我們就可以用降維的數據進行機器學習模型的訓練和預測,但將有效提高訓練和預測的時間與效率。
  • 《機器學習》-- 第十章 降維與度量學習
    其工作機制十分簡單:給定某個測試樣本,kNN基於某種距離度量在訓練集中找出與其距離最近的k個帶有真實標記的訓練樣本,然後基於這k個鄰居的真實標記來進行預測,類似於集成學習中的基學習器結合策略:分類任務採用投票法,回歸任務則採用平均法。
  • R語言實現UMAP降維模型
    主要基於流形理論和拓撲算法的理論,對高維數據進行降維,從而形成其他分類模型的輸入特徵。那麼,我們首先看下什麼是流形理論呢。我們從一個叫做Swiss Roll的可視化模型進行解釋,具體意義就是如何將在流形上兩個點的距離進行最小化的表示。
  • 【泡泡圖靈智庫】基於貪心特徵選取的高效雷射雷達SLAM
    Greedy-Based Feature Selection for Efficient LiDAR SLAM基於貪心特徵選取的高效雷射雷達SLAM論文連結:https://arxiv.org/pdf/2103.13090.pdf
  • 乾貨 | 基於特徵的圖像配準用於缺陷檢測
    下面是一個簡單的代碼演示,基於特徵對齊,實現基於分差的缺陷檢測。用基於ORB特徵的匹配結果,如下圖所示,可以看到有一些錯誤的匹配點基於ORB特徵實現圖像相關特徵點匹配的代碼實現如下:constint MAX_FEATURES = 5000;constfloat GOOD_MATCH_PERCENT
  • 使用python+sklearn實現排列重要性與隨機森林特徵重要性
    我們將展示基於雜質(impurity-based)特徵的重要性可以提高數值特徵的重要性。此外,隨機森林模型基於雜質特徵的重要性受到訓練數據集的影響:只要模型有能力過擬合數據集的話,即使特徵與目標變量的預測沒有什麼關係,該特徵的重要性也可能會很高。同時本示例也說明了如何使用排列重要性作為替代方法來減輕這些限制。
  • 工業數據:基於統計和信號的特徵提取方法
    ,因此需要進行特徵提取,把原有的低維時序數據映射到高維表示,挖掘和構造輸入數據的新特徵,進而找出最能幫助模型擬合的輸入(X)和輸出(Y)特徵。在很多預測性維護的場景(如旋轉件、振動等)中,我們完全可以採用基於統計和信號的特徵提取方法就能得到一些較好的特徵。本文的特徵提取方法主要包含三個角度:基於統計的時域特徵,就是使用統計學方法如均方根、方差、最大值、最小值、偏斜度、峰度、峰峰值等提取出的新數據。
  • Hilbert 變換提取信號特徵的 Python 實現
    那麼根據不同信號包絡上高階統計量特徵不同,可分為R值特徵和J值特徵。信號包絡R值特徵:R值是信號包絡的方差與包絡均值的平方的比值:paperid=f2c7b987bd3af320909da0e1c09a723b&site=xueshu_se,這篇論文,三種特徵值能夠很好的表現信號性能。好了,基礎的知識就是這些,下面我們寫代碼實現Hilbert變換,計算並提取三種特徵值。
  • 特徵點檢測haris,sift,surf,orb
    基於這種考慮,我們先將圖像放大2倍,這樣原圖像的細節就隱藏在了其中。 ,即第二個問題:尺度空間生成了多少幅圖像我們知道S是我們最終構建出來的用來尋找特徵點的高斯差分圖像,而特徵點的尋找需要查找的是空間局部極小值,即在某一層上查找局部極值點的時候需要用到上一層與下一層的高斯差分圖像,所以如果我們需要查找S層的特徵點,需要S+2層高斯差分圖像,然後查找其中的第2層到第S+1層。
  • 獨家 | 基於Python的遺傳算法特徵約簡(附代碼)
    標籤:深度學習,特徵工程,遺傳算法,神經網絡,numpy,python,scikit-learn 本教程主要使用numpy和sklearn來討論如何使用遺傳算法(genetic algorithm,GA)來減少從python中的Fruits360數據集提取的特徵向量。
  • CVPR2021 用更好的目標檢測器提取視覺特徵!微軟提出VinVL,基於更好的視覺特徵,達到更強的多模態性能
    雖然之前的VL研究主要集中在改進視覺語言融合模型,而不涉及目標檢測模型的改進,但作者發現視覺特徵在VL模型中起著重要作用。在本文的實驗中,作者將新的目標檢測模型生成的視覺特徵輸入到基於Transformer的VL融合模型OSCAR中,並利用改進的方法OSCAR+對VL模型進行預訓練,然後在多個下遊VL任務中對其進行微調。
  • 特徵提取、特徵描述、特徵匹配的通俗解釋
    本文希望通過一種通俗易懂的方式來闡述特徵匹配這個過程,以及在過程中遇到的一些問題。首先我通過幾張圖片來指出什麼是特徵匹配,以及特徵匹配的過程。圖像一:彩色圓圈為圖像的特徵點對話2:小白:我的一個特徵左邊是三角形,右邊是圓形,上面是菱形,下面是正方形。小黑:我也有一個特徵左邊是三角形,右邊是圓形,上面是菱形,下面是正方形。對話3:小白和小黑:那我們看到的就是同一個特徵了。上述三個對話其實分別代表這特徵提取,特徵描述和特徵匹配。
  • t-SNE降維原理以及使用R語言實現
    主要參數參數功能dims參數設置降維之後的維度,默認是2perplexity困惑度,參數須取值小於(nrow(data)-1)/3theta參數越大,結果的準確度越低,默認是0.5max_iter最大迭代次數pca表示是否對輸入的原始數據進行PCA分析,然後用分析後的數據進行後續分析1、用t-SNE對iris數據進行降維
  • 推薦系統原理、工程、大廠(Youtube、BAT、TMB)架構幹活分享
    本文匯集了關於推薦系統原理、工程、各大長推薦架構、經驗相關的純乾貨。原理篇整理了內容推薦、協同推薦、舉證分解、模型融合、Bandit和深度學習相關的經典方法。工程篇整理了推薦系統常見架構、關鍵模塊和效果驗證相關的資源。實戰部分整理了Netfix、Hulu、Youtube、Google、Amazon、BAT、TMD等各大網際網路公司推薦系統實戰相關的經驗。
  • 特徵重要性與shap值
    當>0,說明該特徵對目標值的預測起到了正向作用;反之,該特徵與目標預測值有相反作用。因此Shap不僅給出特徵影響力的大小,也反映出每一個樣本中的特徵的影響力的正負性。基於上述訓練的xgboost模型,計算變量的shap值。