5個特徵選擇算法,讓你的數據處理得心應手

2020-12-04 讀芯術

全文共5462字,預計學習時長11分鐘

圖片來源:https://unsplash.com/@seefromthesky

數據科學是研究算法的學問。本文將會介紹一些處理數據時最常用的特徵選擇技術。

我們經常遇到這樣的情況:在創建了大量特徵後,又需要減少數量,最後再使用相關性或者基於樹的方法來找出其中的重要特徵。那麼,如何讓這些方法變得更有結構呢?

為何要進行特徵選擇?

在文章開始之前,先來回答這個問題:為什麼不將所有的特徵都交給機器學習算法,讓它來決定哪些特徵比較重要呢?

以下便是不能的三個原因:

1. 維數的詛咒——過擬合

維數的詛咒:隨著特徵空間維數的增加,配置數量將會以指數級增長,因此觀測量會下降

如果數據中的列數多於行數,就能完美匹配訓練數據,但這卻並不適用於新樣本。因此這樣什麼也沒學到。

2. 奧卡姆剃刀原理

模型應當簡單易懂。如果特徵太多,就失去了可解釋性。

3. 無用輸入和輸出

很多時候會出現像名稱或ID變量等非信息特徵。劣質輸入也會產生劣質輸出。

此外,大量特徵會使模型量大、耗時,更難落實生產。

那應該怎麼做?

答案是:只選擇有用特徵。

幸運的是,Scikit-learn能便捷簡單地選擇特徵。特性選擇有很多種方法,但是大多可以分為三類:

過濾:列入一些篩選特徵的標準,如相關性/卡方分布。

包裝:包裝法將特徵選擇看作是搜索問題。如回歸特徵消除。

嵌入:嵌入法使用內置了特徵選擇方法的算法。比如,Lasso和RF都有各自的特徵選擇方法。

理論已經講夠了,接下來開始說五個特徵選擇的方法。

本文將使用數據集來方便理解——用一個足球運動員的數據集來找到成為優秀足球運動員的秘訣。

如果不理解足球術語也沒關係,術語並不多。

Kaggle Kernel代碼:https://www.kaggle.com/mlwhiz/feature-selection-using-football-data?source=post_page---------------------------

一些簡單的數據預處理

此前已進行了一些基本的預處理,比如刪除空值和一次熱編碼。將此問題轉化為分類問題要用:

y = traindf['Overall']>=87

這裡使用整體最高代指一個優秀球員。數據集(X)如下所示,有223列。

train Data X

1. 皮爾遜相關係數

這個是過濾法的一種。

檢查數據集裡目標和數值特徵之間皮爾遜相關係數8的絕對值。根據這個準則保留前n個特徵。

def cor_selector(X, y,num_feats):

cor_list = []

feature_name = X.columns.tolist()

# calculate the correlation with y for each feature

for i in X.columns.tolist():

cor = np.corrcoef(X[i], y)[0, 1]

cor_list.append(cor)

# replace NaN with 0

cor_list = [0 if np.isnan(i) else i for i in cor_list]

# feature name

cor_feature = X.iloc[:,np.argsort(np.abs(cor_list))[-num_feats:]].columns.tolist()

# feature selection? 0 for not select, 1 for select

cor_support = [True if i in cor_feature else False for i in feature_name]

return cor_support, cor_feature

cor_support, cor_feature = cor_selector(X, y,num_feats)

print(str(len(cor_feature)), 'selected features')

2. 卡方分布

另一種過濾法。

該方法計算目標與數值變量之間的卡方度量分布,只選取卡方值最大的變量。

舉個小例子來說明如何計算樣本的卡方統計量。

假設數據集中有75個右前鋒和25個非右前鋒。觀察到其中40個右前鋒好,35個不好。這是否意味著右前鋒會影響整體表現呢?

觀察和預期計數

計算卡方值:

要計算,首先要找出每個部分中的期望值,如果這兩個分類變量之間確實獨立的話。

很簡單,將每個單元格的行和與列和相乘,並將其除以總觀察值。

因此「好的」和「非右前鋒的」期望值=25(行和)*60(列和)/100(總觀察量)

為什麼會這樣?因為數據中有25%,所以預計在觀察到的60名優秀球員中,有25%的人會是右前鋒球員。因此是15個。

然後可以用下面的公式對所有4個單元格求和:

此處不會展示,但卡方統計量也有非負數值和分類特徵。

數據集中可以得到如下卡方特徵:

from sklearn.feature_selection import SelectKBest

from sklearn.feature_selection import chi2

from sklearn.preprocessing import MinMaxScaler

X_norm = MinMaxScaler().fit_transform(X)

chi_selector = SelectKBest(chi2, k=num_feats)

