Python之特徵選擇實戰

2021-02-20 數據科學與人工智慧

1 特徵工程是什麼?

  有這麼一句話在業界廣泛流傳:數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已。那特徵工程到底是什麼呢?顧名思義,其本質是一項工程活動,目的是最大限度地從原始數據中提取特徵以供算法和模型使用。通過總結和歸納,人們認為特徵工程包括以下方面:

  特徵處理是特徵工程的核心部分,sklearn提供了較為完整的特徵處理方法,包括數據預處理,特徵選擇,降維等。首次接觸到sklearn,通常會被其豐富且方便的算法模型庫吸引,但是這裡介紹的特徵處理庫也十分強大!

  本文中使用sklearn中的IRIS(鳶尾花)數據集來對特徵處理功能進行說明。IRIS數據集由Fisher在1936年整理,包含4個特徵(Sepal.Length(花萼長度)、Sepal.Width(花萼寬度)、Petal.Length(花瓣長度)、Petal.Width(花瓣寬度)),特徵值都為正浮點數,單位為釐米。目標值為鳶尾花的分類(Iris Setosa(山鳶尾)、Iris Versicolour(雜色鳶尾),Iris Virginica(維吉尼亞鳶尾))。導入IRIS數據集的代碼如下:

from sklearn.datasets import load_iris
 
#導入IRIS數據集
iris = load_iris()

#特徵矩陣
iris.data

#目標向量
iris.target

       

2 數據預處理

  通過特徵提取,我們能得到未經處理的特徵,這時的特徵可能有以下問題:

不屬於同一量綱:即特徵的規格不一樣,不能夠放在一起比較。無量綱化可以解決這一問題。

信息冗餘:對於某些定量特徵,其包含的有效信息為區間劃分,例如學習成績,假若只關心「及格」或不「及格」,那麼需要將定量的考分,轉換成「1」和「0」表示及格和未及格。二值化可以解決這一問題。

定性特徵不能直接使用:某些機器學習算法和模型只能接受定量特徵的輸入,那麼需要將定性特徵轉換為定量特徵。最簡單的方式是為每一種定性值指定一個定量值,但是這種方式過於靈活,增加了調參的工作。通常使用啞編碼的方式將定性特徵轉換為定量特徵:假設有N種定性值,則將這一個特徵擴展為N種特徵,當原始特徵值為第i種定性值時,第i個擴展特徵賦值為1,其他擴展特徵賦值為0。啞編碼的方式相比直接指定的方式,不用增加調參的工作,對於線性模型來說,使用啞編碼後的特徵可達到非線性的效果。

存在缺失值:缺失值需要補充。

信息利用率低:不同的機器學習算法和模型對數據中信息的利用是不同的,之前提到在線性模型中,使用對定性特徵啞編碼可以達到非線性的效果。類似地,對定量變量多項式化,或者進行其他的轉換,都能達到非線性的效果。

  我們使用sklearn中的preproccessing庫來進行數據預處理,可以覆蓋以上問題的解決方案。

2.1 無量綱化

  無量綱化使不同規格的數據轉換到同一規格。常見的無量綱化方法有標準化和區間縮放法。標準化的前提是特徵值服從正態分布,標準化後,其轉換成標準正態分布。區間縮放法利用了邊界值信息,將特徵的取值區間縮放到某個特點的範圍,例如[0, 1]等。

2.1.1 標準化

  標準化需要計算特徵的均值和標準差,公式表達為:

  使用preproccessing庫的StandardScaler類對數據進行標準化的代碼如下:

from sklearn.preprocessing import StandardScaler
 
#標準化,返回值為標準化後的數據
StandardScaler().fit_transform(iris.data)

       

2.1.2 區間縮放法

  區間縮放法的思路有多種,常見的一種為利用兩個最值進行縮放,公式表達為:

  使用preproccessing庫的MinMaxScaler類對數據進行區間縮放的代碼如下:

from sklearn.preprocessing import MinMaxScaler

#區間縮放,返回值為縮放到[0, 1]區間的數據
MinMaxScaler().fit_transform(iris.data)
       

2.1.3 標準化與歸一化的區別

  簡單來說,標準化是依照特徵矩陣的列處理數據,其通過求z-score的方法,將樣本的特徵值轉換到同一量綱下。歸一化是依照特徵矩陣的行處理數據,其目的在於樣本向量在點乘運算或其他核函數計算相似性時,擁有統一的標準,也就是說都轉化為「單位向量」。規則為l2的歸一化公式如下:

  使用preproccessing庫的Normalizer類對數據進行歸一化的代碼如下:

