【機器學習】Feature selection – Part I: univariate selection
Feature selection – Part I: univariate selection
特徵選擇——1:單變數選擇
原文連結:http://blog.datadive.net/selecting-good-features-part-i-univariate-selection/
對於資料科學家或機器學習實踐者來說,對特徵選擇/排序有良好的理解可能是一大財富。對這些方法的良好掌握導致更好地執行模型,更好地理解資料的底層結構和特徵,並導致對許多機器學習模型底層演算法的更直觀。
一般來說,使用特徵選擇的原因有兩個:
1.減少特徵數量,減少過擬合,提高模型的泛化能力。
2.為了更好地理解特性及其與響應變數的關係。
這兩個目標常常相互矛盾,因此需要不同的方法:根據手頭的資料,對目標(1)有利的特徵選擇方法不一定對目標(2)有利,反之亦然。然而,似乎經常發生的是人們不加區別地使用他們最喜歡的方法(或者從他們選擇的工具最方便訪問的任何方法),特別是更適合於(1)實現(2)的方法。
同時,特徵選擇在機器學習或資料探勘教材中沒有特別全面地涵蓋,部分原因是它們常常被視為學習演算法的天然副作用,因此不需要單獨描述。
在這篇博文中,我將嘗試介紹一些更流行的特性選擇方法,以及它們的優缺點和缺點,以及Python和scikit-learning中的程式碼示例。我還將在一個示例資料集上並排執行這些方法,這應該會突出它們之間的一些主要差異。在我的所有示例中,我主要討論迴歸資料集,但是大多數討論和示例同樣適用於分類資料集和方法。
單變數特徵選擇
單變數特徵選擇分別檢查每個特徵,以確定特徵與響應變數之間的關係的強度。這些方法易於執行和理解,並且通常特別有利於更好地理解資料(但不一定是為了更好地泛化而優化特徵集)。單變數選擇有許多不同的選項。
皮爾遜相關係數
理解特徵與響應變數之間關係的最簡單方法之一是皮爾遜相關係數,它測量兩個變數之間的線性相關性。所得值在[-1;1]中,-1表示完全負相關(隨著一個變數增加,另一個變數減少),+1表示完全正相關,0表示兩個變數之間的非線性相關。
它快速且易於計算,並且通常是在資料上執行的第一件事。Scipy的pearsonr方法計算相關性和p值,粗略地顯示了不相關係統產生這種大小的相關性值的概率。
import numpy as np
from scipy.stats import pearsonr
np.random.seed(0)
size = 300
x = np.random.normal(0, 1, size)
print("Lower noise", pearsonr(x, x + np.random.normal(0, 1, size)))
print("Higher noise", pearsonr(x, x + np.random.normal(0, 10, size)))
正如你從示例中看到的,我們將變數本身與它的帶噪聲版本進行比較。對於較小的噪聲量,相關性相對較強,具有非常低的p值,而對於噪聲比較高的,相關性就非常小,而且,p值很高,這意味著很可能純粹偶然地在這種大小的資料集上觀察到這種相關性。
Scikit-learning提供了f_regrssion方法,用於為一組特徵批量計算p值(和底層F-值),因此它是一次對資料集執行相關測試的方便方法,例如將其包括在sklearn in的流水線中。
Pearson相關性作為特徵排序機制的一個明顯的缺點是它僅對線性關係敏感。如果關係是非線性的,那麼即使兩個變數之間存在1-1對應,Pearson相關也可以接近於零。
例如,當x以0為中心時,x和之間的相關性為零。
x = np.random.uniform(-1, 1, 100000)
print(pearsonr(x, x**2)[0])
有關與上面類似的更多示例,請參閱以下示例繪圖。
此外,正如Anscombe所說明的,僅僅依靠相關值來解釋兩個變數之間的關係可能具有很高的誤導性,因此總是值得對資料進行繪圖。
互資訊和最大資訊係數
另一個更穩健的相關性估計選項是互資訊,定義為
它測量變數之間的相互依賴性,通常以位元為單位。
但是,由於兩個原因,直接用於特徵排序可能不方便。首先,它不是度量,也不標準化(即不在固定範圍內),所以MI值在兩個資料集之間可以是不可比較的。其次,計算連續變數會帶來不便:一般來說,變數需要通過裝箱進行離散化,但是互資訊得分對裝箱選擇非常敏感。
最大資訊係數是為了克服這些缺點而開發的一種技術。它搜尋最優的裝箱,並將互資訊得分轉換為位於範圍[0;1]中的度量。在python中,MI在minepy庫中可用。
回顧示例,MIC發現互資訊是1,即最大。
from minepy import MINE
m = MINE()
x = np.random.uniform(-1, 1, 10000)
m.compute_score(x, x**2)
print(m.mic())
結果為1.0
關於MIC的統計能力,即當空假設為假時拒絕空假設的能力,一直存在一些批評。根據特定的資料集及其噪聲,這可能是一個問題,也可能不是問題。
距離相關
另一種穩健的、相互競爭的相關估計方法是距離相關,它明確地設計用於解決皮爾遜相關的缺點。雖然對於Pearson相關,相關值0並不意味著獨立性(如從x vs 示例中看到的),但是距離相關性0確實意味著兩個變數之間沒有相關性。
距離相關性在R的energy包中可用(並且還有一個Python gist)。
當這種關係接近線性時,為什麼偏愛皮爾遜相關而不是更復雜的方法,如MIC或距離相關,至少有兩個原因。首先,計算Pearson相關性要快得多,這對於大型資料集可能很重要。其次,相關係數的範圍是[-1;1](而不是MIC和距離相關的[0;1])。這可以傳遞關於關係是負還是正的有用的額外資訊,即,更高的特徵值是否意味著響應變數的更高值,反之亦然。但是,當然,只有當兩個變數之間的關係是單調時,負相關和正相關的問題才成立。
基於模型的排序
最後,可以採用任意的機器學習方法,利用每個單獨的特徵建立響應變數的預測模型,並測量每個模型的效能。事實上,這已經用於皮爾遜相關係數,因為它等價於線性迴歸中用於預測的標準化迴歸係數。如果特徵和響應變數之間的關係是非線性的,那麼有許多替代方法,例如基於樹的方法(決策樹、隨機森林)、具有基擴充套件的線性模型等。基於樹的方法可能是最容易應用的方法之一,因為它們能夠很好地建模非線性關係,並且不需要太多。調諧。避免過擬合是最主要的,因此樹的深度應該相對較小,並且應該應用交叉驗證。
這裡是使用sklearning的隨機森林迴歸器在波士頓房價資料集上的單變數選擇,這個樣本包括波士頓郊區的房價以及一些關鍵屬性。
from sklearn.cross_validation import cross_val_score, ShuffleSplit
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
#Load boston housing dataset as an example
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
rf = RandomForestRegressor(n_estimators=20, max_depth=4)
scores = []
for i in range(X.shape[1]):
score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
cv=ShuffleSplit(len(X), 3, .3))
scores.append((round(np.mean(score), 3), names[i]))
print(sorted(scores, reverse=True))
[(0.68400000000000005, 'LSTAT'), (0.58499999999999996, 'RM'), (0.42599999999999999, 'NOX'), (0.40500000000000003, 'INDUS'), (0.311, 'PTRATIO'), (0.27400000000000002, 'TAX'), (0.21299999999999999, 'ZN'), (0.20999999999999999, 'CRIM'), (0.20599999999999999, 'RAD'), (0.096000000000000002, 'DIS'), (0.072999999999999995, 'B'), (0.023, 'CHAS'), (-0.017999999999999999, 'AGE')]
總結
一般來說,單變數的特徵選擇最好能更好地理解資料、其結構和特徵。在某些設定中,它可以用於選擇用於模型改進的頂部特徵,但是由於它不能去除冗餘(例如,在強相關特徵的子集中僅選擇最佳特徵),所以最好將此任務留給其他方法。這就引出了下一個主題:選擇好的特性。第二部分:線性模型和正則化。