機器學習特徵選擇方法總結

2021-02-08 七月在線實驗室
據《福布斯》報導,每天大約會有 250 萬字節的數據被產生。然後,可以使用數據科學和機器學習技術對這些數據進行分析,以便提供分析和作出預測。儘管在大多數情況下,在開始任何統計分析之前,需要先對最初收集的數據進行預處理。有許多不同的原因導致需要進行預處理分析,例如:


在本文中,我將介紹如何使用 python 減少 kaggle Mushroom Classification 數據集中的特性數量。本文中使用的所有代碼在 kaggle 和我的 github 帳號上都有。減少統計分析期間要使用的特徵的數量可能會帶來一些好處,例如:


提高精度

降低過擬合風險

加快訓練速度

改進數據可視化

增加我們模型的可解釋性


事實上,統計上證明,當執行機器學習任務時,存在針對每個特定任務應該使用的最佳數量的特徵(圖 1)。如果添加的特徵比必要的特徵多,那麼我們的模型性能將下降(因為添加了噪聲)。真正的挑戰是找出哪些特徵是最佳的使用特徵(這實際上取決於我們提供的數據量和我們正在努力實現的任務的複雜性)。這就是特徵選擇技術能夠幫到我們的地方!


1.過濾方法=過濾我們的數據集,只取包含所有相關特徵的子集(例如,使用 Pearson 相關的相關矩陣)。2.遵循過濾方法的相同目標,但使用機器學習模型作為其評估標準(例如,向前/向後/雙向/遞歸特徵消除)。我們將一些特徵輸入機器學習模型,評估它們的性能,然後決定是否添加或刪除特徵以提高精度。因此,這種方法可以比濾波更精確,但計算成本更高。3.嵌入方法。與過濾方法一樣,嵌入方法也使用機器學習模型。這兩種方法的區別在於,嵌入的方法檢查 ML 模型的不同訓練迭代,然後根據每個特徵對 ML 模型訓練的貢獻程度對每個特徵的重要性進行排序。在本文中,我將使用 Mushroom Classification 數據集,通過查看給定的特徵來嘗試預測蘑菇是否有毒。在這樣做的同時,我們將嘗試不同的特徵消除技術,看看它們會如何影響訓練時間和模型整體的精度。



圖 3:Mushroom Classification 數據集在將這些數據輸入機器學習模型之前,我決定對所有分類變量進行 one hot 編碼,將數據分為特徵(x)和標籤(y),最後在訓練集和測試集中進行。
X = df.drop(['class'], axis = 1)Y = df['class']X = pd.get_dummies(X, prefix_sep='_')Y = LabelEncoder().fit_transform(Y)
X2 = StandardScaler().fit_transform(X)
X_Train, X_Test, Y_Train, Y_Test = train_test_split(X2, Y, test_size = 0.30, random_state = 101)

基於集合的決策樹模型(如隨機森林)可以用來對不同特徵的重要性進行排序。了解我們的模型最重要的特徵對於理解我們的模型如何做出預測(使其更易於解釋)是至關重要的。同時,我們可以去掉那些對我們的模型沒有任何好處的特徵。
start = time.process_time()trainedforest = RandomForestClassifier(n_estimators=700).fit(X_Train,Y_Train)print(time.process_time() - start)predictionforest = trainedforest.predict(X_Test)print(confusion_matrix(Y_Test,predictionforest))print(classification_report(Y_Test,predictionforest))

如下圖所示,使用所有特徵訓練一個隨機森林分類器,在大約 2.2 秒的訓練時間內獲得 100% 的準確率。在下面的每個示例中,每個模型的訓練時間都將列印在每個片段的第一行,供你參考。



一旦我們的隨機森林分類器得到訓練,我們就可以創建一個特徵重要性圖,看看哪些特徵對我們的模型預測來說是最重要的(圖 4)。在本例中,下面只顯示了前 7 個特性。
figure(num=None, figsize=(20, 22), dpi=80, facecolor='w', edgecolor='k')
feat_importances = pd.Series(trainedforest.feature_importances_, index= X.columns)feat_importances.nlargest(7).plot(kind='barh')

現在我們知道了哪些特徵被我們的隨機森林認為是最重要的,我們可以嘗試使用前 3 個來訓練我們的模型。
X_Reduced = X[['odor_n','odor_f', 'gill-size_n','gill-size_b']]X_Reduced = StandardScaler().fit_transform(X_Reduced)X_Train2, X_Test2, Y_Train2, Y_Test2 = train_test_split(X_Reduced, Y, test_size = 0.30,  random_state = 101)
start = time.process_time()trainedforest = RandomForestClassifier(n_estimators=700).fit(X_Train2,Y_Train2)print(time.process_time() - start)predictionforest = trainedforest.predict(X_Test2)print(confusion_matrix(Y_Test2,predictionforest))print(classification_report(Y_Test2,predictionforest))