from sklearn.preprocessing import Normalizer

#歸一化,返回值為歸一化後的數據
Normalizer().fit_transform(iris.data)
       

2.2 對定量特徵二值化

  定量特徵二值化的核心在於設定一個閾值,大於閾值的賦值為1,小於等於閾值的賦值為0,公式表達如下:

  使用preproccessing庫的Binarizer類對數據進行二值化的代碼如下:

from sklearn.preprocessing import Binarizer

#二值化,閾值設置為3,返回值為二值化後的數據
Binarizer(threshold=3).fit_transform(iris.data)
       

2.3 對定性特徵啞編碼

  由於IRIS數據集的特徵皆為定量特徵,故使用其目標值進行啞編碼(實際上是不需要的)。使用preproccessing庫的OneHotEncoder類對數據進行啞編碼的代碼如下:

from sklearn.preprocessing import OneHotEncoder

#啞編碼,對IRIS數據集的目標值,返回值為啞編碼後的數據
OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))

2.4 缺失值計算

  由於IRIS數據集沒有缺失值,故對數據集新增一個樣本,4個特徵均賦值為NaN,表示數據缺失。使用preproccessing庫的Imputer類對數據進行缺失值計算的代碼如下:

from numpy import vstack, array, nan
from sklearn.preprocessing import Imputer

#缺失值計算,返回值為計算缺失值後的數據
#參數missing_value為缺失值的表示形式,默認為NaN
#參數strategy為缺失值填充方式,默認為mean(均值)
Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))

2.5 數據變換

  常見的數據變換有基於多項式的、基於指數函數的、基於對數函數的。4個特徵,度為2的多項式轉換公式如下:

  使用preproccessing庫的PolynomialFeatures類對數據進行多項式轉換的代碼如下:

from sklearn.preprocessing import PolynomialFeatures

#多項式轉換
#參數degree為度,默認值為2
PolynomialFeatures().fit_transform(iris.data)

基於單變元函數的數據變換可以使用一個統一的方式完成,使用preproccessing庫的FunctionTransformer對數據進行對數函數轉換的代碼如下:

from numpy import log1p
from sklearn.preprocessing import FunctionTransformer

#自定義轉換函數為對數函數的數據變換
#第一個參數是單變元函數
FunctionTransformer(log1p).fit_transform(iris.data)

《數據科學與人工智慧》公眾號推薦朋友們學習和使用Python語言,需要加入Python語言群的,請掃碼加我個人微信,備註【姓名-Python群】,我誠邀你入群,大家學習和分享。

