【轉(zhuǎn)】使用sklearn做單機(jī)特征工程

作者:jasonfreak挡逼,原文地址:使用sklearn做單機(jī)特征工程

目錄

    1. 特征工程是什么括改?
    1. 數(shù)據(jù)預(yù)處理
    • 2.1 無(wú)量綱化
      • 2.1.1 標(biāo)準(zhǔn)化
      • 2.1.2 區(qū)間縮放法
      • 2.1.3 無(wú)量綱化與正則化的區(qū)別
    • 2.2 對(duì)定量特征二值化
    • 2.3 對(duì)定性特征啞編碼
    • 2.4 缺失值計(jì)算
    • 2.5 數(shù)據(jù)變換
    • 2.6 回顧
  • 3 特征選擇
    • 3.1 Filter
      • 3.1.1 方差選擇法
      • 3.1.2 相關(guān)系數(shù)法
      • 3.1.3 卡方檢驗(yàn)
      • 3.1.4 互信息法
    • 3.2 Wrapper
      • 3.2.1 遞歸特征消除法
    • 3.3 Embedded
      • 3.3.1 基于懲罰項(xiàng)的特征選擇法
      • 3.3.2 基于樹模型的特征選擇法
    • 3.4 回顧
  • 4 降維
    • 4.1 主成分分析法(PCA)
    • 4.2 線性判別分析法(LDA)
    • 4.3 回顧
  • 5 總結(jié)
  • 6 參考資料

一、特征工程是什么家坎?

有這么一句話在業(yè)界廣泛流傳:數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限嘱能,而模型和算法只是逼近這個(gè)上限而已。那特征工程到底是什么呢虱疏?顧名思義惹骂,其本質(zhì)是一項(xiàng)工程活動(dòng),目的是最大限度地從原始數(shù)據(jù)中提取特征以供算法和模型使用做瞪。通過總結(jié)和歸納对粪,人們認(rèn)為特征工程包括以下方面:

特征處理是特征工程的核心部分,sklearn提供了較為完整的特征處理方法装蓬,包括數(shù)據(jù)預(yù)處理著拭,特征選擇,降維等牍帚。首次接觸到sklearn儡遮,通常會(huì)被其豐富且方便的算法模型庫(kù)吸引,但是這里介紹的特征處理庫(kù)也十分強(qiáng)大暗赶!

本文中使用sklearn中的IRIS(鳶尾花)數(shù)據(jù)集來對(duì)特征處理功能進(jìn)行說明鄙币。IRIS數(shù)據(jù)集由Fisher在1936年整理,包含4個(gè)特征:

  • Sepal.Length(花萼長(zhǎng)度)
  • Sepal.Width(花萼寬度)
  • Petal.Length(花瓣長(zhǎng)度)
  • Petal.Width(花瓣寬度)

特征值都為正浮點(diǎn)數(shù)蹂随,單位為厘米爱榔。目標(biāo)值為鳶尾花的分類(Iris Setosa(山鳶尾)、Iris Versicolour(雜色鳶尾)糙及,Iris Virginica(維吉尼亞鳶尾))详幽。導(dǎo)入IRIS數(shù)據(jù)集的代碼如下:

from sklearn.datasets import load_iris #導(dǎo)入IRIS數(shù)據(jù)集 
iris = load_iris() 
#特征矩陣 
iris.data 
#目標(biāo)向量 
iris.target

二、數(shù)據(jù)預(yù)處理

