資料建模 機器學習之如何進行特徵工程(上)

2021-10-23 13:21:13 字數 4674 閱讀 5279

1 特徵選擇

當資料預處理完成後,我們需要選擇有意義的特徵輸入機器學習的演算法和模型進行訓練。通常來說,從兩個方面考慮來選擇特徵:

特徵是否發散:如果乙個特徵不發散,例如方差接近於0,也就是說樣本在這個特徵上基本上沒有差異,這個特徵對於樣本的區分並沒有什麼用。

根據特徵選擇的形式又可以將特徵選擇方法分為3種:

embedded:嵌入法,先使用某些機器學習的演算法和模型進行訓練,得到各個特徵的權值係數,根據係數從大到小選擇特徵。類似於filter方法,但是是通過訓練來確定特徵的優劣。

我們使用sklearn中的feature_selection庫來進行特徵選擇。

1.1 filter

1.1.1 方差選擇法

使用方差選擇法,先要計算各個特徵的方差,然後根據閾值,選擇方差大於閾值的特徵。使用feature_selection庫的variancethreshold類來選擇特徵的**如下:

from sklearn.feature_selection import variancethreshold

#方差選擇法,返回值為特徵選擇後的資料

#引數threshold為方差的閾值

variancethreshold(threshold=3).fit_transform(iris.data)

單變數特徵選擇的原理是分別單獨的計算每個變數的某個統計指標,根據該指標來判斷哪些指標重要,剔除那些不重要的指標。

對於分類問題(y離散),可採用:卡方檢驗,f_classif, *mutual_info_classif,互資訊對於回歸問題(y連續),可採用:皮爾森相關係數,f_regression, *mutual_info_regression,最大資訊係數

1.1.2 相關係數法

使用相關係數法,先要計算各個特徵對目標值的相關係數以及相關係數的p值。pearson相關係數的乙個明顯缺陷是,作為特徵排序機制,他只對線性關係敏感。如果關係是非線性的,即便兩個變數具有一一對應的關係,pearson相關性也可能會接近0。用feature_selection庫的selectkbest類結合相關係數來選擇特徵的**如下:

from sklearn.feature_selection import selectkbest

from scipy.stats import pearsonr

#選擇k個最好的特徵,返回選擇特徵後的資料

#第乙個引數為計算評估特徵是否好的函式,該函式輸入特徵矩陣和目標向量,輸出二元組(評分,p值)的陣列,陣列第i項為第i個特徵的評分和p值。在此定義為計算相關係數

#引數k為選擇的特徵個數

selectkbest(lambda x, y: array(map(lambda x:pearsonr(x, y), x.t)).t,k=2).fit_transform(iris.data, iris.target)

1.1.3 卡方檢驗

卡方檢驗的樣本量要求:卡方分布本身是連續型分布,但是在分類資料的統計分析中,顯然頻數只能以整數形式出現,因此計算出的統計量是非連續的。只有當樣本量比較充足時,才可以忽略兩者問的差異,否則將可能導致較大的偏差具體而言,一般認為對於卡方檢驗中的每乙個單元格,要求其最小期望頻數均大於1,且至少有4/5的單元格期望頻數大於5,此時使用卡方分布計算出的概率值才是準確的。如果資料不符合要求,可以採用確切概率法進行概率的計算。經典的卡方檢驗是檢驗定性自變數對定性因變數的相關性。用feature_selection庫的selectkbest類結合卡方檢驗來選擇特徵的**如下:

from sklearn.feature_selection import selectkbest

from sklearn.feature_selection import chi2

#選擇k個最好的特徵,返回選擇特徵後的資料

selectkbest(chi2, k=2).fit_transform(iris.data, iris.target)

1.1.4 互資訊法

互資訊指的是兩個隨機變數之間的關聯程度,即給定乙個隨機變數後,另乙個隨機變數不確定性的削弱程度,因而互資訊取值最小為0,意味著給定乙個隨機變數對確定一另乙個隨機變數沒有關係,最大取值為隨機變數的熵,意味著給定乙個隨機變數,能完全消除另乙個隨機變數的不確定性。為了處理定量資料,最大資訊係數法被提出,使用feature_selection庫的selectkbest類結合最大資訊係數法來選擇特徵的**如下:

from sklearn.feature_selection import selectkbest

from minepy import mine

#由於mine的設計不是函式式的,定義mic方法將其為函式式的,返回乙個二元組,二元組的第2項設定成固定的p值0.5

def mic(x, y):

m = mine()

m.compute_score(x, y)

return (m.mic(), 0.5)

#選擇k個最好的特徵,返回特徵選擇後的資料

selectkbest(lambda x, y: array(map(lambda x:mic(x, y), x.t)).t, k=2).fit_transform(iris.data, iris.target)