相關焦點

  • 機器學習實戰-特徵選擇之遞歸特徵消除
    機器學習實戰-特徵選擇之嵌入法機器學習裡面,我們梳理了過濾法我們研究sklearn官方,它給出了一定的說明:針對哪些特徵含有權重的預測模型,RFE通過遞歸的方式,不斷減少特徵集的規模來選擇需要的特徵。第一:給每一個特徵指定一個權重,接著採用預測模型在這些原始的特徵上進行訓練。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐
  • python人工智慧項目實戰,PDF+源碼
    《Python AI項目實戰  Practical Python AI Projects》使用優化建模探索使用PythonAI項目體驗地址 https://loveai.tech閱讀過本文的人還看了以下:分享《深度學習入門:基於Python的理論與實現》高清中文版PDF+原始碼《21個項目玩轉深度學習:基於TensorFlow的實踐詳解》完整版PDF+附書代碼《深度學習之pytorch
  • 特徵工程總結:R與python的比較實現
    特徵選擇的主要方法和python與R的比較實現目錄1.特徵工程概述2.特徵工程知識框架3.特徵工程的一般步驟4.特徵選擇的python與R實現比較4.1 導入數據4.2 數據預處理4.2.1 標準化4.2.2 區間放縮法  4.2.3 歸一化  4.2.4 對定量特徵二值化
  • 基於python的大數據分析-pandas數據讀取(代碼實戰)
    書籍推薦《大話軟體測試》出版啦,內容包括但不限於性能、自動化、接口、安全、移動APP非功能測試、抓包、loadrunner、jmeter、soapui、Appium、python
  • 機器學習筆記——機器學習實戰之準備(一)
    無監督學習可以減少數據特徵的維度,使我們用二維圖或三維圖更加直觀地展示數據信息。聚類:數據集合分成類似的對象組成多個類的過程。密度估計:尋找描述數據統計值的過程。1.4 如何選擇合適的算法先考慮兩個問題:我們只能一定程度上縮小算法的選擇範圍,一般不存在最好的算法或給出最好結果的算法,同時還要嘗試不同算法的執行效果。
  • 算法基礎:五大排序算法Python實戰教程
    | George Seif翻譯 | 鄧普斯傑弗校對 | shunshun 整理 | 菠蘿妹原文連結:https://medium.com/@george.seif94/a-tour-of-the-top-5-sorting-algorithms-with-python-code
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • Python機器學習實戰 —— KNN算法詳解
    這個系列按照機器學習實戰的章節來寫,由於市面上已經有很多同類的文章,一般以介紹算法,貼代碼,舉例子為主,個人讀下來,覺得對於實現的代碼還是不能有很好的理解,所有有了這個系列。它的的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。K通常是不大於20的整數。KNN算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
  • 超適合Python小白的乾貨,Python數據分析50個實戰項目
    2.大話NBA | 用數據帶你回顧喬丹的職業生涯3.分析幾十萬條知乎數據,我挖掘出了這些秘密4.用(大)數據全方位解讀電視劇《大秦帝國之崛起》5.以虎嗅網4W+文章的文本挖掘為例,展現數據分析的一整套流程6.從大數據輿情傳播角度看《三生三世十裡桃花》7.北京二手房房價分析8.kaggle數據分析實踐項目練習
  • 給妹子講python-S01E17函數的基本特徵
    作者:醬油哥/ 清華程序猿       微信公眾號: python數據科學家 知乎專欄: 《給妹子講python》https://
  • 「python opencv 計算機視覺零基礎實戰」第一節
    前置條件說明:本系列opencv實戰教程將從基礎到實戰,若只是簡單學習完python也可以通過該教程完成一般的機器學習編程;文中將會對很多python的基礎內容進行講解,但由於文章定位的原因將不會贅述過多的基礎內容,基礎內容進行第一次講解後第二次將不會過多贅述,本文主要講解的是opencv相關知識。
  • 如何爬取全網1200本Python書|爬蟲實戰篇
    這是菜鳥學Python
  • Python代碼審計實戰案例總結之CRLF和任意文件讀取
    CRLF和任意文件讀取的審計實戰CRLF 審計實戰CRLF的問題經常會出現在Python的模塊之中,曾經有案例說明httplib模塊、urllib模塊等存在CRLF問題。問題來源於模塊對於\x0d\x0a(\r\n)處理並不嚴格。如果該問題被有效利用,可能會導致 Memcached和Redis 等緩存應用出現問題,嚴重可獲得shell。
  • 第113天: Python XGBoost 算法項目實戰
    這一篇最適合剛剛接觸XGBoost的人閱讀,通過一個實戰項目拆解整個XGBoost算法。pc_ex/AdaBoost_PeiLv/FBP_train.csv' testFilePath = 'E:/PythonLearn/pc_ex/AdaBoost_PeiLv/FBP_predict.csv' data = pd.read_csv(trainFilePath) X_test= pd.read_csv(testFilePath)###############第二處調參:選擇全部特徵還是部分特徵
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 開課吧Python培訓的怎麼樣?如何選擇Python培訓機構?
    開課吧整合全球知名IT和網際網路企業一線師資及實戰項目,面向廣大數位化專業和應用人才,提供Java、Web前端、數據分析、Python、人工智慧、產品、設計、運營、智能物聯等熱門學科的體系化在線實戰賦能和進階課程。
  • 資源 | 一個Python特徵選擇工具,助力實現高效機器學習
    類,幫助研究者更高效地完成特徵選擇。項目地址:https://github.com/WillKoehrsen/feature-selector特徵選擇(feature selection)是查找和選擇數據集中最有用特徵的過程,是機器學習流程中的一大關鍵步驟。不必要的特徵會降低訓練速度、降低模型可解釋性,並且最重要的是還會降低其在測試集上的泛化表現。
  • python教程實戰,json、csv等讀寫
    python教程實戰,json、csv等讀寫JSON的全稱是」JavaScript Object Notation」,意思是JavaScript
  • 實戰 | UI 調度自動化測試平臺(基於 Python)
    測試開發之 UI 自動化測試平臺最佳實踐,進階學習文末加群!