chi_selector.fit(X_norm, y)

chi_support = chi_selector.get_support()

chi_feature = X.loc[:,chi_support].columns.tolist()

print(str(len(chi_feature)), 'selected features')

3. 遞歸特徵消除

這是一個包裝法。如上所述,包裝法將一組特性的選擇視為搜索問題。

來自sklearn 文件:

遞歸特徵消除(RFE)的目標是遞歸地考慮越來越小的特徵集來選擇特徵。首先,用初始特徵集訓練估計器,通過 coef_或者feature_importances_屬性可以獲得特徵的重要性。然後,從當前的一組特性中刪除最不重要的。該過程在修剪集上遞歸地重複,直到最終達到所需的要選擇的特性數量。

大家可能猜到了,這個方法可以用在任何估計器上。此處用的是 LogisticRegression ,而RFE觀察了 LogisticRegression對象的coef_屬性。

from sklearn.feature_selection import RFE

from sklearn.linear_model import LogisticRegression

rfe_selector = RFE(estimator=LogisticRegression(), n_features_to_select=num_feats, step=10, verbose=5)

rfe_selector.fit(X_norm, y)

rfe_support = rfe_selector.get_support()

rfe_feature = X.loc[:,rfe_support].columns.tolist()

print(str(len(rfe_feature)), 'selected features')

4. 套索:SelectFromModel

這個是嵌入法。如前所述,嵌入法使用有內置特徵選擇方法的算法。

例如,Lasso和RF都有自己的特徵選擇方法。Lasso正則化器強制許多特徵權重為零。

這裡用套索來選擇變量。

from sklearn.feature_selection import SelectFromModel

from sklearn.linear_model import LogisticRegression

embeded_lr_selector = SelectFromModel(LogisticRegression(penalty="l1"), max_features=num_feats)

embeded_lr_selector.fit(X_norm, y)

embeded_lr_support = embeded_lr_selector.get_support()

embeded_lr_feature = X.loc[:,embeded_lr_support].columns.tolist()

print(str(len(embeded_lr_feature)), 'selected features')

5. 基於樹形結構:SelectFromModel

這是嵌入法。如前所述,嵌入法使用有內置特徵選擇方法的算法。

還可以使用隨機森林,根據特徵的重要性來選擇特徵。

使用每個決策樹中的節點雜質來計算特徵的重要性。隨機森林中,最終的特徵重要性是所有決策樹特徵重要性的平均值。

from sklearn.feature_selection import SelectFromModel

from sklearn.ensemble import RandomForestClassifier

embeded_rf_selector = SelectFromModel(RandomForestClassifier(n_estimators=100), max_features=num_feats)

embeded_rf_selector.fit(X, y)

embeded_rf_support = embeded_rf_selector.get_support()

embeded_rf_feature = X.loc[:,embeded_rf_support].columns.tolist()

print(str(len(embeded_rf_feature)), 'selected features')

也可以使用 LightGBM或者XGBoost 對象,只要它有feature_importances_屬性。

from sklearn.feature_selection import SelectFromModel

from lightgbm import LGBMClassifier

lgbc=LGBMClassifier(n_estimators=500, learning_rate=0.05, num_leaves=32, colsample_bytree=0.2,

reg_alpha=3, reg_lambda=1, min_split_gain=0.01, min_child_weight=40)

embeded_lgb_selector = SelectFromModel(lgbc, max_features=num_feats)

embeded_lgb_selector.fit(X, y)

embeded_lgb_support = embeded_lgb_selector.get_support()

embeded_lgb_feature = X.loc[:,embeded_lgb_support].columns.tolist()

