分享一個Python中機器學習的特徵選擇工具

2020-12-05 IT168

  特徵選擇,即在數據集中查找和選擇最有用的特徵的過程,是機器學習的關鍵步驟。不必要的特徵會降低訓練速度、模型的可解釋性,最重要的是會降低測試集的泛化性能。

  我對臨時的特徵選擇方法感到很失望,但是在解決機器學習問題時又反覆用到了這些方法,所以就創建了一個關於特徵選擇的Python類,該類可以在GitHub上找到。FeatureSelector類包括一些最常見的特徵選擇方法:

  1.高百分比的缺失值特徵選擇法

  2.共線(高度相關)特徵選擇法

  3.樹型結構模型中的零重要性特徵選擇法

  4.低重要性特徵選擇法

  5.唯一值特徵選擇法

  在本文中,我將對機器學習數據集的示例使用FeatureSelector類。也會介紹該類是如何讓我們快速地實現特徵選擇方法。

  完整的代碼可以在GitHub上找到,特徵選擇器還是一個半成品,會根據社區的需求繼續改進!

  示例數據集

  示例中使用的是Kaggle上家庭信用違約風險機器學習競賽的數據樣本。整個數據集可以下載,演示樣本如下:

  該數據樣本來自一個有監督分類問題,也是一個很好的數據集。因為它有許多缺失值、高度相關(共線)的特徵以及對機器學習模型無用的不相關特徵。

  創建一個實例

  創建FeatureSelector類的實例需傳入結構化的數據集,該數據集行為觀察值、列為特徵。該類內有一些只需傳入特徵的方法,但是這些基於特徵重要性的方法需傳入訓練標籤。所以當用這些方法解決一個有監督分類問題時,需傳入一組特徵和一組標籤。

  from feature_selector import FeatureSelector

  # Features are in train and labels are in train_labels

  fs = FeatureSelector(data = train, labels = train_labels)

  方法

  特徵選擇器有5種查找要刪除特徵的方法,找到被標識的特徵並手動地將它們從數據中刪除,或者使用特徵選擇器中的remove函數。

  下面將詳細介紹每一種方法,並展示5種方法是如何同時運行的。FeatureSelector類內還有一些具有繪圖功能的方法,因為檢驗直觀的圖像數據也是機器學習的一個重要組成部分。

  缺失值

  缺失值特徵選擇法比較簡單:所查找的特徵是超過指定閾值的缺失值。下面的調用所標識的特徵都是超過60%的缺失值(粗體為輸出)。

  fs.identify_missing(missing_threshold = 0.6)

  17 features with greater than 0.60 missing values.

  按列顯示缺失值的dataframe:

  fs.missing_stats.head()

  通過FeatureSelector類的ops屬性可以查看要刪除特徵。具體過程如下面所列的Python 命令所示:

  missing_features = fs.ops['missing']

  missing_features[:5]

  ['OWN_CAR_AGE',

  'YEARS_BUILD_AVG',

  'COMMONAREA_AVG',

  'FLOORSMIN_AVG',

  'LIVINGAPARTMENTS_AVG']

  下面是缺失值佔特徵比例的分布圖:

  fs.plot_missing()

  共線特徵

  共線特徵是高度相關的特徵。在機器學習中,由於共線特徵的高方差和低模型可解釋性,會導致測試集的泛化性能下降。

  identify_collinear方法根據指定的相關係數值查找共線特徵,將相關特徵對中的一個標識為要刪除特徵(因為只需要刪除一個):

  fs.identify_collinear(correlation_threshold = 0.98)

  21 features with a correlation magnitude greater than 0.98.

  下面是基於相關性的熱度圖,該圖顯示了相關性超過閾值的所有特徵:

  fs.plot_collinear()

  類似的,也可以列出要刪除的共線特徵,或者查看共線特徵的dataframe。

  # list of collinear features to remove

  collinear_features = fs.ops['collinear']

  # dataframe of collinear features


