機器學習中特徵選擇怎麼做?這篇文章告訴你

2021-01-11 高教幫

▍簡介

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

收集的數據格式不對(如 SQL 資料庫、JSON、CSV 等)缺失值和異常值標準化減少數據集中存在的固有噪聲(部分存儲數據可能已損壞)數據集中的某些功能可能無法收集任何信息以供分析

在本文中,我將介紹如何使用 python 減少 kaggle Mushroom Classification 數據集中的特性數量。本文中使用的所有代碼在kaggle 和我的github 帳號上都有。

減少統計分析期間要使用的特徵的數量可能會帶來一些好處,例如:

提高精度降低過擬合風險加快訓練速度改進數據可視化增加我們模型的可解釋性

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

圖 1:分類器性能和維度之間的關係

▍特徵選擇

有許多不同的方法可用於特徵選擇。其中最重要的是:

1.過濾方法=過濾我們的數據集,只取包含所有相關特徵的子集(例如,使用 Pearson 相關的相關矩陣)。

2.遵循過濾方法的相同目標,但使用機器學習模型作為其評估標準(例如,向前/向後/雙向/遞歸特徵消除)。我們將一些特徵輸入機器學習模型,評估它們的性能,然後決定是否添加或刪除特徵以提高精度。因此,這種方法可以比濾波更精確,但計算成本更高。

3.嵌入方法。與過濾方法一樣,嵌入方法也使用機器學習模型。這兩種方法的區別在於,嵌入的方法檢查 ML 模型的不同訓練迭代,然後根據每個特徵對 ML 模型訓練的貢獻程度對每個特徵的重要性進行排序。

圖 2:過濾器、包裝器和嵌入式方法表示 [3]

▍實踐

在本文中,我將使用 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')

圖 4:特徵重要性圖

現在我們知道了哪些特徵被我們的隨機森林認為是最重要的,我們可以嘗試使用前 3 個來訓練我們的模型。

正如我們在下面看到的,僅僅使用 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_graphvizdata = 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

圖 5:決策樹可視化

▍遞歸特徵消除(RFE)

遞歸特徵消除(RFE)將機器學習模型的實例和要使用的最終期望特徵數作為輸入。然後,它遞歸地減少要使用的特徵的數量,採用的方法是使用機器學習模型精度作為度量對它們進行排序。

創建一個 for 循環,其中輸入特徵的數量是我們的變量,這樣就可以通過跟蹤在每個循環迭代中註冊的精度,找出我們的模型所需的最佳特徵數量。使用 RFE 支持方法,我們可以找出被評估為最重要的特徵的名稱(rfe.support 返回一個布爾列表,其中 true 表示一個特徵被視為重要,false 表示一個特徵不重要)。

from sklearn.feature_selection import RFEmodel = 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 SelectFromModelmodel = 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")

圖 6:最高相關特徵的相關矩陣

在這項分析中,另一個可能要控制的方面是檢查所選變量是否彼此高度相關。如果是的話,我們就只需要保留其中一個相關的,去掉其他的。

最後,我們現在可以只選擇與 y 相關度最高的特徵,訓練/測試一個支持向量機模型來評估該方法的結果。

▍單變量選擇

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

Classification = chi2, f_classif, mutual_info_classifRegression = f_regression, mutual_info_regression

在本例中,我們將使用 chi2(圖 7)。

圖 7:卡方公式 [4]

卡方(chi-squared,chi2)可以將非負值作為輸入,因此,首先,我們在 0 到 1 之間的範圍內縮放輸入數據。

from sklearn.feature_selection import SelectKBestfrom sklearn.feature_selection import chi2min_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 LassoCVregr = 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)"

圖 8:套索特徵重要性圖

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

End