通過特征提取,我們能得到未經(jīng)處理的特征唇聘,這時(shí)的特征可能有以下問題:

  • 不屬于同一量綱:即特征的規(guī)格不一樣版姑,不能夠放在一起比較。無(wú)量綱化可以解決這一問題迟郎。

  • 信息冗余:對(duì)于某些定量特征剥险,其包含的有效信息為區(qū)間劃分,例如學(xué)習(xí)成績(jī)宪肖,假若只關(guān)心“及格”或不“及格”表制,那么需要將定量的考分筹误,轉(zhuǎn)換成“1”和“0”表示及格和未及格抑党。二值化可以解決這一問題。

  • 定性特征不能直接使用:某些機(jī)器學(xué)習(xí)算法和模型只能接受定量特征的輸入丽声,那么需要將定性特征轉(zhuǎn)換為定量特征蜕衡。最簡(jiǎn)單的方式是為每一種定性值指定一個(gè)定量值壤短,但是這種方式過于靈活,增加了調(diào)參的工作慨仿。通常使用啞編碼的方式將定性特征轉(zhuǎn)換為定量特征:假設(shè)有N種定性值久脯,則將這一個(gè)特征擴(kuò)展為N種特征,當(dāng)原始特征值為第i種定性值時(shí)镰吆,第i個(gè)擴(kuò)展特征賦值為1帘撰,其他擴(kuò)展特征賦值為0。啞編碼的方式相比直接指定的方式万皿,不用增加調(diào)參的工作摧找,對(duì)于線性模型來說,使用啞編碼后的特征可達(dá)到非線性的效果相寇。

  • 存在缺失值:缺失值需要補(bǔ)充慰于。

  • 信息利用率低:不同的機(jī)器學(xué)習(xí)算法和模型對(duì)數(shù)據(jù)中信息的利用是不同的钮科,之前提到在線性模型中唤衫,使用對(duì)定性特征啞編碼可以達(dá)到非線性的效果。類似地绵脯,對(duì)定量變量多項(xiàng)式化佳励,或者進(jìn)行其他的轉(zhuǎn)換,都能達(dá)到非線性的效果蛆挫。

我們使用sklearn中的preproccessing庫(kù)來進(jìn)行數(shù)據(jù)預(yù)處理赃承,可以覆蓋以上問題的解決方案。

2.1 無(wú)量綱化

無(wú)量綱化使不同規(guī)格的數(shù)據(jù)轉(zhuǎn)換到同一規(guī)格悴侵。常見的無(wú)量綱化方法有標(biāo)準(zhǔn)化和區(qū)間縮放法瞧剖。標(biāo)準(zhǔn)化的前提是特征值服從正態(tài)分布,標(biāo)準(zhǔn)化后,其轉(zhuǎn)換成標(biāo)準(zhǔn)正態(tài)分布抓于。區(qū)間縮放法利用了邊界值信息做粤,將特征的取值區(qū)間縮放到某個(gè)特點(diǎn)的范圍,例如[0, 1]等捉撮。

2.1.1 標(biāo)準(zhǔn)化

標(biāo)準(zhǔn)化需要計(jì)算特征的均值和標(biāo)準(zhǔn)差怕品,公式表達(dá)為:

使用preproccessing庫(kù)的StandardScaler類對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化的代碼如下:

from sklearn.preprocessing import StandardScaler 
#標(biāo)準(zhǔn)化,返回值為標(biāo)準(zhǔn)化后的數(shù)據(jù) 
StandardScaler().fit_transform(iris.data)

2.1.2 區(qū)間縮放法(極差歸一化)

區(qū)間縮放法的思路有多種巾遭,常見的一種為利用兩個(gè)最值進(jìn)行縮放肉康,公式表達(dá)為:

使用preproccessing庫(kù)的MinMaxScaler類對(duì)數(shù)據(jù)進(jìn)行區(qū)間縮放的代碼如下:

from sklearn.preprocessing import MinMaxScaler 
#區(qū)間縮放,返回值為縮放到[0, 1]區(qū)間的數(shù)據(jù) 
MinMaxScaler().fit_transform(iris.data)

2.1.3 無(wú)量綱化與正則化的區(qū)別

簡(jiǎn)單來說灼舍,無(wú)量綱化是依照特征矩陣的列處理數(shù)據(jù)吼和,正則化是依照特征矩陣的行處理數(shù)據(jù)。正則化的前提是樣本各特征值服從正態(tài)分布片仿,正則化后將其轉(zhuǎn)換成標(biāo)準(zhǔn)正態(tài)分布纹安。正則化的公式類似于標(biāo)準(zhǔn)化,不同的是樣本均值和樣本標(biāo)準(zhǔn)差改為特征值均值和特征值標(biāo)準(zhǔn)差砂豌。

使用preproccessing庫(kù)的Normalizer類對(duì)數(shù)據(jù)進(jìn)行正則化的代碼如下:

from sklearn.preprocessing import Normalizer 
#正則化厢岂,返回值為正則化后的數(shù)據(jù) 
Normalizer().fit_transform(iris.data)

2.2 對(duì)定量特征二值化

定量特征二值化的核心在于設(shè)定一個(gè)閾值,大于閾值的賦值為1阳距,小于等于閾值的賦值為0塔粒,公式表達(dá)如下:

使用preproccessing庫(kù)的Binarizer類對(duì)數(shù)據(jù)進(jìn)行二值化的代碼如下:

from sklearn.preprocessing import Binarizer 
#二值化,閾值設(shè)置為3筐摘,返回值為二值化后的數(shù)據(jù) 
Binarizer(threshold=3).fit_transform(iris.data)

2.3 對(duì)定性特征啞編碼

當(dāng)特征是因子變量時(shí)卒茬,我們需要對(duì)它們進(jìn)行編碼,如將年齡字段編碼為多個(gè)變量咖熟,是否是30歲以下圃酵、是否是30-50歲、是否是50歲以上等馍管。在這里有兩種方式郭赐,一種是啞變量,變成01數(shù)據(jù)确沸,一種是OneHot編碼捌锭,變成字節(jié)數(shù)據(jù),如第一類編碼為001罗捎,第二類編碼為010观谦,第三類編碼為100等。

使用preproccessing庫(kù)的OneHotEncoder類對(duì)數(shù)據(jù)進(jìn)行啞編碼的代碼如下:

from sklearn.preprocessing import OneHotEncoder 
#OneHot編碼桨菜,對(duì)IRIS數(shù)據(jù)集的目標(biāo)值豁状,返回值為編碼后的數(shù)據(jù) 
OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))
# 啞變量編碼
import pandas as pd
pd.get_dummies(iris.target,drop_first=True)

2.4 缺失值計(jì)算

由于IRIS數(shù)據(jù)集沒有缺失值捉偏,故對(duì)數(shù)據(jù)集新增一個(gè)樣本,4個(gè)特征均賦值為NaN泻红,表示數(shù)據(jù)缺失告私。

使用preproccessing庫(kù)的Imputer類對(duì)數(shù)據(jù)進(jìn)行缺失值計(jì)算的代碼如下:

from numpy import vstack, array, nan 
from sklearn.preprocessing import Imputer 
#缺失值計(jì)算,返回值為計(jì)算缺失值后的數(shù)據(jù) 
#參數(shù)missing_value為缺失值的表示形式承桥,默認(rèn)為NaN 
#參數(shù)strategy為缺失值填充方式驻粟,默認(rèn)為mean(均值) 
Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))

2.5 數(shù)據(jù)變換

常見的數(shù)據(jù)變換有基于多項(xiàng)式的、基于指數(shù)函數(shù)的凶异、基于對(duì)數(shù)函數(shù)的蜀撑。2個(gè)特征,度為2的多項(xiàng)式轉(zhuǎn)換公式如下:

使用preproccessing庫(kù)的PolynomialFeatures類對(duì)數(shù)據(jù)進(jìn)行多項(xiàng)式轉(zhuǎn)換的代碼如下:

from sklearn.preprocessing import PolynomialFeatures 
#多項(xiàng)式轉(zhuǎn)換 
#參數(shù)degree為度剩彬,默認(rèn)值為2 
PolynomialFeatures(degree=2).fit_transform(iris.data)

基于單變?cè)瘮?shù)的數(shù)據(jù)變換可以使用一個(gè)統(tǒng)一的方式完成酷麦,使用preproccessing庫(kù)的FunctionTransformer對(duì)數(shù)據(jù)進(jìn)行對(duì)數(shù)函數(shù)轉(zhuǎn)換的代碼如下:

from numpy import log1p 
from sklearn.preprocessing import FunctionTransformer 
#自定義轉(zhuǎn)換函數(shù)為對(duì)數(shù)函數(shù)的數(shù)據(jù)變換 
# log1p: log(1+x)
#第一個(gè)參數(shù)是單變?cè)瘮?shù) 
FunctionTransformer(log1p).fit_transform(iris.data)

2.6 回顧

功 能 說明
StandardScaler 無(wú)量綱化 標(biāo)準(zhǔn)化,基于特征矩陣的列喉恋,將特征值轉(zhuǎn)換至服從標(biāo)準(zhǔn)正態(tài)分布
MinMaxScaler 無(wú)量綱化 區(qū)間縮放沃饶,基于最大最小值,將特征值轉(zhuǎn)換到[0, 1]區(qū)間上
Normalizer 正則化 基于特征矩陣的行轻黑,將特征值轉(zhuǎn)換至服從標(biāo)準(zhǔn)正態(tài)分布
Binarizer 二值化 基于給定閾值糊肤,將定量特征按閾值劃分
OneHotEncoder 啞編碼 將定性數(shù)據(jù)編碼為定量數(shù)據(jù)
Imputer 缺失值計(jì)算 計(jì)算缺失值,缺失值可填充為均值等
PolynomialFeatures 多項(xiàng)式數(shù)據(jù)轉(zhuǎn)換 多項(xiàng)式數(shù)據(jù)轉(zhuǎn)換
FunctionTransformer 自定義單元數(shù)據(jù)轉(zhuǎn)換 使用單變?cè)暮瘮?shù)來轉(zhuǎn)換數(shù)據(jù)