互資訊直接用於特徵選擇其實不是太方便:1、它不屬於度量方式,也沒有辦法歸一化,在不同資料及上的結果無法做比較;2、對於連續變數的計算不是很方便(x和y都是集合,x,y都是離散的取值),通常變數需要先離散化,而互資訊的結果對離散化的方式很敏感。最大資訊係數克服了這兩個問題。它首先尋找一種最優的離散化方式,然後把互資訊取值轉換成一種度量方式,取值區間在[0,1]。minepy 提供了mic功能。

1.2.1 遞迴特徵消除法

遞迴消除特徵法使用乙個基模型來進行多輪訓練,每輪訓練後,移除若干權值係數的特徵,再基於新的特徵集進行下一輪訓練。

sklearn官方解釋:對特徵含有權重的**模型(例如,線性模型對應引數coefficients),rfe通過遞迴減少考察的特徵集規模來選擇特徵。首先,**模型在原始特徵上訓練,每個特徵指定乙個權重。之後,那些擁有最小絕對值權重的特徵被踢出特徵集。如此往復遞迴,直至剩餘的特徵數量達到所需的特徵數量。

rfecv 通過交叉驗證的方式執行rfe,以此來選擇最佳數量的特徵:對於乙個數量為d的feature的集合,他的所有的子集的個數是2的d次方減1(包含空集)。指定乙個外部的學習演算法,比如svm之類的。通過該演算法計算所有子集的validation error。選擇error最小的那個子集作為所挑選的特徵。

from sklearn.feature_selection import rfe

from sklearn.linear_model import logisticregression

#遞迴特徵消除法,返回特徵選擇後的資料

#引數estimator為基模型

#引數n_features_to_select為選擇的特徵個數

rfe(estimator=logisticregression(), n_features_to_select=2).fit_transform(iris.data, iris.target)

使用logisticregression作為基模型主要是能直接得到特徵的權重。

1.3 embedded

1.3.1 基於懲罰項的特徵選擇法

使用帶懲罰項的基模型,除了篩選出特徵外,同時也進行了降維。使用feature_selection庫的selectfrommodel類結合帶l1懲罰項的邏輯回歸模型,來選擇特徵的**如下:

from sklearn.feature_selection import selectfrommodel

from sklearn.linear_model import logisticregression

#帶l1懲罰項的邏輯回歸作為基模型的特徵選擇

selectfrommodel(logisticregression(penalty="l1", c=0.1)).fit_transform(iris.data, iris.target)

通過l1正則項來選擇特徵:l1正則方法具有稀疏解的特性,因此天然具備特徵選擇的特性,但是要注意,l1沒有選到的特徵不代表不重要,原因是兩個具有高相關性的特徵可能只保留了乙個,如果要確定哪個特徵重要應再通過l2正則方法交叉檢驗;

關於正則化能起到特徵選擇和防止過擬合的作用公式推導:

關於正則化的的解釋可參考:

1.3.2 基於樹模型的特徵選擇法

樹模型中gbdt也可用來作為基模型進行特徵選擇,使用feature_selection庫的selectfrommodel類結合gbdt模型,來選擇特徵的**如下:

from sklearn.feature_selection import selectfrommodel

from sklearn.ensemble import gradientboostingclassifier

#gbdt作為基模型的特徵選擇

selectfrommodel(gradientboostingclassifier()).fit_transform(iris.data, iris.target)

- end -

推薦閱讀

【資料分析】老闆問為啥資料漲跌異常,我該怎麼一頓瞎分析?

點讚、分享、在看,一鍵三連 ↓↓↓

如何進行特徵選擇

前言 理論部分 乙個典型的機器學習任務是通過樣本的特徵來 樣本所對應的值。特徵過多會導致模型過於複雜,從而導致過擬合 而特徵過少則會導致模型過於簡單,從而導致欠擬合。事實上,如果特徵數大於樣本數,那麼過擬合就不可避免。特徵數比較少的時候,我們需要增加特徵。增加特徵方法很多 依照經驗 利用已有演算法提...

機器學習如何進行調參

調參,真的是讓我脫了一層皮的一項工作。調了半天,訓練一天,結果什麼用都沒有的時候真的是絕望 在實際調整引數之前,我們先要搞清楚兩個事情 1.調參的目的是什麼?2.調參調的東西具體是什麼?第乙個問題 調參的最終目的是要使訓練之後的模型檢測物體更精確,向程式的方向更靠近一步的話,就是使得損失函式 例如s...

資料不足,如何進行遷移學習?

這並不是乙個特別愚蠢的問題。frame可以幫助zendesk,intercom和slack等規模性公司標記 評價和理解與客戶的對話。也就是說,只要有足夠的對話,我們就可以手動評價 和 我們有足夠的資料從頭訓練乙個模型 這二者之間有很大的差距。僅僅幾十個標籤和幾千條相關對話,這能夠做什麼?遷移什麼?深...