相關焦點

  • 特徵選擇怎麼做?這篇文章告訴你
    如果添加的特徵比必要的特徵多,那麼我們的模型性能將下降(因為添加了噪聲)。真正的挑戰是找出哪些特徵是最佳的使用特徵(這實際上取決於我們提供的數據量和我們正在努力實現的任務的複雜性)。這就是特徵選擇技術能夠幫到我們的地方!
  • 分享一個Python中機器學習的特徵選擇工具
    特徵選擇,即在數據集中查找和選擇最有用的特徵的過程,是機器學習的關鍵步驟。不必要的特徵會降低訓練速度、模型的可解釋性,最重要的是會降低測試集的泛化性能。FeatureSelector類包括一些最常見的特徵選擇方法:  1.高百分比的缺失值特徵選擇法  2.共線(高度相關)特徵選擇法  3.樹型結構模型中的零重要性特徵選擇法  4.低重要性特徵選擇法  5.唯一值特徵選擇法  在本文中,我將對機器學習數據集的示例使用FeatureSelector類。
  • 機器學習的特徵選擇方法要如何選取?
    在本文中,您將發現如何為統計數據和分類數據選擇統計度量,以進行基於過濾器的特徵選擇。閱讀這篇文章後,您將知道:特徵選擇技術主要有兩種類型:包裝器和過濾器方法。基於過濾器的特徵選擇方法使用統計量度對可以過濾以選擇最相關特徵的輸入變量之間的相關性或依賴性進行評分。必須根據輸入變量和輸出或響應變量的數據類型仔細選擇用於特徵選擇的統計量度。
  • 機器學習:特徵選擇和降維實例
    不幸的是,在Do not Overfit II競賽(kaggle.com/c/dont-overfit-ii/data)中,領域知識的使用是不可能的,因為我們有一個二元目標和300個連續變量,這迫使我們嘗試特徵選擇技術。簡介通常,我們將特徵選擇和降維組合在一起使用。雖然這兩種方法都用於減少數據集中的特徵數量,但存在很大不同。
  • 教你如何做特徵選擇
    簡單易學的機器學習算法——嶺回歸(Ridge Regression)」,嶺回歸就是在基本線性回歸的過程中加入了正則項。總結以及注意點這篇文章中最後提到了一點就是用特徵選擇的一點Trap。個人的理解是這樣的,特徵選擇不同於特徵提取,特徵和模型是分不開,選擇不同的特徵訓練出的模型是不同的。在機器學習=模型+策略+算法的框架下,特徵選擇就是模型選擇的一部分,是分不開的。這樣文章最後提到的特徵選擇和交叉驗證就好理解了,是先進行分組還是先進行特徵選擇。
  • 機器學習系列|從白富美相親看特徵預處理與選擇
    而選擇相親名單的標準——如「是否高富帥」、「是否海歸」等等——就叫作「特徵」。最好能有一個特徵能夠精確定位理想女婿。但這太過理想了。比較現實的方法是從這些「特徵」中選擇、拆分、組合出最合適的特徵,逐漸逼近我們的標籤,以形成一個精簡的相親名單。而這個過程,就可以理解成特徵處理、特徵工程的過程。
  • 這篇綜述文章用166篇參考文獻告訴你答案
    來自港科大和第四範式的這篇綜述論文提供了解答。數據是機器學習領域的重要資源,在數據缺少的情況下如何訓練模型呢?小樣本學習是其中一個解決方案。來自香港科技大學和第四範式的研究人員綜述了該領域的研究發展,並提出了未來的研究方向。
  • 「機器學習」機器學習算法優缺點對比(匯總篇)
    它們要受很多因素的影響,比如你的數據集的規模或結構。其結果是,在用給定的測試集來評估性能並挑選算法時,你應當根據具體的問題來採用不同的算法。當然,**所選的算法必須要適用於你自己的問題,這就要求選擇正確的機器學習任務。**作為類比,如果你需要打掃房子,你可能會用到吸塵器、掃帚或是拖把,但你絕對不該掏出鏟子來挖地。
  • 不妨先看看這篇文章
    不妨先看看這篇文章2020/10/19 13:30:49 來源:新化月報 【字體:大 中 小】【收藏本頁】【列印】【關閉】核心提示:微粒貸自上線以來就備受好評,但是微粒貸採用的官方邀請制,只有受邀用戶才能在微信支付和手Q錢包中看到微粒貸的入口。有很多想用微粒貸的朋友不知道該怎麼做才能成為微粒貸的受邀用戶,怎麼才能開通微粒貸。
  • 機器學習特徵選擇常用算法
    綜述本文引用地址:http://www.eepw.com.cn/article/201807/383585.htm(1) 什麼是特徵選擇特徵選擇 ( Feature Selection )也稱特徵子集選擇( Feature Subset Selection , FSS ) ,或屬性選擇( Attribute Selection ) ,是指從全部特徵中選取一個特徵子集,使構造出來的模型更好
  • 在機器學習回歸問題中,你應該使用哪種評估指標?
    調整後的R說明增加了更多的預測變量(特徵)。當一個新的預測變量對模型性能的改善超過預期時,調整後的R只會隨著該變量的增加而增加。調整後的R有助於您集中精力使用最節省的模型。調整後的R在統計推斷中比在機器學習中更常見。scikitlearn是用於機器學習的主要Python庫,甚至沒有調整過的R度量。Statsmodels是Python的主要統計庫。
  • 當機器學習遇上運動鞋:摩擦,在這光滑的地上摩擦
    數據團隊構建一系列工具和服務,利用數據科學和機器學習,儘可能減少該社區可能出現的問題。當我加入 GOAT 時,我並不是一個運動鞋狂熱愛好者。每天在處理新款運動鞋的同時,我更傾向於使每一個都有獨一無二的視覺特徵。我開始疑惑那些剛接觸這種文化的人會以何種方式進入這個領域。我覺得,無論你對於運動鞋的審美水平如何,我們都可以傳達他們的視覺吸引力。
  • 這篇文章,告訴你蛋白粉的功效與作用
    很多人都知道,蛋白粉中含有豐富的蛋白質,因此,想要了解蛋白粉的功效和作用,首先就要清楚地認知蛋白質對人體的重要性。1、蛋白質的功效和作用蛋白質是生命物質的基礎,沒有蛋白質,就沒有生命。人體每日約有3%的蛋白質會進行更新,這部分的蛋白質攝入必不可少。
  • 文科生如何入門機器學習:先看看這篇零基礎教程,再多算幾遍
    文科生如何入門機器學習:先看看這篇零基礎教程,再多算幾遍 2019-08-05 08:04 來源:澎湃新聞·澎湃號·湃客
  • 想入門AI,機器學習你知多少了?
    01 機器學習(Machine Learning)1.這三步中基本上就是轉化為數學問題,後面會單獨寫一篇文章說明如何將一個AI模型轉化為數學的求解問題,其中主要涉及的一些專稱有:預測函數、代價函數、誤差、梯度下降、收斂、正則化、反向傳播等等,感興趣的同學可以關注下。02 監督學習(Supervised Learning)監督學習是從已標記的訓練數據來推斷一個功能的機器學習任務,主要特點就是訓練數據是有標籤的。
  • Python機器學習10:機器學習中的六種分類算法及實現(上)
    在機器學習中,可以使用多種算法模型解決同一個問題,那麼如何從中選擇出最佳的算法模型呢?當然,這個問題沒有一種固定的答案,需要根據不同的問題,嘗試使用多種機器學習方法,比較各種算法模型在該問題上的效果,最終才能決定究竟選擇哪一種模型。
  • 陳天奇:機器學習科研的十年
    KDD12 在北京,放棄了一個過年的時間,我完成了第一篇關於基於特徵的分布式矩陣分解論文,並且非常興奮地投到了 KDD。四月底的時候,我們收到了 KDD 的提前拒搞通知 -- 論文連第一輪評審都沒有過。收到拒搞通知時候的我的心情無比沮喪,因為這是第一篇自己大部分獨立推動完成的文章。
  • 蘋果連發三篇機器學習新研究:全是講如何讓Siri更厲害
    蘋果上月推出的機器學習博客今天連更3篇新文,全部是有關Siri的研究技術。三篇講了啥?在這篇題為《Deep Learning for Siri’s Voice: On-device Deep Mixture Density Networks for Hybrid Unit Selection Synthesis》的文章中,蘋果介紹了Siri語音合成技術的演變過程,並對比從iOS 9到即將應用在新版本中iOS 11的聲音變化,詳細說明Siri的進化過程。
  • 機器學習算法一覽(附python和R代碼)
    那麼誰能從這篇文章裡收益最多呢? 這篇文章有可能是我寫的所有文章裡最有價值的一篇。 寫這篇文章的目的,就是希望它可以讓有志於從事數據科學和機器學習的諸位在學習算法的路上少走些路。我會在文章中舉例一些機器學習的問題,你們也可以在思考解決這些問題的過程中得到啟發。
  • 資源| 25個機器學習面試題,期待你來解答
    事實上,網絡上有很多關於「機器學習面試問題」的文章,本文希望能稍微用不一樣的、有趣的方式來討論這些問題。聲明:我將這些問題列舉出來只是為了啟發大家的思考,促進相關的討論。這個問題並沒有現成的答案。我們會對某些問題給出提示,而這只是為了引發進一步的討論,而不是給出了一個確切的答案。每個問題都值得被更詳細地討論,因此也就沒有固定答案。