三氓鄙、特征選擇

當(dāng)數(shù)據(jù)預(yù)處理完成后馆揉,我們需要選擇有意義的特征輸入機(jī)器學(xué)習(xí)的算法和模型進(jìn)行訓(xùn)練。通常來說抖拦,從兩個(gè)方面考慮來選擇特征:

特征是否發(fā)散:如果一個(gè)特征不發(fā)散升酣,例如方差接近于0,也就是說樣本在這個(gè)特征上基本上沒有差異态罪,這個(gè)特征對(duì)于樣本的區(qū)分并沒有什么用噩茄。
特征與目標(biāo)的相關(guān)性:這點(diǎn)比較顯見,與目標(biāo)相關(guān)性高的特征复颈,應(yīng)當(dāng)優(yōu)選選擇绩聘。除方差法外,本文介紹的其他方法均從相關(guān)性考慮券膀。

根據(jù)特征選擇的形式又可以將特征選擇方法分為3種:

  • Filter:過濾法君纫,按照發(fā)散性或者相關(guān)性對(duì)各個(gè)特征進(jìn)行評(píng)分驯遇,設(shè)定閾值或者待選擇閾值的個(gè)數(shù)芹彬,選擇特征。
  • Wrapper:包裝法叉庐,根據(jù)目標(biāo)函數(shù)(通常是預(yù)測(cè)效果評(píng)分)舒帮,每次選擇若干特征,或者排除若干特征。
  • Embedded:集成法玩郊,先使用某些機(jī)器學(xué)習(xí)的算法和模型進(jìn)行訓(xùn)練肢执,得到各個(gè)特征的權(quán)值系數(shù),根據(jù)系數(shù)從大到小選擇特征译红。類似于Filter方法预茄,但是是通過訓(xùn)練來確定特征的優(yōu)劣。

我們使用sklearn中的feature_selection庫(kù)來進(jìn)行特征選擇侦厚。

3.1 Filter

3.1.1 方差選擇法

使用方差選擇法耻陕,先要計(jì)算各個(gè)特征的方差,然后根據(jù)閾值刨沦,選擇方差大于閾值的特征诗宣。
使用feature_selection庫(kù)的VarianceThreshold類來選擇特征的代碼如下:

from sklearn.feature_selection import VarianceThreshold 
#方差選擇法,返回值為特征選擇后的數(shù)據(jù) 
#參數(shù)threshold為方差的閾值 
VarianceThreshold(threshold=3).fit_transform(iris.data)

3.1.2 相關(guān)系數(shù)法

使用相關(guān)系數(shù)法想诅,先要計(jì)算各個(gè)特征對(duì)目標(biāo)值的相關(guān)系數(shù)以及相關(guān)系數(shù)的P值召庞。

用feature_selection庫(kù)的SelectKBest類結(jié)合相關(guān)系數(shù)來選擇特征的代碼如下:

from sklearn.feature_selection import SelectKBest 
from scipy.stats import pearsonr 
#選擇K個(gè)最好的特征,返回選擇特征后的數(shù)據(jù) 
#第一個(gè)參數(shù)為計(jì)算評(píng)估特征是否好的函數(shù)来破,該函數(shù)輸入特征矩陣和目標(biāo)向量篮灼,輸出二元組(評(píng)分,P值)的數(shù)組徘禁,數(shù)組第i項(xiàng)為第i個(gè)特征的評(píng)分和P值穿稳。在此定義為計(jì)算相關(guān)系數(shù) #參數(shù)k為選擇的特征個(gè)數(shù)
SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

3.1.3 卡方檢驗(yàn)

經(jīng)典的卡方檢驗(yàn)是檢驗(yàn)定性自變量對(duì)定性因變量的相關(guān)性。假設(shè)自變量有N種取值晌坤,因變量有M種取值逢艘,考慮自變量等于i且因變量等于j的樣本頻數(shù)的觀察值與期望的差距,構(gòu)建統(tǒng)計(jì)量:

這個(gè)統(tǒng)計(jì)量的含義簡(jiǎn)而言之就是自變量對(duì)因變量的相關(guān)性骤菠。用feature_selection庫(kù)的SelectKBest類結(jié)合卡方檢驗(yàn)來選擇特征的代碼如下:

from sklearn.feature_selection import SelectKBest 
from sklearn.feature_selection import chi2 
#選擇K個(gè)最好的特征它改,返回選擇特征后的數(shù)據(jù) 
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

3.1.4 互信息法

經(jīng)典的互信息也是評(píng)價(jià)定性自變量對(duì)定性因變量的相關(guān)性的,互信息計(jì)算公式如下:

為了處理定量數(shù)據(jù)商乎,最大信息系數(shù)法被提出央拖,使用feature_selection
庫(kù)的SelectKBest類結(jié)合最大信息系數(shù)法來選擇特征的代碼如下:

from sklearn.feature_selection import SelectKBest 
from minepy import MINE 
'''
由于MINE的設(shè)計(jì)不是函數(shù)式的,定義mic方法將其為函數(shù)式的鹉戚,
返回一個(gè)二元組鲜戒,二元組的第2項(xiàng)設(shè)置成固定的P值0.5 
'''
def mic(x, y): 
    m = MINE() 
    m.compute_score(x, y) 
    return (m.mic(), 0.5) 
#選擇K個(gè)最好的特征,返回特征選擇后的數(shù)據(jù) 
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2)\
.fit_transform(iris.data, iris.target)

3.2 Wrapper

3.2.1 遞歸特征消除法

遞歸消除特征法使用一個(gè)基模型來進(jìn)行多輪訓(xùn)練抹凳,每輪訓(xùn)練后遏餐,消除若干權(quán)值系數(shù)的特征,再基于新的特征集進(jìn)行下一輪訓(xùn)練赢底。使用feature_selection庫(kù)的RFE類來選擇特征的代碼如下:

from sklearn.feature_selection import RFE 
from sklearn.linear_model import LogisticRegression 
#遞歸特征消除法失都,返回特征選擇后的數(shù)據(jù) 
#參數(shù)estimator為基模型 
#參數(shù)n_features_to_select為選擇的特征個(gè)數(shù) 
RFE(estimator=LogisticRegression(), n_features_to_select=2)\
.fit_transform(iris.data, iris.target)

3.3 Embedded

3.3.1 基于懲罰項(xiàng)的特征選擇法

使用帶懲罰項(xiàng)的基模型柏蘑,除了篩選出特征外,同時(shí)也進(jìn)行了降維粹庞。使用feature_selection庫(kù)的SelectFromModel類結(jié)合帶L1懲罰項(xiàng)的邏輯回歸模型咳焚,來選擇特征的代碼如下:

from sklearn.feature_selection import SelectFromModel 
from sklearn.linear_model import LogisticRegression 
#帶L1懲罰項(xiàng)的邏輯回歸作為基模型的特征選擇 
SelectFromModel(LogisticRegression(penalty="l1", C=0.1))\
.fit_transform(iris.data, iris.target)

L1懲罰項(xiàng)降維的原理在于保留多個(gè)對(duì)目標(biāo)值具有同等相關(guān)性的特征中的一個(gè),所以沒選到的特征不代表不重要庞溜。故革半,可結(jié)合L2懲罰項(xiàng)來優(yōu)化。具體操作為:若一個(gè)特征在L1中的權(quán)值為1流码,選擇在L2中權(quán)值差別不大且在L1中權(quán)值為0的特征構(gòu)成同類集合督惰,將這一集合中的特征平分L1中的權(quán)值,故需要構(gòu)建一個(gè)新的邏輯回歸模型:

from sklearn.linear_model import LogisticRegression 
 