fs.record_collinear.head()

  如果想深入研究數據集,還可以傳入plot_all = True給調用,繪製所有數據相關性的圖表:

  零重要性特徵

  前兩種方法可以應用於任何結構化的數據集,且具有確定性——對於給定的閾值,每次結果都是相同的。但是零重要性特徵選擇法只針對有監督的機器學習問題(有訓練模型的標籤),且具有不確定性。identify_zero_important函數根據梯度提升機(GBM)學習模型來查找零重要性特徵。

  通過基於樹型結構的機器學習模型,例如boosting集成算法,可以發現特徵的重要性。重要性的相對值可以確定任務的最相關特徵,絕對值就沒有那麼重要了,但是可以通過刪除零重要性特徵可以進行特徵選擇。零重要性特徵不能作為樹型模型中的節點,因此可以在不影響模型性能的情況下刪除它們。

  FeatureSelector通過LightGBM庫的梯度提升機來查找特徵重要性。為了減少差異,對特徵重要性進行平均超過10次的GBM訓練。此外,通過使用驗證集(可關閉)進行早期停止來訓練模型,以防止對訓練數據的過度擬合。

  下面的代碼調用了該方法並提取了零重要性特徵:

  # Pass in the appropriate parameters

  fs.identify_zero_importance(task = 'classification',

                eval_metric = 'auc',

                n_iterations = 10,

                early_stopping = True)

  # list of zero importance features

  zero_importance_features = fs.ops['zero_importance']

  63 features with zero importance after one-hot encoding.

  傳入的參數如下:

  task:根據問題對應選擇「classification」或「regression」

  eval_metric:衡量早期停止(若禁用了早期停止,則沒有必要)

  n_iteration:訓練次數

  early_stopping:是否使用早期停止來訓練模型

  下面兩個圖由plot_feature_importances函數得出:

  # plot the feature importances

  fs.plot_feature_importances(threshold = 0.99, plot_n = 12)

  左邊是關於plot_n最重要特徵的圖(根據歸一化的重要性所繪製,總和為1)。右邊是累積重要性與特徵數量的關係圖。垂線畫在累積重要性達到的閾值處,本例中閾值為99%。

  基於重要性的方法需要記住兩個要點:

  (1)訓練梯度提升機是隨機的,每一次模型運行,特徵重要性都將會改變。

  這不會產生重大的影響(最重要的特徵不會突然變成最少),但是它會改變某些特徵的順序,還會影響被標識的零重要性特徵的數量。如果特徵重要性每次都發生變化,不要感到驚訝!

  (2)為了對機器學習模型進行訓練,首先需要對特徵進行獨熱編碼。所以一些被標識為零重要性的特徵可能是在建模過程中添加的獨熱編碼特徵。

  在刪除特徵時可以刪除任何添加的獨熱編碼特徵。但是,如果在特徵選擇之後要進行機器學習,則不能刪除!

  低重要性特徵

  這種方法構建立在零重要性函數的基礎上,再利用模型中的特徵重要性進行進一步的選擇。由函數identify_low_importance可知,低重要性特徵並不影響某些指定的總重要性。

  例如,下面的調用顯示:在實現99%的總重要性時,最低重要性特徵並不是必需的。

  fs.identify_low_importance(cumulative_importance = 0.99)

  由上面累積重要性的圖,以及低重要性不影響某些指定的總重要性這一信息可知,梯度提升機中有許多與學習無關的特徵。同樣,低重要性特徵選擇法的結果在每次訓練中都會發生變化。

  查看所有的特徵重要性:

  fs.feature_importances.head(10)

  low_importance方法借鑑了使用主成分分析(PCA)的方法,只要求主成分所佔的比例要維持在一定的百分比(例如95%)。總重要性所佔比例也要維持在一定的百分比。

  基於特徵重要性的方法最適合用來對樹型結構模型進行預測。基於重要性的方法是隨機的,也是一種黑盒方法,因為模型判定特徵是否相關並不透明的。所以在使用基於特徵重要性的方法時,應多次運行以查看結果如何變化,並儘可能創建多個具有不同參數的數據集以進行測試!

  唯一值特徵

  最唯一值特徵選擇法是相當基本的:查找有唯一值的列。只有一個唯一值的特徵對於機器學習來說是無用的,因為這個特徵的方差為零。例如,只有一個值的特徵不能作為樹型結構模型的節點(因為該特徵不能再分組了)。

  繪製各個區間唯一值數量的直方圖:

  fs.plot_unique()

  需要記住的一點是:默認在計算Pandas 中唯一值之前,NaNs會被刪除。

  刪除特徵

  確定了要刪除特徵後,有兩個選擇可以刪除它們。所有要刪除的特徵都存儲在FeatureSelector的ops屬性中,可以根據出現的列表手動刪除特徵。另一種選擇是使用remove內置函數。

  使用remove函數刪除特徵時需傳入methods。如果想要使用所有的實現方法,只需傳入methods = 'all'。

  # Remove the features from all methods (returns a df)

  train_removed = fs.remove(methods = 'all')

  ['missing', 'single_unique', 'collinear', 'zero_importance', 'low_importance'] methods have been run

  Removed 140 features.

  該方法刪除特徵後返回一個dataframe,在機器學習過程中創建的one-hot編碼特徵也被刪除:

  train_removed_all = fs.remove(methods = 'all', keep_one_hot=False)

  Removed 187 features including one-hot features.

  在開始操作之前先檢查要刪除的特徵!原始數據集存儲在FeatureSelector的data屬性中作為備份!

  結論

  在訓練機器學習模型之前,特徵選擇器類實現了一些常見的刪除特徵的操作。它具有選擇要刪除特徵和繪圖的功能。類內方法可以單獨運行,也可以為實現高效的工作流而同時運行。

  Missing方法, collinear方法和single_unique方法都是具有確定性的,而基於特徵重要性的方法會隨著每次運行而改變。像機器學習一樣,特徵選擇很大程度上是經驗主義。測試多組數據才能得到最佳結果,所以最好多嘗試幾次。特徵選擇器提供了一種快速評估特徵選擇參數的方法。

  本文由阿里云云棲社區組織翻譯。

  文章原標題《a-feature-selection-tool-for-machine-learning-in-python》

  作者: William Koehrsen譯者:吳兆青,審校:袁虎。

  文章為簡譯,更為詳細的內容,請查看原文文章

