特徵選擇演算法研究
A. CFS的特徵選擇演算法
基於關聯規則的特徵選擇演算法(correlation-based feature selection),是一種經典的過濾器模式的特徵選擇方法。源自論文「correlation-based feature selection for discrete and numeric class machine learning」,啟發地對單一特徵 對應於每個分類的作用進行評價,從而得到最終的特徵子集。特別地,特徵必須是離散的隨機變數,如果是數值型變數,需要首先執行指導的離散化方法來進行離散化特徵。
B. 特徵選擇:11 種特徵選擇策略總結
太多的特徵會增加模型的復雜性和過擬合,而太少的特徵會導致模型的擬合不足。將模型優化為足夠復雜以使其性能可推廣,但又足夠簡單易於訓練、維護和解釋是特徵選擇的主要工作。
「特徵選擇」意味著可以保留一些特徵並放棄其他一些特徵。本文的目的是概述一些特徵選擇策略:
該演示的數據集在 MIT 許可下發布,來自 PyCaret——一個開源的低代碼機器學習庫。
數據集相當干凈,但我做了一些預處理。 請注意,我使用此數據集來演示不同的特徵選擇策略如何工作,而不是構建最終模型,因此模型性能無關緊要。
首先載入數據集:
該數據集包含 202 行和 26 列——每行代表一個 汽車 實例,每列代表其特徵和相應的價格。 這些列包括:
現在讓我們深入研究特徵選擇的 11 種策略。
當然,最簡單的策略是你的直覺。雖然是直覺,但有時很有用的,某些列在最終模型中不會以任何形式使用(例如「ID」、「FirstName」、「LastName」等列)。 如果您知道某個特定列將不會被使用,請隨時將其刪除。 在我們的數據中,沒有一列有這樣的問題所以,我在此步驟中不刪除任何列。
缺失值在機器學習中是不可接受的,因此我們會採用不同的策略來清理缺失數據(例如插補)。 但是如果列中缺少大量數據,那麼完全刪除它是非常好的方法。
無論演算法是回歸(預測數字)還是分類(預測類別),特徵都必須與目標相關。 如果一個特徵沒有表現出相關性,它就是一個主要的消除目標。 可以分別測試數值和分類特徵的相關性。
數值變數
在此示例中, peak-rpm , compression-ratio, stroke, bore, height , symboling 等特徵與價格幾乎沒有相關性,因此我們可以刪除它們。
可以手動刪除列,但我更喜歡使用相關閾值(在本例中為 0.2)以編程方式進行:
分類變數
可以使用箱線圖查找目標和分類特徵之間的相關性:
柴油車的中位價高於汽油車。 這意味著這個分類變數可以解釋 汽車 價格,所以應放棄它。 可以像這樣單獨檢查每個分類列。
檢查一下我們的特徵的差異:
這里的「bore」具有極低的方差,雖然這是刪除的候選者。 在這個特殊的例子中,我不願意刪除它,因為它的值在2.54和3.94之間,因此方差很低:
df['bore'].describe()
當任何兩個特徵之間存在相關性時,就會出現多重共線性。 在機器學習中,期望每個特徵都應該獨立於其他特徵,即它們之間沒有共線性。 高馬力車輛往往具有高發動機尺寸。 所以你可能想消除其中一個,讓另一個決定目標變數——價格。
我們可以分別測試數字和分類特徵的多重共線性:
數值變數
Heatmap 是檢查和尋找相關特徵的最簡單方法。
大多數特徵在某種程度上相互關聯,但有些特徵具有非常高的相關性,例如長度與軸距以及發動機尺寸與馬力。
可以根據相關閾值手動或以編程方式刪除這些功能。 我將手動刪除具有 0.80 共線性閾值的特徵。
還可以使用稱為方差膨脹因子 (VIF) 的方法來確定多重共線性並根據高 VIF 值刪除特徵。 我稍後會展示這個例子。
分類變數
與數值特徵類似,也可以檢查分類變數之間的共線性。 諸如獨立性卡方檢驗之類的統計檢驗非常適合它。
讓我們檢查一下數據集中的兩個分類列——燃料類型和車身風格——是獨立的還是相關的。
然後我們將在每一列中創建一個類別的交叉表/列聯表。
最後,我們將在交叉表上運行卡方檢驗,這將告訴我們這兩個特徵是否獨立。
輸出依次是卡方值、p 值、自由度和預期頻率數組。
p 值