正如我們在下面看到的,僅僅使用 3 個特徵,只會導致準確率下降 0.03%,訓練時間減少一半。我們還可以通過可視化一個訓練過的決策樹來理解如何進行特徵選擇。
start = time.process_time()trainedtree = tree.DecisionTreeClassifier().fit(X_Train, Y_Train)print(time.process_time() - start)predictionstree = trainedtree.predict(X_Test)print(confusion_matrix(Y_Test,predictionstree))print(classification_report(Y_Test,predictionstree))

樹結構頂部的特徵是我們的模型為了執行分類而保留的最重要的特徵。因此,只選擇頂部的前幾個特徵,而放棄其他特徵,可能創建一個準確度非常可觀的模型。
import graphvizfrom sklearn.tree import DecisionTreeClassifier, export_graphviz

data = export_graphviz(trainedtree,out_file=None,feature_names= X.columns, class_names=['edible', 'poisonous'], filled=True, rounded=True, max_depth=2, special_characters=True)graph = graphviz.Source(data)graph

遞歸特徵消除(RFE)將機器學習模型的實例和要使用的最終期望特徵數作為輸入。然後,它遞歸地減少要使用的特徵的數量,採用的方法是使用機器學習模型精度作為度量對它們進行排序。創建一個 for 循環,其中輸入特徵的數量是我們的變量,這樣就可以通過跟蹤在每個循環迭代中註冊的精度,找出我們的模型所需的最佳特徵數量。使用 RFE 支持方法,我們可以找出被評估為最重要的特徵的名稱(rfe.support 返回一個布爾列表,其中 true 表示一個特徵被視為重要,false 表示一個特徵不重要)。
from sklearn.feature_selection import RFE
model = RandomForestClassifier(n_estimators=700)rfe = RFE(model, 4)start = time.process_time()RFE_X_Train = rfe.fit_transform(X_Train,Y_Train)RFE_X_Test = rfe.transform(X_Test)rfe = rfe.fit(RFE_X_Train,Y_Train)print(time.process_time() - start)print("Overall Accuracy using RFE: ", rfe.score(RFE_X_Test,Y_Test))

SelecFromModel

selectfrommodel 是另一種 scikit 學習方法,可用於特徵選擇。此方法可用於具有 coef 或 feature 重要性屬性的所有不同類型的 scikit 學習模型(擬合後)。與 rfe 相比,selectfrommodel 是一個不太可靠的解決方案。實際上,selectfrommodel 只是根據計算出的閾值(不涉及優化迭代過程)刪除不太重要的特性。
為了測試 selectfrommodel 的有效性,我決定在這個例子中使用一個 ExtraTreesClassifier。ExtratreesClassifier(極端隨機樹)是基於樹的集成分類器,與隨機森林方法相比,它可以產生更少的方差(因此減少了過擬合的風險)。隨機森林和極隨機樹的主要區別在於極隨機樹中節點的採樣不需要替換。
from sklearn.ensemble import ExtraTreesClassifierfrom sklearn.feature_selection import SelectFromModel
model = ExtraTreesClassifier()start = time.process_time()model = model.fit(X_Train,Y_Train)model = SelectFromModel(model, prefit=True)print(time.process_time() - start)Selected_X = model.transform(X_Train)
start = time.process_time()trainedforest = RandomForestClassifier(n_estimators=700).fit(Selected_X, Y_Train)print(time.process_time() - start)Selected_X_Test = model.transform(X_Test)predictionforest = trainedforest.predict(Selected_X_Test)print(confusion_matrix(Y_Test,predictionforest))print(classification_report(Y_Test,predictionforest))



為了減少數據集中的特徵數量,另一種可能的方法是檢查特徵與標籤的相關性。使用皮爾遜相關,我們的返回係數值將在-1 和 1 之間變化:


如果兩個特徵之間的相關性為 0,則意味著更改這兩個特徵中的任何一個都不會影響另一個。

如果兩個特徵之間的相關性大於 0,這意味著增加一個特徵中的值也會增加另一個特徵中的值(相關係數越接近 1,兩個不同特徵之間的這種聯繫就越強)。

如果兩個特徵之間的相關性小於 0,這意味著增加一個特徵中的值將使減少另一個特徵中的值(相關性係數越接近-1,兩個不同特徵之間的這種關係將越強)。