class LR(LogisticRegression): 
    def __init__(self, threshold=0.01, dual=False, tol=1e-4, C=1.0, 
                 fit_intercept=True, intercept_scaling=1, class_weight=None, 
                 random_state=None, solver='liblinear', max_iter=100, 
                 multi_class='ovr', verbose=0, warm_start=False, n_jobs=1): 
 
        #權(quán)值相近的閾值 
        self.threshold = threshold 
        LogisticRegression.__init__(self, penalty='l1', dual=dual, tol=tol, C=C, 
                 fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight=class_weight, 
                 random_state=random_state, solver=solver, max_iter=max_iter, 
                 multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs) 
        #使用同樣的參數(shù)創(chuàng)建L2邏輯回歸 
        self.l2 = LogisticRegression(penalty='l2', dual=dual, tol=tol, C=C, fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight = class_weight, random_state=random_state, solver=solver, max_iter=max_iter, multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs) 
 
    def fit(self, X, y, sample_weight=None): 
        #訓(xùn)練L1邏輯回歸 
        super(LR, self).fit(X, y, sample_weight=sample_weight) 
        self.coef_old_ = self.coef_.copy() 
        #訓(xùn)練L2邏輯回歸 
        self.l2.fit(X, y, sample_weight=sample_weight) 
 
        cntOfRow, cntOfCol = self.coef_.shape 
        #權(quán)值系數(shù)矩陣的行數(shù)對(duì)應(yīng)目標(biāo)值的種類數(shù)目 
        for i in range(cntOfRow): 
            for j in range(cntOfCol): 
                coef = self.coef_[i][j] 
                #L1邏輯回歸的權(quán)值系數(shù)不為0 
                if coef != 0: 
                    idx = [j] 
                    #對(duì)應(yīng)在L2邏輯回歸中的權(quán)值系數(shù) 
                    coef1 = self.l2.coef_[i][j] 
                    for k in range(cntOfCol): 
                        coef2 = self.l2.coef_[i][k] 
                        #在L2邏輯回歸中旅掂,權(quán)值系數(shù)之差小于設(shè)定的閾值赏胚,且在L1中對(duì)應(yīng)的權(quán)值為0 
                        if abs(coef1-coef2) < self.threshold and j != k and self.coef_[i][k] == 0: 
                            idx.append(k) 
                    #計(jì)算這一類特征的權(quán)值系數(shù)均值 
                    mean = coef / len(idx) 
                    self.coef_[i][idx] = mean 
        return self 

使用feature_selection庫(kù)的SelectFromModel類結(jié)合帶L1以及L2懲罰項(xiàng)的邏輯回歸模型,來選擇特征的代碼如下:

from sklearn.feature_selection import SelectFromModel 
#帶L1和L2懲罰項(xiàng)的邏輯回歸作為基模型的特征選擇 
#參數(shù)threshold為權(quán)值系數(shù)之差的閾值 
SelectFromModel(LR(threshold=0.5, C=0.1))\
.fit_transform(iris.data, iris.target)

3.3.2 基于樹模型的特征選擇法

樹模型中GBDT也可用來作為基模型進(jìn)行特征選擇商虐,使用feature_selection
庫(kù)的SelectFromModel類結(jié)合GBDT模型觉阅,來選擇特征的代碼如下:

from sklearn.feature_selection import SelectFromModel 
from sklearn.ensemble import GradientBoostingClassifier 
#GBDT作為基模型的特征選擇 
SelectFromModel(GradientBoostingClassifier())\
.fit_transform(iris.data, iris.target)

3.4 回顧

所屬方式 說明
VarianceThreshold Filter 方差選擇法
SelectKBest Filter 可選關(guān)聯(lián)系數(shù)、卡方校驗(yàn)秘车、最大信息系數(shù)作為得分計(jì)算的方法
RFE Wrapper 遞歸地訓(xùn)練基模型典勇,將權(quán)值系數(shù)較小的特征從特征集合中消除
SelectFromModel Embedded 訓(xùn)練基模型,選擇權(quán)值系數(shù)較高的特征

四叮趴、降維

當(dāng)特征選擇完成后割笙,可以直接訓(xùn)練模型了,但是可能由于特征矩陣過大眯亦,導(dǎo)致計(jì)算量大伤溉,訓(xùn)練時(shí)間長(zhǎng)的問題,因此降低特征矩陣維度也是必不可少的妻率。常見的降維方法除了以上提到的基于L1懲罰項(xiàng)的模型以外乱顾,另外還有主成分分析法(PCA)和線性判別分析(LDA),線性判別分析本身也是一個(gè)分類模型宫静。PCA和LDA有很多的相似點(diǎn)走净,其本質(zhì)是要將原始的樣本映射到維度更低的樣本空間中,但是PCA和LDA的映射目標(biāo)不一樣:

  • PCA是為了讓映射后的樣本具有最大的發(fā)散性孤里;
  • LDA是為了讓映射后的樣本有最好的分類性能伏伯。

