透過強化學習策略進行特徵選擇

2024.05.31

特徵選擇是建立機器學習模型過程中的決定性步驟。為模型和我們想要完成的任務選擇好的特徵,可以提高效能。

如果我們處理的是高維度資料集,那麼選擇特徵就顯得特別重要。它使模型能夠更快更好地學習。我們的想法是找到最優數量的特徵和最有意義的特徵。

在本文中,我們將介紹並實現一種新的透過強化學習策略的特徵選擇。我們先討論強化學習,尤其是馬可夫決策過程。它是資料科學領域的一種非常新的方法,尤其適用於特徵選擇。然後介紹它的實作以及如何安裝和使用python函式庫(FSRLearning)。最後再使用一個簡單的範例來示範這個過程。

強化學習:特徵選擇的馬可夫決策問題

強化學習(RL)技術可以非常有效地解決像遊戲解決這樣的問題。而強化學習的概念是基於馬可夫決策過程(MDP)。這裡的重點不是要深入定義而是要大致了解它是如何運作的,以及它如何對我們的問題有用。

強化學習背後的想法是,代理從一個未知的環境開始。採取行動來完成任務。在代理在當前狀態和他之前選擇的行為的作用下,會更傾向於選擇一些行為。在每到達一個新狀態並採取行動時,代理人都會獲得獎勵。以下是我們需要為特徵選擇而定義的主要參數:

狀態、行動、獎勵、如何選擇行動

首先,狀態是資料集中存在的特徵的子集。例如,如果資料集有三個特徵(年齡,性別,身高)加上一個標籤,則可能的狀態如下:

[]                                             --> Empty set                          
 [Age], [Gender], [Height]                       --> 1-feature set
 [Age, Gender], [Gender, Height], [Age, Height] --> 2-feature set
 [Age, Gender, Height]                           --> All-feature set
  • 1.
  • 2.
  • 3.
  • 4.

在一個狀態中,特徵的順序並不重要,我們必須把它看成一個集合,而不是一個特徵列表。

對於動作,我們可以從一個子集轉到任何一個尚未探索的特性的子集。在特徵選擇問題中,動作是選擇在當前狀態下尚未探索的特徵,並將其新增至下一個狀態。以下是一些可能的動作:

[Age] -> [Age, Gender]
 [Gender, Height] -> [Age, Gender, Height]
  • 1.
  • 2.

下面是一個不可能動作的例子:

[Age] -> [Age, Gender, Height]
 [Age, Gender] -> [Age]
 [Gender] -> [Gender, Gender]
  • 1.
  • 2.
  • 3.

我們已經定義了狀態和動作,還沒有定義獎勵。獎勵是一個實數,用於評估狀態的品質。

在特徵選擇問題中,一個可能的獎勵是透過添加新特徵而提高相同模型的準確率指標。下面是一個如何計算獎勵的範例:

[Age] --> Accuracy = 0.65
 [Age, Gender] --> Accuracy = 0.76
 Reward(Gender) = 0.76 - 0.65 = 0.11
  • 1.
  • 2.
  • 3.

對於我們首次訪問的每個狀態,都會使用一組特徵來訓練一個分類器(模型)。這個值儲存在該狀態和對應的分類器中,訓練分類器的過程是費時費力的,所以我們只訓練一次。因為分類器不會考慮特徵的順序,所以我們可以將這個問題視為圖形而不是樹。在這個例子中,選擇「性別」作為模型的新特徵的操作的獎勵是當前狀態和下一個狀態之間的準確率差值。

在上圖中,每個特徵都被映射為一個數字(「年齡」為1,「性別」為2,「身高」為3)。我們如何從當前狀態中選擇下一個狀態或我們如何探索環境?

我們必須找到最優的方法,因為如果我們在一個有10個特徵的問題中探索所有可能的特徵集,那麼狀態的數量將是

10! + 2 = 3 628 802
  • 1.

這裡的+2是因為考慮一個空狀態和一個包含所有可能特徵的狀態。我們不可能在每個狀態下都訓練一個模型,這是不可能完成的,而且這只是有10個特徵,如果有100個特徵那基本上就是無解了。

但在強化學習方法中,我們不需要在所有的狀態下都去訓練一個模型,我們要為這個問題確定一些停止條件,例如從當前狀態隨機選擇下一個動作,機率為epsilon(介於0和1之間,通常在0.2左右),否則選擇使函數最大化的動作。對於特徵選擇是每個特徵對模型精確度帶來的獎勵的平均值。

這裡的貪心演算法包含兩個步驟:

1.以機率為epsilon,我們在目前狀態的可能鄰居中隨機選擇下一個狀態

2.選擇下一個狀態,使加入到目前狀態的特徵對模型的精確度貢獻最大。為了減少時間複雜度,可以初始化了一個包含每個特徵值的清單。每當選擇一個特性時,此清單就會更新。使用以下公式,更新是非常理想的:

AORf:特徵「f」帶來的獎勵的平均值

K: f被選中的次數

V(F):特徵集F的狀態值(為了簡單描述,本文不詳細介紹)

所以我們就找出哪個特徵為模型帶來了最高的準確度。這就是為什麼我們需要瀏覽不同的狀態,在許多不同的環境中評估模型特徵的最全局準確值。

因為目標是最小化演算法存取的狀態數,所以我們所訪問的未訪問過的狀態越少,需要用不同特徵集訓練的模型數量就越少。因為從時間和運算能力的角度來看,訓練模型以獲得精確度是最昂貴方法,我們要盡量減少訓練的次數。

最後在任何情況下,演算法都會停止在最終狀態(包含所有特徵的集合)而我們希望避免達到這種狀態,因為用它來訓練模型是最昂貴的。

上面就是我們針對於特徵選擇的強化學習描述,以下將詳細介紹在python中的實現。

用於特徵選擇與強化學習的python函式庫

有一個python函式庫可以讓我們直接解決這個問題。但是首先我們先準備數據

我們直接使用UCI機器學習庫中的資料:

#Get the pandas DataFrame from the csv file (15 features, 690 rows)
 australian_data = pd.read_csv('australian_data.csv', header=None)
 
 #DataFrame with the features
 X = australian_data.drop(14, axis=1)
 
 #DataFrame with the labels
 y = australian_data[14]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

然後安裝我們用到的函式庫

pip install FSRLearning
  • 1.

直接導入

from FSRLearning import Feature_Selector_RL
  • 1.

Feature_Selector_RL類別就可以建立一個特性選擇器。我們需要以下的參數

feature_number (integer): DataFrame X中的特性數量

feature_structure (dictionary):用於圖實作的字典

eps (float [0;1]):隨機選擇下一狀態的機率,0為貪婪演算法,1為隨機演算法

alpha (float [0;1]):控制更新速率,0表示不更新狀態,1表示經常更新狀態

gamma (float[0,1]):下一狀態觀察的調節因子,0為近視行為狀態,1為遠視行為

nb_iter (int):遍歷圖的序列數

starting_state (" empty "或" random "):如果" empty ",則演算法從空狀態開始,如果" random ",演算法從圖中的隨機狀態開始

所有參數都可以機型調節,但對於大多數問題來說,迭代大約100次就可以了,而epsilon值在0.2左右通常就足夠了。起始狀態對於更有效地瀏覽圖形很有用,但它非常依賴資料集,兩個值都可以測試。

我們可以用下面的程式碼簡單地初始化選擇器:

fsrl_obj = Feature_Selector_RL(feature_number=14, nb_iter=100)
  • 1.

與大多數ML庫相同,訓練演算法非常簡單:

results = fsrl_obj.fit_predict(X, y)
  • 1.

下面是輸出的一個例子:

輸出是一個5元組,如下所示:

DataFrame X中特性的索引(類似映射)

特徵被觀察的次數

所有迭代後特徵帶來的獎勵的平均值

從最不重要到最重要的特徵排序(這裡2是最不重要的特徵,7是最重要的特徵)

全域存取的狀態數

也可以與Scikit-Learn的RFE選擇器進行比較。它將X, y和選擇器的結果作為輸入。

fsrl_obj.compare_with_benchmark(X, y, results)
  • 1.

輸出是在RFE和FSRLearning的全域度量的每一步選擇之後的結果。它還輸出模型精度的可視化比較,其中x軸表示所選特徵的數量,y軸表示精度。兩條水平線是每種方法的準確度中位數。

Average benchmark accuracy : 0.854251012145749, rl accuracy : 0.8674089068825909
 Median benchmark accuracy : 0.8552631578947368, rl accuracy : 0.868421052631579
 Probability to get a set of variable with a better metric than RFE : 1.0
 Area between the two curves : 0.17105263157894512
  • 1.
  • 2.
  • 3.
  • 4.

可以看到RL方法總是為模型提供比RFE更好的特徵集。

另一個有趣的方法是get_plot_ratio_exploration。它繪製了一個圖,比較一個精確迭代序列中已經訪問節點和訪問節點的數量。

由於設定了停止條件,演算法的時間複雜度呈指數級降低。即使特徵的數量很大,收斂性也會很快被發現。下面的圖表示一定大小的集合被造訪的次數。

在所有迭代中,演算法存取包含6個或更少變數的狀態。在6個變數之外,我們可以看到達到的狀態數量正在減少。這是一個很好的行為,因為用小的特徵集訓練模型比用大的特徵集訓練模型要快。

總結

我們可以看到RL方法對於最大化模型的度量是非常有效的。它總是很快地收斂到一個有趣的特性子集。此方法在使用FSRLearning函式庫的ML專案中非常容易且快速地實作。