在這種情況下,我們將只考慮與輸出變量至少 0.5 相關的特性。
Numeric_df = pd.DataFrame(X)Numeric_df['Y'] = Ycorr= Numeric_df.corr()corr_y = abs(corr["Y"])highest_corr = corr_y[corr_y >0.5]highest_corr.sort_values(ascending=True)

我們現在可以通過創建一個相關矩陣來更仔細地研究不同相關特徵之間的關係。
figure(num=None, figsize=(12, 10), dpi=80, facecolor='w', edgecolor='k')
corr2 = Numeric_df[['bruises_f' , 'bruises_t' , 'gill-color_b' , 'gill-size_b' , 'gill-size_n' , 'ring-type_p' , 'stalk-surface-below-ring_k' , 'stalk-surface-above-ring_k' , 'odor_f', 'odor_n']].corr()
sns.heatmap(corr2, annot=True, fmt=".2g")

在這項分析中,另一個可能要控制的方面是檢查所選變量是否彼此高度相關。如果是的話,我們就只需要保留其中一個相關的,去掉其他的。最後,我們現在可以只選擇與 y 相關度最高的特徵,訓練/測試一個支持向量機模型來評估該方法的結果。



單變量選擇


單變量特徵選擇是一種統計方法,用於選擇與我們對應標籤關係最密切的特徵。使用 selectkbest 方法,我們可以決定使用哪些指標來評估我們的特徵,以及我們希望保留的 k 個最佳特徵的數量。根據我們的需要,提供不同類型的評分函數:


Classification = chi2, f_classif, mutual_info_classif

Regression = f_regression, mutual_info_regression


卡方(chi-squared,chi2)可以將非負值作為輸入,因此,首先,我們在 0 到 1 之間的範圍內縮放輸入數據。
from sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2
min_max_scaler = preprocessing.MinMaxScaler()Scaled_X = min_max_scaler.fit_transform(X2)
X_new = SelectKBest(chi2, k=2).fit_transform(Scaled_X, Y)X_Train3, X_Test3, Y_Train3, Y_Test3 = train_test_split(X_new, Y, test_size = 0.30, random_state = 101)start = time.process_time()trainedforest = RandomForestClassifier(n_estimators=700).fit(X_Train3,Y_Train3)print(time.process_time() - start)predictionforest = trainedforest.predict(X_Test3)print(confusion_matrix(Y_Test3,predictionforest))print(classification_report(Y_Test3,predictionforest))

當將正則化應用於機器學習模型時,我們在模型參數上加上一個懲罰,以避免我們的模型試圖太接近我們的輸入數據。通過這種方式,我們可以使我們的模型不那麼複雜,並且我們可以避免過度擬合(使我們的模型不僅學習關鍵的數據特徵,而且學習它的內在噪聲)。其中一種可能的正則化方法是套索回歸。當使用套索回歸時,如果輸入特徵的係數對我們的機器學習模型訓練沒有積極的貢獻,則它們會縮小。這樣,一些特徵可能會被自動丟棄,即將它們的係數指定為零。
from sklearn.linear_model import LassoCV
regr = LassoCV(cv=5, random_state=101)regr.fit(X_Train,Y_Train)print("LassoCV Best Alpha Scored: ", regr.alpha_)print("LassoCV Model Accuracy: ", regr.score(X_Test, Y_Test))model_coef = pd.Series(regr.coef_, index = list(X.columns[:-1]))print("Variables Eliminated: ", str(sum(model_coef == 0)))print("Variables Kept: ", str(sum(model_coef != 0)))

一旦訓練了我們的模型,我們就可以再次創建一個特徵重要性圖來了解哪些特徵被我們的模型認為是最重要的(圖 8)。這是非常有用的,尤其是在試圖理解我們的模型是如何決定做出預測的時候,因此使我們的模型更易於解釋。
figure(num=None, figsize=(12, 10), dpi=80, facecolor='w', edgecolor='k')
top_coef = model_coef.sort_values()top_coef[top_coef != 0].plot(kind = "barh")plt.title("Most Important Features Identified using Lasso (!0)")

via:https://towardsdatascience.com/feature-selection-techniques-1bfab5fe0784

9.9元秒殺【特徵工程與模型優化特訓】,兩大實戰項目,學習多種優化方法 掌握比賽上分利器。優秀學員還可獲得1V1簡歷優化及內推名額!在售價199.9元,限時9.9元秒



參與方式:

掃描上方海報二維碼

回復「7」


課程從數據採集到數據處理、到特徵選擇、再到模型調優,帶你掌握一套完整的機器學習流程,對於不同類型的數據,不同場景下的問題,選擇合適的特徵工程方法和模型優化方法進行處理尤為重要。


