數(shù)據(jù)預處理方法大全+實戰(zhàn)代碼(五)--特征工程

前言

數(shù)據(jù)清洗的第一步:缺失值處理、異常值檢測、數(shù)據(jù)一致性處理,筆者上幾篇給出了原理和示例代碼,這些也是特征工程里面的內(nèi)容。
數(shù)據(jù)和特征決定了算法的上限。,本篇著重講解特征工程。提到的特征工程和數(shù)據(jù)預處理是什么關(guān)系?特征工程又是什么?

用通俗易懂的話,數(shù)據(jù)預處理重在數(shù)據(jù),確保數(shù)據(jù)質(zhì)量,特征工程重在特征選擇,特征是從數(shù)據(jù)中提取的來的,所以兩者的關(guān)系不可分開。也可以說特征工程依賴于數(shù)據(jù)預處理。


1、什么是特征工程

一張圖說明特征工程有什么

2、數(shù)據(jù)變換:調(diào)整數(shù)據(jù)的尺度

數(shù)據(jù)的尺度、分布特性影響模型的選擇、性能,最常用的方法:

  • 標準化(Standardization)和歸一化(Normalization),適應于比例尺度

  • 類別編碼:獨熱編碼/標簽編碼,適應于名義尺度

數(shù)據(jù)尺度說的是數(shù)據(jù)類型和測量級別,分為名義尺度(Nominal Scale),用于分類數(shù)據(jù),如性別(男、女);序數(shù)尺度(Ordinal Scale),分類之間存在邏輯順序或等級,如教育程度(小學、中學、大學); 區(qū)間尺度(Interval Scale):可以進行加減運算,但不能進行乘除運算,如溫度(攝氏度、華氏度);比例尺度(Ratio Scale):可以進行加減乘除運算,如身高、體重等。

數(shù)據(jù)分布指的是數(shù)據(jù)點在數(shù)值范圍內(nèi)的分布情況,它描述了數(shù)據(jù)的集中趨勢、離散程度和分布形態(tài)。均勻分布(Uniform Distribution)、正態(tài)分布(Normal Distribution)偏態(tài)分布(Skewed Distribution)、雙峰分布(Bimodal Distribution)指數(shù)分布(Exponential Distribution)、泊松分布(Poisson Distribution)。

2.1 標準化(Standardization)

最常見的Z-Score標準化

  • 原理:將數(shù)據(jù)轉(zhuǎn)換為均值為 0,標準差為 1 的標準正態(tài)分布。改變數(shù)據(jù)范圍和數(shù)據(jù)分布形態(tài)。
  • 計算方法
    z = \frac{x - \mu}{\sigma}
    公式說明,x 原始數(shù)據(jù),\mu均值,\sigma標準差,z是標準化后的值。
  • 代碼
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)  # 標準化 X

RobustScaler標準化

  • 原理:它數(shù)據(jù)的中位數(shù)和四分位數(shù)范圍(IQR)進行縮放和中心化,對異常值具有更高的魯棒性,特別適用于包含離群值的數(shù)據(jù)集。
  • 計算方法
    X_{robust} = \frac{X - \text{median}(X)}{\text{IQR}(X)}
    公式說明,X是原始數(shù)據(jù),median(X)是中位數(shù),IQR(X)$是四分位數(shù)范圍。IQR是四分位距(75th percentile - 25th percentile)。
  • 代碼
from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()
X_scaler = scaler.fit_transform(X)  # 標準化 X

2.2 歸一化(Normalization)

最小-最大歸一化(Min-Max Normalization)

  • 原理:將數(shù)據(jù)按比例縮放在固定范圍內(nèi),如 [0, 1] 或 [-1, 1],不改變數(shù)據(jù)的分布形態(tài)。
  • 計算方法
    x' = \frac{x - \min(x)}{\max(x) - \min(x)}

公式說明,x原始數(shù)據(jù),min(x)max(x)分別是數(shù)據(jù)集中的最小值和最大值,x'是歸一化后的值。

  • 代碼
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X)  # 歸一化 X
標準化和歸一化區(qū)別
  • 標準化:適用于數(shù)據(jù)分布未知或接近正態(tài)分布的情況,對于距離計算的算法,如線性回歸、SVM等。因為特征的尺度不一樣導致某些對模型的影響過大,標準化能確保每個特征對模型有相同的貢獻

  • 歸一化:適用于數(shù)據(jù)范圍固定且已知的情況,對于數(shù)據(jù)范圍敏感的算法,如KNN、K-Means、神經(jīng)網(wǎng)絡等。歸一化有助于加速收斂。


3、數(shù)據(jù)分布調(diào)整

3.1 分位數(shù)變換(Quantile Transformation)

  • 原理:將數(shù)據(jù)的分布轉(zhuǎn)換為均勻分布或正態(tài)分布,一種非參數(shù)變換方法。
  • 計算方法
    q = \frac{k + 0.5}{n}
    公式說明,k 是數(shù)據(jù)點在排序后數(shù)據(jù)集中的位置(從0開始),n 是數(shù)據(jù)集中的樣本總數(shù)。分位數(shù) q 可以映射到新的分布上,例如均勻分布U(0, 1)或正態(tài)分布N(0, 1)。若目標是均勻分布,直接使用q作為變換后的值;如果目標是正態(tài)分布,可以使用標準正態(tài)分布的逆累積分布函數(shù) \Phi^{-1}來映射:

x' = \Phi^{-1}(q)
其中,\Phi^{-1} 是標準正態(tài)分布的逆CDF。

  • 代碼
from sklearn.preprocessing import QuantileTransformer
qt = QuantileTransformer()
X_trans = qt.fit_transform(X) # 分位數(shù)變化

3.2 Box-Cox變換

  • 原理:用于將具有正偏態(tài)分布的數(shù)據(jù)轉(zhuǎn)換為近似正態(tài)分布,是一種參數(shù)化變換方法,。其公式為:

y(\lambda) = \begin{cases} \frac{y^\lambda - 1}{\lambda} & \text{if } \lambda \neq 0 \\ \log(y) & \text{if } \lambda = 0 \end{cases}

公式說明y是原始數(shù)據(jù),\lambda是變換參數(shù),需要通過數(shù)據(jù)來估計。

  • 代碼
from sklearn.preprocessing import PowerTransformer
qt = PowerTransformer()
X_trans = qt.fit_transform(X) # 分位數(shù)變化

3.2如何使用分位數(shù)變換和Box-Cox變換來處理偏斜分布的數(shù)據(jù)

我準備了一段代碼,通過直方圖直觀地看到如何將原始的偏斜分布轉(zhuǎn)換為更接近正態(tài)分布的形式。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import QuantileTransformer, PowerTransformer

# 創(chuàng)建偏斜分布的示例數(shù)據(jù)
np.random.seed(42)
data = np.random.lognormal(0, 1, 1000).reshape(-1, 1)
df = pd.DataFrame(data, columns=['Feature'])

# 應用分位數(shù)變換和Box-Cox變換
quantile_transformer = QuantileTransformer(output_distribution='normal')
power_transformer = PowerTransformer(method='box-cox')

df_quantile = pd.DataFrame(quantile_transformer.fit_transform(df), columns=df.columns)
df_boxcox = pd.DataFrame(power_transformer.fit_transform(df), columns=df.columns)

# 可視化比較
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(15, 5))

ax1.hist(df, bins=50)
ax1.set_title('Original Data')
ax1.set_xlabel('Value')
ax1.set_ylabel('Frequency')

ax2.hist(df_quantile, bins=50)
ax2.set_title('Quantile Transform')
ax2.set_xlabel('Value')
ax2.set_ylabel('Frequency')

ax3.hist(df_boxcox, bins=50)
ax3.set_title('Box-Cox Transform')
ax3.set_xlabel('Value')
ax3.set_ylabel('Frequency')

plt.tight_layout()
plt.show()
左為原始數(shù)據(jù)的偏態(tài)分布,中為分位數(shù)變化,右為Box-Cox變化

參數(shù)化變換是假設(shè)數(shù)據(jù)遵循某種特定的分布(如正態(tài)分布、指數(shù)分布等),并使用該分布的參數(shù)(如均值、方差、形狀參數(shù)等)來描述數(shù)據(jù)。參數(shù)”指的是描述數(shù)據(jù)分布特征的數(shù)值,如均值(μ)和方差(σ2)。

非參數(shù)化變換不依賴于對數(shù)據(jù)分布的特定假設(shè),它直接基于數(shù)據(jù)的統(tǒng)計特性(如分位數(shù)、中位數(shù)等)進行變換。

3.2 如何使用對數(shù)變換和冪變換來處理偏斜分布的數(shù)據(jù)

對數(shù)變換可以壓縮大值之間的差距,而冪變換則可以根據(jù)需要調(diào)整分布的形狀。

df['log_trans'] = np.log1p(df['feature'])  # 對數(shù)轉(zhuǎn)換
df['power_trans'] = np.power(df['feature']) # 平方根轉(zhuǎn)換

4、處理類別型特征的方法

目標編碼用目標變量的平均值來替換類別,而頻數(shù)編碼則用類別的出現(xiàn)頻率來替換類別。

# 目標編碼
target_means = train.groupby('Category')['Target'].mean()
train['Target_Encoding'] = train['Category'].map(target_means)
test['Target_Encoding'] = test['Category'].map(target_means)

# 頻數(shù)編碼
frequency = train['Category'].value_counts(normalize=True)
train['Frequency_Encoding'] = train['Category'].map(frequency)
test['Frequency_Encoding'] = test['Category'].map(frequency)

5、多項式特征與交互特征

  • 多項式特征是通過將原始特征進行多項式擴展,如平方、立方等
  • 交互特征是原始特征之間的乘積
  • 優(yōu)點:幫助捕捉特征之間的非線性關(guān)系和交互作用,增加模型的表達能力
  • 缺點:特征數(shù)量爆炸,導致過擬合

Scikit-learn提供了 PolynomialFeatures,可以自動生成多項式特征。

# 使用 PolynomialFeatures 生成多項式特征
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)

# 使用 PolynomialFeatures 生成交互特征
poly = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False)
X_interaction = poly.fit_transform(X)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容