相關焦點

  • 機器學習中特徵選擇怎麼做?這篇文章告訴你
    因此,只選擇頂部的前幾個特徵,而放棄其他特徵,可能創建一個準確度非常可觀的模型。然後,它遞歸地減少要使用的特徵的數量,採用的方法是使用機器學習模型精度作為度量對它們進行排序。創建一個 for 循環,其中輸入特徵的數量是我們的變量,這樣就可以通過跟蹤在每個循環迭代中註冊的精度,找出我們的模型所需的最佳特徵數量。
  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    共4天8節,講解機器學習和深度學習的模型理論和代碼實踐,梳理機器學習、深度學習、計算機視覺的技術框架,從根本上解決如何使用模型、優化模型的問題;每次課中,首先闡述算法理論和少量公式推導,然後使用真實數據做數據挖掘、機器學習、深度學習的數據分析、特徵選擇、調參和結果比較。
  • 令人讚嘆的8個Python新手工具!
    3、TheanoTheano是一個較老牌和穩定的機器學習python庫之一,雖然目前使用的人數有所下降。但它畢竟是一個祖師級的存在,一定有它的優點所在。Theano基於Python擅長處理多維數組,屬於比較底層的框架,theano起初也是為了深度學習中大規模人工神經網絡算法的運算所設計,我們可利用符號化式語言定義想要的結果,支持GPU加速,非常適合深度學習Python。
  • 機器學習團隊常用工具總結,人生苦短,我用Python!
    機器學習工具,初創公司最愛哪款?   近日,Reddit上一則帖子火了:發帖者詳細總結了近幾年初創公司的機器學習團隊在各個環節使用的機器學習工具,從軟體開發設置IDE,機器學習框架,到實驗管理,可視化工具等等。   評論區也一片火爆,大家紛紛作出補充,極大的豐富了現有最新主流資源。
  • 算法應用|機器學習python應用,簡單機器學習項目實踐
    上一篇文章中介紹了機器學習的簡單知識,還有python中進行機器學習實踐需要的生態環境,接下來將會通過鳶尾花分類這個例子對機器學習做一個簡要的介紹。通過一步一步地實現這個項目來介紹以下內容。導入和使用python中機器學習的各個方面的類庫。導入數據,並通過描述性分析、可視化等對數據進行分析。創建六個模型,並從中選擇準確度最高的模型。
  • python機器學習:常用庫的介紹及安裝
    現在,隨著人工智慧的興起,機器學習越來越被各行業看重,從而使得人工智慧的需求會越來越大。今天,我們就從零基礎開始學習人工智慧的基礎篇——機器學習。工欲善其事必先利其器,所以,我們首先來看一下,我們要學習這些東西,需要準備些什麼!首先電腦一臺,這是必備的。下面我們來看一下需要安裝些什麼軟體到電腦上!
  • 好程式設計師Python培訓分享numpy簡介
    好程式設計師Python培訓分享numpy簡介:一、numpy簡介:NumPy是一個功能強大的Python庫,主要用於對多維數組執行計算。NumPy這個詞來源於兩個單詞-- Numerical和Python。NumPy提供了大量的庫函數和操作,可以幫助程式設計師輕鬆地進行數值計算。
  • 機器學習:特徵選擇和降維實例
    不幸的是,在Do not Overfit II競賽(kaggle.com/c/dont-overfit-ii/data)中,領域知識的使用是不可能的,因為我們有一個二元目標和300個連續變量,這迫使我們嘗試特徵選擇技術。簡介通常,我們將特徵選擇和降維組合在一起使用。雖然這兩種方法都用於減少數據集中的特徵數量,但存在很大不同。
  • 2019年必知的10大頂級Python庫
    python 在開發人員中流行的原因有很多。然而,最重要的一點是它有大量的庫供用戶使用。python 的簡單性吸引了許多開發人員為機器學習創建新的庫。由於有大量的庫,python 在機器學習專家中變得非常流行。所以,這裡要介紹的第一個庫是 TensorFlow。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐
  • 教你如何做特徵選擇
    主要的方法有:2、Wrapper方法其主要思想是:將子集的選擇看作是一個搜索尋優問題,生成不同的組合,對組合進行評價,再與其他的組合進行比較。這樣就將子集的選擇看作是一個是一個優化問題,這裡有很多的優化算法可以解決,尤其是一些啟發式的優化算法,如GA,PSO,DE,ABC等。
  • 機器學習:Python中的四種機器學習技巧
    機器學習技術與算法眾所周知,機器學習是技術和算法的結合。但在開始關注技術和算法之前,讓我們看看它們是否是同一個東西。技術是解決問題的一種方法,這是一個非常通用的術語。 但是,當我們說我們有一個算法時,意思是我們有一個輸入,並希望從中得到一定的輸出,明確規定了實現目標的步驟。
  • 專欄 | 基於 Jupyter 的特徵工程手冊:特徵選擇(四)
    在每一步中,其在特徵子集上訓練模型,然後對其進行評估,並在下一步繼續調整特徵子集,重新訓練評估,直到找到最佳子集或達到最大迭代次數為止。窮盡搜索在封裝方法中為NP-Hard,故人們提出了一些方法來降低封裝方法所需要的迭代次數,以便可以在有限的時間內達到一個較好的效果。
  • 2020年六大機器學習Python庫!
    外頭有許多類型的python庫可用,本文介紹了一些流行的機器學習庫。1. NumPy:NumPy是一種通用的數組處理軟體包。它提供高性能的多維數組對象和用於處理這些數組的工具。它是用於科學計算的基本Python軟體包。NumPy針對Python的CPython參考實現,這是一種非優化的字節碼解釋器。
  • 7款 Python 工具,讓你在工作上更佔優勢!
    想要成為一個程式設計師,除了學習各種教程之外,熟悉各種已經在生產環境中使用的工具會讓你更快的成長!這裡有7款python工具,是所有數據專家必不可少的工具。當你對他們有一定了解後,會成為你找工作的絕對優勢!
  • Python,爬蟲開發的不二選擇
    1)用途: 機器學習中的神經網絡、大型遊戲編程、後臺服務、桌面軟體等2)優勢:運行效率高、安全、面向對象、簡潔、可重用性好等3)缺點:沒有垃圾回收機制,可能引起內存設漏; 學習難度大,開發效率相對較低;通過在GitHub上搜索」爬蟲」,我們可以發現,目前市面上的開源爬蟲項目,Python佔百分八十的份額。
  • 一文學會在Python中利用過濾器方法進行深度學習特徵選擇
    機器學習算法的訓練時間和性能在很大程度上取決於數據集中的特徵。理想情況下,我們應該只在數據集中保留那些實際上有助於我們的機器學習模型學習的東西。不必要的冗餘特徵不僅減慢了算法的訓練時間,而且還影響了算法的性能。選擇用於訓練機器學習模型的最合適特徵的過程稱為「特徵選擇」。
  • 中科大統計學python_python 中科大 - CSDN
    python 模塊教程。另外,對於已經入門了的同學們, 這門課程也是一個提升自己應用機器學習的好地方, 因為裡面同時也介紹了很多種機器學習的技巧方法, 能大大幫助提升學習效果。畫圖工具;這門課程可以對比莫煩numpy & pandas & matplotlib同時來學。
  • 業界| 四大機器學習程式語言對比:R、Python、MATLAB、Octave
    MJ Bahmani 參與:張倩、路 本文作者是一位機器學習工程師,他比較了四種機器學習程式語言(工具):R、Python、MATLAB 和 OCTAVE。作者列出了這些語言(工具)的優缺點,希望對想開始學習它們的人有用。
  • 一文總結數據科學家常用的Python庫(下)
    它是開源的,每個人都可以訪問,並且可以在各種環境中重用。以下是安裝scikit-learn的代碼:pip install scikit-learnScikit-learn支持在機器學習中執行的不同操作,如分類,回歸,聚類,模型選擇等。