本次課程還會提供兩個經典的 Kaggle 比賽案例和詳細的模型融合模板,帶你更容易地理解機器學習,掌握比賽上分利器。



五大課程特色


參與方式:

掃描上方海報二維碼

回復「7」


閱讀原文」查看課程詳情!(機器學習集訓營預習課之一)

相關焦點

  • 收藏 | 機器學習特徵選擇方法總結
    真正的挑戰是找出哪些特徵是最佳的使用特徵(這實際上取決於我們提供的數據量和我們正在努力實現的任務的複雜性)。這就是特徵選擇技術能夠幫到我們的地方!1.過濾方法=過濾我們的數據集,只取包含所有相關特徵的子集(例如,使用 Pearson 相關的相關矩陣)。2.遵循過濾方法的相同目標,但使用機器學習模型作為其評估標準(例如,向前/向後/雙向/遞歸特徵消除)。
  • Python機器學習8:機器學習中的兩種特徵選擇方法
    在機器學習中,通常遇到這樣一個問題:訓練數據的特徵個數非常多,而訓練數據的個數卻不多,此時,需要進行特徵選擇。本文將介紹如何使用scikit-learn做機器學習模型的特徵選擇。第一部分為特徵選擇的三大好處,後面二部分介紹了二種特徵選擇方法:RFE和決策樹。
  • 機器學習特徵工程方法總結
    結構總覽特徵工程傳統編程的關注點是代碼。在機器學習項目中,關注點變成了特徵表示。也就是說,開發者通過添加和改善特徵來調整模型。「Garbage in, garbage out」。對於一個機器學習問題,數據和特徵往往決定了結果的上限,而模型、算法的選擇及優化則是在逐步接近這個上限。特徵工程,顧名思義,是指從原始數據創建特徵的過程。將原始數據映射到特徵許多機器學習模型都必須將特徵表示為實數向量,因為特徵值必須與模型權重相乘。圖 1.
  • 機器學習的特徵選擇方法要如何選取?
    基於特徵的特徵選擇方法包括使用統計信息評估每個輸入變量和目標變量之間的關係,並選擇與目標變量關係最密切的那些輸入變量。儘管統計方法的選擇取決於輸入和輸出變量的數據類型,但是這些方法可以快速有效。這樣,當執行基於過濾器的特徵選擇時,對於機器學習從業者來說,為數據集選擇適當的統計量度可能是具有挑戰性的。
  • 機器學習中的特徵工程總結!
    結構總覽特徵工程傳統編程的關注點是代碼。在機器學習項目中,關注點變成了特徵表示。也就是說,開發者通過添加和改善特徵來調整模型。「Garbage in, garbage out」。對於一個機器學習問題,數據和特徵往往決定了結果的上限,而模型、算法的選擇及優化則是在逐步接近這個上限。
  • 機器學習實戰-特徵選擇之遞歸特徵消除
    機器學習實戰-特徵選擇之嵌入法機器學習裡面,我們梳理了過濾法我們研究sklearn官方,它給出了一定的說明:針對哪些特徵含有權重的預測模型,RFE通過遞歸的方式,不斷減少特徵集的規模來選擇需要的特徵。第一:給每一個特徵指定一個權重,接著採用預測模型在這些原始的特徵上進行訓練。
  • 資源 | 一個Python特徵選擇工具,助力實現高效機器學習
    項目地址:https://github.com/WillKoehrsen/feature-selector特徵選擇(feature selection)是查找和選擇數據集中最有用特徵的過程,是機器學習流程中的一大關鍵步驟。不必要的特徵會降低訓練速度、降低模型可解釋性,並且最重要的是還會降低其在測試集上的泛化表現。
  • 機器學習中的特徵數據選擇三部曲
    這裡我們將對特徵工程中經常用到的特徵數據選擇方法進行介紹使用和說明,主要分為三個部分,分別為:單變量選擇、線性模型選擇和隨機森林模型特徵選擇。三部曲一:單變量選擇對於數據科學家或機器學習從業人員而言,對特徵選擇/排序有很好的了解可能是一筆寶貴的財富。對這些方法的良好掌握可以帶來更好的性能模型,可以更好地理解數據的底層結構和特徵,並可以更好地了解構成許多機器學習模型基礎的算法。
  • 機器學習中特徵選擇怎麼做?這篇文章告訴你
    圖 1:分類器性能和維度之間的關係▍特徵選擇有許多不同的方法可用於特徵選擇。其中最重要的是:1.過濾方法=過濾我們的數據集,只取包含所有相關特徵的子集(例如,使用 Pearson 相關的相關矩陣)。2.遵循過濾方法的相同目標,但使用機器學習模型作為其評估標準(例如,向前/向後/雙向/遞歸特徵消除)。我們將一些特徵輸入機器學習模型,評估它們的性能,然後決定是否添加或刪除特徵以提高精度。因此,這種方法可以比濾波更精確,但計算成本更高。3.嵌入方法。與過濾方法一樣,嵌入方法也使用機器學習模型。
  • 機器學習中類別變量的編碼方法總結
    機器學習中有多種類別變量編碼方式,各種編碼方法都有各自的適用場景和特點。本文就對機器學習中常見的類別編碼方式做一個簡單的總結。     所謂硬編碼,即直接對類別特徵進行數值映射,有多少類別取值就映射多少數值。這種硬編碼方式簡單粗暴,方便快捷。
  • 觀點 | 三大特徵選擇策略,有效提升你的機器學習水準
    特徵選擇是數據獲取中最關鍵的一步,可惜很多教程直接跳過了這一部分。本文將分享有關特徵選擇的 3 個傑出方法,有效提升你的機器學習水準。
  • 機器學習之特徵工程Feature-Engineering及sklearn代碼實現
    那麼做好特徵工程,就非常有利於我們得到一個「更好的」模型;在機器學習的整個過程中特徵工程佔用了70~80%的時間,其完成質量也直接影響模型最終的輸出結果。就特徵工程的流程、類型、工具、數據預處理、特徵選擇、降維在學習之餘,做簡單的總結和介紹、附可執行的python代碼。
  • 機器學習中的特徵工程步驟
    特徵工程是機器學習中非常重要的一個步驟,有一種說法是,特徵決定了效果的上限,而不同模型只是以不同的方式或不同的程度來逼近這個上限。
  • 阿里天池機器學習競賽項目總結,特徵工程了解一下!
    來源:阿里雲天池,案例:機器學習實踐  業界廣泛流傳著這樣一句話:「數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已」,由此可見特徵工程在機器學習中的重要性,今天我們將通過《阿里雲天池大賽賽題解析——機器學習篇》中的【天貓 用戶重複購買預測】案例來深入解析特徵工程在實際商業場景中的應用。
  • 機器學習模型選擇如此簡單
    機器學習的討論經常會涉及到的問題是:什麼機器學習模型才是最好的?是邏輯回歸模型,隨機森林模型,貝葉斯方法模型,支持向量機模型?抑或是神經網絡模型?每個人似乎都有自己心中最愛!但這些討論試圖把機器學習的挑戰縮減為單個問題,而這對機器學習的初學者帶來了特別嚴重的誤解。
  • 機器學習中必知必會的 3 種特徵選取方法!
    關註上方「Python數據科學」,選擇星標,關鍵時間,第一時間送達!隨著深度學習的蓬勃發展,越來越多的小夥伴開始嘗試搭建深層神經網絡應用於工作場景中,認為只需要把數據放入模型中,調優模型參數就可以讓模型利用自身機制來選擇重要特徵,輸出較好的數據結果。
  • Kaggle機器學習實戰總結
    2017年就要過去,這一年我花了很多業餘時間在學習Python 和機器學習,主要的方法就是在Kaggle 上面刷各種比賽。2017年就要過去,就以此文作為,我在2017年的機器學習的一個告別文章。在開篇文章- 原理中,我談到了要:1、總結的搭積木式刷分大法。
  • 機器學習特徵選擇常用算法
    綜述本文引用地址:http://www.eepw.com.cn/article/201807/383585.htm(1) 什麼是特徵選擇特徵選擇 ( Feature Selection )也稱特徵子集選擇( Feature Subset Selection , FSS ) ,或屬性選擇( Attribute Selection ) ,是指從全部特徵中選取一個特徵子集,使構造出來的模型更好
  • 如何進行特徵選擇(理論篇)機器學習你會遇到的「坑」
    這周我們來說說如何進行特徵選擇的問題。一個典型的機器學習任務,是通過樣本的特徵來預測樣本所對應的值。如果樣本的特徵少了,我們會考慮增加特徵,比如Polynomial Regression就是典型的增加特徵的算法。
  • 獨家 | 使用Python實現機器學習特徵選擇的4種方法(附代碼)
    本文中,我們將研究從數據集中選擇特徵的不同方法;同時通過使用Python中Scikit-learn (sklearn)庫實現討論了特徵選擇算法的類型。註:本文節選自Ankit Dixit所著的《集成機器學習》(Ensemble Machine Learning)一書。這本書組合強大的機器學習算法來建立優化模型,可以作為初學者的指南。