所以說PCA是一種無(wú)監(jiān)督的降維方法,而LDA是一種有監(jiān)督的降維方法捌袜。

4.1 主成分分析法(PCA)

使用decomposition庫(kù)的PCA類選擇特征的代碼如下:

from sklearn.decomposition import PCA 
#主成分分析法说搅,返回降維后的數(shù)據(jù) 
#參數(shù)n_components為主成分?jǐn)?shù)目 
PCA(n_components=2).fit_transform(iris.data)

4.2 線性判別分析法(LDA)

使用lda庫(kù)的LDA類選擇特征的代碼如下:

from sklearn.lda import LDA 
#線性判別分析法,返回降維后的數(shù)據(jù) 
#參數(shù)n_components為降維后的維數(shù) 
LDA(n_components=2).fit_transform(iris.data, iris.target)

4.3 回顧

庫(kù) 說明
decomposition PCA 主成分分析法
lda LDA 線性判別分析法

五琢蛤、總結(jié)

再讓我們回歸一下本文開始的特征工程的思維導(dǎo)圖蜓堕,我們可以使用sklearn完成幾乎所有特征處理的工作,而且不管是數(shù)據(jù)預(yù)處理博其,還是特征選擇套才,抑或降維,它們都是通過某個(gè)類的方法fit_transform完成的慕淡,fit_transform要不只帶一個(gè)參數(shù):特征矩陣背伴,要不帶兩個(gè)參數(shù):特征矩陣加目標(biāo)向量。這些難道都是巧合嗎峰髓?還是故意設(shè)計(jì)成這樣傻寂?方法fit_transform中有fit這一單詞,它和訓(xùn)練模型的fit方法有關(guān)聯(lián)嗎携兵?接下來疾掰,我將在《使用sklearn優(yōu)雅地進(jìn)行數(shù)據(jù)挖掘》中闡述其中的奧妙!

作者其他文章

[1]. 使用Python進(jìn)行描述性統(tǒng)計(jì)
[2]. 使用sklearn做單機(jī)特征工程
[3]. 使用sklearn優(yōu)雅地進(jìn)行數(shù)據(jù)挖掘
[4]. 關(guān)于線性模型你可能還不知道的二三事(一徐紧、樣本)
[5]. 關(guān)于線性模型你可能還不知道的二三事(二静檬、也談民主)
[6]. 關(guān)于線性模型你可能還不知道的二三事(三、特征值與奇異值的魔力)
[7]. 誰(shuí)動(dòng)了我的特征并级?——sklearn特征轉(zhuǎn)換行為全記錄
[8]. 使用sklearn進(jìn)行集成學(xué)習(xí)——理論
[9]. 使用sklearn進(jìn)行集成學(xué)習(xí)——實(shí)踐

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拂檩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嘲碧,更是在濱河造成了極大的恐慌稻励,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愈涩,死亡現(xiàn)場(chǎng)離奇詭異望抽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)履婉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門糠聪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谐鼎,你說我怎么就攤上這事舰蟆。” “怎么了狸棍?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵身害,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我草戈,道長(zhǎng)塌鸯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任唐片,我火速辦了婚禮丙猬,結(jié)果婚禮上涨颜,老公的妹妹穿的比我還像新娘。我一直安慰自己茧球,他們只是感情好庭瑰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抢埋,像睡著了一般弹灭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上揪垄,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天穷吮,我揣著相機(jī)與錄音,去河邊找鬼饥努。 笑死捡鱼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酷愧。 我是一名探鬼主播堰汉,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伟墙!你這毒婦竟也來了翘鸭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤戳葵,失蹤者是張志新(化名)和其女友劉穎就乓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拱烁,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡生蚁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戏自。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邦投。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖擅笔,靈堂內(nèi)的尸體忽然破棺而出志衣,到底是詐尸還是另有隱情,我是刑警寧澤猛们,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布念脯,位于F島的核電站,受9級(jí)特大地震影響弯淘,放射性物質(zhì)發(fā)生泄漏绿店。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望假勿。 院中可真熱鬧借嗽,春花似錦、人聲如沸转培。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)堡距。三九已至甲锡,卻和暖如春兆蕉,著一層夾襖步出監(jiān)牢的瞬間羽戒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工虎韵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留易稠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓包蓝,卻偏偏與公主長(zhǎng)得像驶社,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子测萎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容