特徵預處理是數據挖掘中最重要的步驟。在這篇文章中,我將向你介紹特徵預處理的概念,它的重要性,不同的機器學習模型下的數值特徵的不同特徵預處理技術。
模型的質量在很大程度上取決於輸入模型的數據。當從數據挖掘過程中收集數據時,會丟失一些數據(我們將其稱為丟失值)。此外,它很容易受到噪音的影響。這都導致低質量數據的結果,正如你可能已經聽說過的,模型的好壞取決於它所訓練的數據。
這就是特徵預處理的由來,特徵預處理將原始數據轉換為機器學習模型可用的數據。
不同類型的機器學習模型
首先,讓我們看看機器學習模型的不同類別。這裡,我們將模型分為兩種類型:
基於樹的模型:基於樹的模型是一種監督學習模型,能夠在捕捉複雜非線性關係的同時提供高精度和穩定性。基於樹的決策樹模型有隨機森林模型和梯度增強決策樹模型。非樹模型:所有其他監督學習模型都屬於非樹模型的範疇。線性模型、K近鄰模型和神經網絡是基於非樹模型的一些例子。不同的數據類型或特徵
一個數據集可以包含各種數據類型或特徵。以下是一些最常見的數據類型:
數值特徵分類特徵和順序特徵日期和時間文本圖像不同的數據類型和不同的機器學習模型需要不同類型的特徵預處理。一些預處理方法對於所有數據類型都是通用的。
數值數據的特徵預處理
數值數據有測量或計數的意義。數值數據的例子包括僱員的工資、年齡和擁有的房屋數量。數值數據可以進一步分為兩種類型:離散型和連續型。在上面的例子中,一個員工的工資是連續的數據,一個人的年齡和擁有的房屋數量是離散的數據。
讓我們研究一下來自Kaggle的SF salary數據集中舊金山市的員工工資數據。
在這個數據集中,特徵BasePay, OvertimePay, OtherPay, TotalPay, TotalPayBenefits和Year是數值特徵。
讓我們選擇一個特徵並對其進行探索性數據分析。
這裡是TotalPay特徵的直方圖。
從上圖中我們可以看出,數據的分布是巨大的。值的範圍從0到50,000左右。
如果我們使用panda中的describe()函數看數據分布,我們得到:
count 148654.000000mean 74768.321972std 50517.005274min -618.13000025% 36168.99500050% 71426.61000075% 105839.135000max 567595.430000Name: TotalPay, dtype: float64為了有效地使用該特徵,我們需要使用以下任何一種方法對該特徵進行預處理。
1. 特徵縮放(歸一化)
特徵縮放是一種對數據的自變量或特徵範圍進行歸一化的方法。它通常被稱為標準化。與基於樹的模型相比,特徵縮放對非樹模型的影響更大。因此,如果你想使用非基於樹的模型獲得良好的結果,你應該考慮規範化你的數值特徵。
有不同的方法來歸一化特徵。以下是一些常見的例子:
Rescaling (Min-Max歸一化):這是一種最簡單的歸一化,將特徵重新劃分為[0,1]範圍。
下面是使用sklearn庫中的MinMaxScaler函數在python中執行Min-Max歸一化的代碼片段。
from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()TotalPayReshaped = df.TotalPay.as_matrix().reshape(-1, 1)df.TotalPay = scaler.fit_transform(TotalPayReshaped)df.hist(figsize=(15,6), column=[『TotalPay』])
對TotalPay特徵進行Min-Max歸一化後使用describe()查看的結果如下。我們可以看到TotalPay的最小值是0,最大值是1。
count 148654.000000mean 0.132673std 0.088905min 0.00000025% 0.06474250% 0.12679275% 0.187354max 1.000000Name: TotalPay, dtype: float64Standardization (Z-score歸一化):在這種歸一化中,對一個特徵進行縮放,使其均值為零,方差為1。
讓我們對原始的TotalPay特徵執行Z-score歸一化。下面是使用sklearn庫中的StandardScaler函數在python中執行此類歸一化的代碼片段。
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()TotalPayReshaped = df.TotalPay.as_matrix().reshape(-1, 1)df.TotalPay = scaler.fit_transform(TotalPayReshaped)df.hist(figsize=(15,6), column=[『TotalPay』])
對TotalPay特徵進行Z-score歸一化後的結果如下。我們可以看到,TotalPay的均值接近於0,標準差為1。
count 1.486540e+05mean -2.707706e-15std 1.000003e+00min -1.492304e+0025% -7.640884e-0150% -6.615046e-0275% 6.150586e-01max 9.755700e+00Name: TotalPay, dtype: float642. 離群值刪除
在統計學中,離群點是一個與其他觀測值距離較遠的觀測點。 --維基百科
有時,通過從數據中刪除離群值,可以顯著提高機器學習模型的性能。對於非基於樹的模型也是如此。另一方面,基於樹的模型對離群值具有較強的魯棒性。
下面的代碼片段將從TotalPay特徵中刪除1%的數據。
x = df.TotalPayUPPERBOUND, LOWERBOUND = np.percentile(x, [1,99])y = np.clip(x, UPPERBOUND, LOWERBOUND)pd.DataFrame(y).hist()
去除離群值後使用describe()查看TotalPay特徵的結果如下。
count 148654.000000mean 74502.923277std 49644.336571min 286.97100025% 36168.99500050% 71426.61000075% 105839.135000max 207015.797400Name: TotalPay, dtype: float643. 排序變換
基於非樹的模型可以從秩變換中獲益。如果你沒有時間手動處理離群值,這是一種非常方便的技術。當變量是標稱變量時,排序變換特別有用,在標稱變量中,不同值之間的順序比值更重要。
可以使用scipy庫中的rankdata方法將特徵值轉換為對應排序後的索引。
4. 對數變換
當你希望降低數據的可變性時,對數變換是另一種常用的技術。對數變換的另一個流行用法是當數據分布高度傾斜時。
下面是用Python執行對數變換的代碼片段。
df['LogTotalPay'] = np.log(1+df.TotalPay)
對TotalPay特徵執行對數變換後使用describe()的結果如下。值的範圍從最小值-618.130和最大值567595.43更改為最小值0.00和最大值13.25。通過對這個特徵執行對數變換,我們已經減少了數據中的方差,即原始特徵的標準差約為50,500,而對數變換特徵的標準差為1.41。
count 148653.000000mean 10.739295std 1.413888min 0.00000025% 10.49599350% 11.17644675% 11.569692max 13.249166Name: LogTotalPay, dtype: float64在本文中,我討論了為什麼特徵預處理被認為是數據挖掘過程中的一個重要步驟。我列出了數據集中不同類型的特徵,並簡要討論了基於樹和非基於樹的模型。然後,通過代碼示例和直方圖圖,詳細闡述了數值特徵常用的特徵預處理技術,包括歸一化、離群點去除和對數變換等。
你最常用什麼預處理技術來處理數值特徵?為什麼?請在下面的評論中留下你的想法。