終于把機器學習中的特征工程搞懂了!
特征工程是機器學習中極為關鍵的一部分,涉及到如何通過預處理、轉(zhuǎn)換和組合原始數(shù)據(jù)來創(chuàng)建更適合模型訓練的特征,以提高模型的表現(xiàn)和預測能力。特征工程的主要目的是從數(shù)據(jù)中提取出有助于模型更好理解和學習規(guī)律的特征。
在本文中,我們將探討關鍵的特征工程技術(shù),解釋其重要性,并提供具有實際應用的 Python 代碼示例,以展示這些技術(shù)如何改進你的機器學習模型。
為什么特征工程至關重要
特征工程可以
- 提高模型準確性
精心設計的特征有助于模型更好地理解問題,從而做出更準確的預測。 - 減少過度擬合
通過選擇相關特征,模型避免從噪聲中學習。 - 使模型更易于解釋
對人類理解更直觀的特征可以幫助解釋模型如何得出預測。
關鍵特征工程技術(shù)
現(xiàn)在,讓我們通過真實示例和 Python 代碼來了解幾種基本的特征工程技術(shù)。
1.處理缺失數(shù)據(jù)
現(xiàn)實世界的數(shù)據(jù)集通常包含缺失值。如何處理這些缺失值會極大地影響模型的性能。
真實示例
在醫(yī)療保健領域,患者記錄中可能會缺少年齡或病史條目。
填充缺失值有助于保留有價值的數(shù)據(jù)。
import pandas as pd
from sklearn.impute import SimpleImputer
# Sample healthcare data
data = {'age': [25, None, 45, None], 'blood_pressure': [120, 130, None, 140]}
df = pd.DataFrame(data)
# Impute missing values with mean
imputer = SimpleImputer(strategy='mean')
df_imputed = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)
print(df_imputed)
2.特征縮放
特征縮放可確保量級較大的特征不會超過量級較小的特征。
這對于基于距離的算法(如 k-最近鄰和支持向量機)至關重要。
真實示例
在財務數(shù)據(jù)中,收入和貸款金額等特征差異很大。
如果不進行縮放,模型可能會因為貸款金額的值較大而賦予其更大的權(quán)重。
from sklearn.preprocessing import StandardScaler
# Sample financial data (income in thousands, loan in thousands)
df = pd.DataFrame({'income': [50, 100, 150], 'loan_amount': [200, 300, 400]})
# Standardize the features
scaler = StandardScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(df), columns=df.columns)
print(df_scaled)
3.特征編碼
許多機器學習算法無法直接處理分類數(shù)據(jù)(例如顏色或國家)。特征編碼將分類數(shù)據(jù)轉(zhuǎn)換為模型可以理解的數(shù)字格式。
真實示例:
在電子商務數(shù)據(jù)集中,電子產(chǎn)品、家具和服裝等產(chǎn)品類別需要編碼為數(shù)字格式,以便機器學習模型進行處理。
df = pd.DataFrame({'product_category': ['electronics', 'clothing', 'furniture']})
# One-hot encoding for product categories
df_encoded = pd.get_dummies(df)
print(df_encoded)
4.特征轉(zhuǎn)換
有時,數(shù)據(jù)分布會出現(xiàn)偏差,這會影響機器學習模型的性能。
對數(shù)變換等特征變換技術(shù)可以減少偏差并使數(shù)據(jù)更加正常。
真實示例:
在房地產(chǎn)行業(yè),房價可能會有很大差異,當數(shù)據(jù)偏差較小時,大多數(shù)模型的表現(xiàn)會更好。對數(shù)變換有助于規(guī)范這些分布。
import numpy as np
# Sample real estate prices
df = pd.DataFrame({'price': [100000, 300000, 500000, 1000000]})
# Apply log transformation to reduce skewness
df['log_price'] = np.log(df['price'])
print(df)
5.分箱或離散化
分箱將連續(xù)數(shù)據(jù)轉(zhuǎn)換為離散類別或箱。
當特征和目標變量之間沒有線性關系時,這尤其有用。
真實示例:
在營銷中,可以將年齡分為不同的組別(例如 18-25 歲、26-35 歲等),從而創(chuàng)建有助于細分客戶以進行有針對性的廣告的類別。
df = pd.DataFrame({'age': [20, 35, 45, 65]})
# Bin ages into categories
df['age_group'] = pd.cut(df['age'], bins=[0, 25, 45, 65, 100], labels=['Young', 'Adult', 'Middle-aged', 'Senior'])
print(df)
6.降維
高維數(shù)據(jù)集可能會使機器學習模型不堪重負,導致過度擬合。
降維技術(shù)(如 PCA)可以減少特征數(shù)量,同時保留大部分信息。
真實示例:
在遺傳學中,需要測量數(shù)千個基因,降維有助于識別最具信息量的基因,同時忽略冗余基因。
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# Sample genetics data
df = pd.DataFrame({'gene1': [1.5, 2.5, 3.5], 'gene2': [2.1, 3.2, 4.5], 'gene3': [3.1, 4.1, 5.2], 'gene4': [1.2, 1.8, 2.5]})
# Standardize the data
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
# Apply PCA to reduce dimensions from 4 to 2
pca = PCA(n_compnotallow=2)
df_pca = pd.DataFrame(pca.fit_transform(df_scaled))
print(df_pca)
7.特征選擇
并非所有特征都對預測有用。
特征選擇技術(shù)有助于識別最相關的特征,減少噪音并提高模型的性能。
真實示例:
在客戶行為分析中,年齡和購買歷史等特征可能比電子郵件點擊等其他特征更重要。
特征選擇有助于關注最具預測性的特征。
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import RFE
# Sample data
X = pd.DataFrame({'age': [25, 30, 35, 40], 'purchase_history': [1, 0, 1, 0], 'click_rate': [0.1, 0.2, 0.15, 0.3]})
y = [1, 0, 1, 0]
# Logistic Regression model for feature selection
model = LogisticRegression()
# Recursive Feature Elimination (RFE)
rfe = RFE(model, n_features_to_select=2)
fit = rfe.fit(X, y)
# Get selected features
print(f"Selected Features: {X.columns[fit.support_]}")
8.基于領域知識的特征創(chuàng)建
有時,最具預測性的特征來自領域知識。根據(jù)行業(yè)見解結(jié)合原始特征可以得到更好的模型。
真實示例:
在銀行業(yè),通過將貸款金額除以收入來創(chuàng)建債務收入比,可以為信用評分模型提供比單獨使用任何一個特征更強大的預測能力。
df = pd.DataFrame({'income': [50000, 80000, 120000], 'loan_amount': [20000, 40000, 50000]})
# Create a debt-to-income ratio feature
df['debt_to_income_ratio'] = df['loan_amount'] / df['income']
print(df)
9.時間特征工程
通過提取時間序列數(shù)據(jù)中有關時間的日、月或季節(jié)等特征,我們可以捕捉重要的時間相關趨勢。
真實示例
在零售業(yè),可以通過從銷售數(shù)據(jù)中提取基于時間的特征來捕捉季節(jié)性購物趨勢。
df = pd.DataFrame({'date': pd.to_datetime(['2021-01-01', '2022-05-15', '2023-08-23'])})
# Extract year, month, and day of week
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day_of_week'] = df['date'].dt.dayofweek
print(df)