print(str(len(embeded_lgb_feature)), 'selected features'

彩蛋

既有森林,何須獨木?

答案是,有時候數據太多、時間緊迫,全部使用是不可能的。

但只要有可能,為什麼不這樣做呢?

# put all selection together

feature_selection_df = pd.DataFrame({'Feature':feature_name, 'Pearson':cor_support, 'Chi-2':chi_support, 'RFE':rfe_support, 'Logistics':embeded_lr_support,

'Random Forest':embeded_rf_support, 'LightGBM':embeded_lgb_support})

# count the selected times for each feature

feature_selection_df['Total'] = np.sum(feature_selection_df, axis=1)

# display the top 100

feature_selection_df = feature_selection_df.sort_values(['Total','Feature'] , ascending=False)

feature_selection_df.index = range(1, len(feature_selection_df)+1)

feature_selection_df.head(num_feats)

functionComputeSMA(data,window_size)

檢查一下,用了以上所有方法後是否得到了特徵。此處可以看到反應和長傳是好評球員的優秀屬性。和預期一樣,控球和最後得分也佔據了首位。

結論

特徵工程和特徵選擇是所有機器學習分支的關鍵。

模型要力求精確,不一遍遍查看是不會獲得良好精度的。

本文試圖解釋了一些最常用的特性選擇技術,以及特性選擇方面的工作流程,並且試圖對這些方法提供一些直觀認識。

留言 點讚 關注

我們一起分享AI學習與發展的乾貨

編譯組:李美欣、蔣馨怡

相關連結:

https://towardsdatascience.com/the-5-feature-selection-algorithms-every-data-scientist-need-to-know-3a6b566efd2

如需轉載,請後臺留言,遵守轉載規範

相關焦點

  • 機器學習特徵選擇常用算法
    (2) 為什麼要做特徵選擇在機器學習的實際應用中,特徵數量往往較多,其中可能存在不相關的特徵,特徵之間也可能存在相互依賴,容易導致如下的後果:特徵個數越多,分析特徵、訓練模型所需的時間就越長。特徵個數越多,容易引起「維度災難」,模型也會越複雜,其推廣能力會下降。
  • 改進遺傳算法的支持向量機特徵選擇解決方案
    基於改進遺傳算法的特徵選擇  遺傳算法是一種新近發展起來的搜索最優化算法[2~5]。遺傳算法從任意一個的初始生物種群開始,通過隨機的選擇、交叉和變異操作,產生一群擁有更適應自然界的新個體的新一代種群,使得種群的進化趨勢向著最優的方向發展。圖1中所示的是標準的遺傳算法的流程框圖。
  • 教你如何做特徵選擇
    5 兩種頂層特徵選擇算法之所以叫做頂層,是因為他們都是建立在基於模型的特徵選擇方法基礎之上的,例如回歸和SVM,在不同的子集上建立模型,然後匯總最終確定特徵得分。5.1 穩定性選擇 Stability selection穩定性選擇是一種基於二次抽樣和選擇算法相結合較新的方法,選擇算法可以是回歸、SVM或其他類似的方法。
  • 機器學習處理數據為什麼把連續性特徵離散化
    機器學習處理數據為什麼把連續性特徵離散化 易水寒 發表於 2018-11-17 09:31:41 在學習機器學習中,看過挺多案例,看到很多人在處理數據的時候,經常把連續性特徵離散化。
  • 算法原理:大數據處理的分治思想!
    算法實現如果用算法A處理一個計算問題,當輸入數據D是一個集合,其數據量比較大時,可以將D劃分為幾個子集D1,D2,…D,然後使用算法A分別處理這些子集,最後將k 個結果進行綜合,從而得到原問題的解。這種方法稱為分治。
  • 改進遺傳算法的支持向量機特徵選擇解決方案介紹
    因此遺傳算法被廣泛應用在知識發現、組合優化、機器學習、信號處理、自適應控制和人工生命等領域。  基於改進遺傳算法的特徵選擇  遺傳算法是一種新近發展起來的搜索最優化算法[2~5]。圖2是改進遺傳算法的流程框圖。  染色體編碼和適應度函數  所謂編碼是指將問題的解空間轉換成遺傳算法所能處理的搜索空間。
  • 谷歌最牛的是它的算法,三個基本特徵表述算法
    01谷歌的核心算法谷歌作為世界上最大的搜尋引擎提供商,每年要處理的搜索數據達兆/萬億級,而要保證搜索結果的準確性和實用性,谷歌採用了高級算法來解讀用戶的需求,在2013年的時候現在大數據流行,好像只要有大數據在,經過分析提取關鍵數據,就能準確預測各類相關行為。這裡直接面對海量數據的,還是算法。有種說法是,未來誰掌握了算法,誰就能掌控世界。那麼到底什麼是算法?算法是一種特定類型的形式步驟,只要可以「運行」或者開始具現化,它就能合乎邏輯地產生特定類型的結果。其實,即使是在達爾文時代,算法也並不十分新穎。
  • 深度剖析:數據科學家需懂的5種聚類算法
    【IT168 資訊】聚類是一種涉及數據點分組的機器學習技術。給定一組數據點,我們可以使用聚類算法將每個數據點分類到一個特定的組中。理論上,屬於同一組的數據點應具有相似的屬性和特徵,而不同組中的數據點應具有高度不同的屬性和特徵。聚類是無監督學習的一種方法,是在許多領域使用統計數據分析的常用技術。
  • 常見的機器學習算法,你知道幾個?
    缺點:對大規模訓練樣本難以實施,解決多分類問題存在困難,對參數調節和核函數的選擇敏感。應用場景:文本分類、人像識別、醫學診斷等。(2)決策樹(Decision Tree):是一個預測模型,代表的是對象屬性與對象值之間的一種映射關係。下圖是如何在決策樹中建模的簡單示例:優點:易於理解和解釋,可以可視化分析,容易提取出規則;能夠處理不相關的特徵。
  • 數據科學家們必須知道的5種聚類算法
    翻譯 | 姜波    整理 |  凡江  吳璇聚類是一種關於數據點分組的機器學習技術。給出一組數據點,我們可以使用聚類算法將每個數據點分類到特定的組中。理論上,同一組中的數據點應具有相似的屬性或特徵,而不同組中的數據點應具有相當不同的屬性或特徵(即類內差異小,類間差異大)。
  • 為你的回歸問題選擇最佳機器學習算法
    【IT168 編譯】在處理任何類型的機器學習(ML)問題時,我們有許多不同的算法可供選擇。而機器學習領域有一個得到大家共識的觀點,大概就是:沒有一個ML算法能夠最佳地適用於解決所有問題。不同ML算法的性能在很大程度上取決於數據的大小和結構。
  • 決策樹算法——選擇困難症的「良藥」
    人們經常糾結於各種選擇,生怕選錯了,就會陷入「藍瘦香菇」的困境。人們在面臨選擇難題的時候經常想:如果能未卜先知,那該多好。實際上,在人工智慧領域,就有一種預測算法,利用樹杈的形狀,非常形象地來解決這種選擇問題,這就是決策樹算法,它是一個非常廣泛應用的算法,其原理是通過對一系列問題進行「是/否」的推導,最終實現決策。
  • 10大機器學習算法,看懂你就是數據科學家
    想成為數據科學家?你得是個博聞強識,又對新鮮事物保持好奇心的人。正因為如此,數據科學家會掌握幾乎所有的常見算法,並精通其中一門,這樣可以快速適應新領域的問題。今天我們就來聊聊,每一位數據科技家都應該了解的10大機器學習算法。
  • Python入門5大機器學習算法(附代碼),你知道哪幾個?
    下面我們看下Python的5個機器學習算法(附代碼)1、線性回歸線性回歸通常用於根據連續變量估計實際數值(房價、呼叫次數、總銷售額等)。我們通過擬合最佳直線來建立自變量和因變量的關係。這條最佳直線叫做回歸線,並且用 Y= a *X + b 這條線性等式來表示。
  • 算法工程師和數據科學家處理大規模的交易數據
    這一次,終於可以搭建一個三個多月的長期服務,來幫助新入門的開發者更快學習自動駕駛。人工智慧並不是計算機科學的延伸,但藉助人工智慧來讓機器達到真正的自主性,是前沿技術探索的目標。基於深度學習的自動駕駛方法,不僅能改善開發人員在交通中的控制,同時也能解決路況複雜情況下的駕駛難題。
  • 在python中使用KNN算法處理缺失的數據
    處理缺失的數據並不是一件容易的事。 方法的範圍從簡單的均值插補和觀察值的完全刪除到像MICE這樣的更高級的技術。 解決問題的挑戰性是選擇使用哪種方法。 今天,我們將探索一種簡單但高效的填補缺失數據的方法-KNN算法。KNN代表「 K最近鄰居」,這是一種簡單算法,可根據定義的最接近鄰居數進行預測。 它計算從您要分類的實例到訓練集中其他所有實例的距離。
  • 專欄 | 基於 Jupyter 的特徵工程手冊:特徵選擇(四)
    作者:陳穎祥、楊子晗
  • 教程| 初學者如何選擇合適的機器學習算法(附速查表)
    有很多因素會影響這一問題的答案,比如:數據的大小、質量及性質可用計算時間任務的急迫性數據的使用用途在沒有測試過不同算法之前,即使是經驗豐富的數據科學家和機器學習算法開發者也都不能分辨出哪種算法性能最好。我們並不提倡一步到位,但是我們確實希望根據一些明確的因素為算法的選擇提供一些參考意見。
  • 降維算法讓腦神經大數據處理變簡單
    隨著神經元記錄技術的發展,科學家能同時監視、記錄腦中數百個神經元的活動,並有望將這一數字成倍提高。但關鍵問題不是為了超越單個神經元,而是從這些神經元集群的記錄中,能得到什麼科學解釋。 對神經元活動的簡單記錄不會自動產生明確的表達,讓科學家理解大腦是怎樣工作的。
  • 加密類型:5種加密算法以及如何選擇正確的算法
    在深入探討5種最常用的加密算法,以前所未有地簡化它們之前,我們將分解兩種主要的加密類型,對稱和非對稱。加密是始終成為頭條新聞的那些網絡安全主題之一。對不同類型的加密有充分了解的任何人都可能會覺得,這種非凡的技術正處於一種不公正的狀態,而這種非凡的技術是Internet安全和隱私的核心。