終于把機(jī)器學(xué)習(xí)中的特征工程搞懂了?。?!
今天給大家介紹一個(gè)機(jī)器學(xué)習(xí)中的關(guān)鍵概念,特征工程。
特征工程是機(jī)器學(xué)習(xí)中極為關(guān)鍵的一部分,涉及到如何通過(guò)預(yù)處理、轉(zhuǎn)換和組合原始數(shù)據(jù)來(lái)創(chuàng)建更適合模型訓(xùn)練的特征,以提高模型的表現(xiàn)和預(yù)測(cè)能力。特征工程的主要目的是從數(shù)據(jù)中提取出有助于模型更好理解和學(xué)習(xí)規(guī)律的特征。
在本文中,我們將探討關(guān)鍵的特征工程技術(shù),解釋其重要性,并提供具有實(shí)際應(yīng)用的 Python 代碼示例,以展示這些技術(shù)如何改進(jìn)你的機(jī)器學(xué)習(xí)模型。
為什么特征工程至關(guān)重要
特征工程可以
- 提高模型準(zhǔn)確性
精心設(shè)計(jì)的特征有助于模型更好地理解問(wèn)題,從而做出更準(zhǔn)確的預(yù)測(cè)。 - 減少過(guò)度擬合
通過(guò)選擇相關(guān)特征,模型避免從噪聲中學(xué)習(xí)。 - 使模型更易于解釋
對(duì)人類理解更直觀的特征可以幫助解釋模型如何得出預(yù)測(cè)。
關(guān)鍵特征工程技術(shù)
現(xiàn)在,讓我們通過(guò)真實(shí)示例和 Python 代碼來(lái)了解幾種基本的特征工程技術(shù)。
1.處理缺失數(shù)據(jù)
現(xiàn)實(shí)世界的數(shù)據(jù)集通常包含缺失值。如何處理這些缺失值會(huì)極大地影響模型的性能。
真實(shí)示例
在醫(yī)療保健領(lǐng)域,患者記錄中可能會(huì)缺少年齡或病史條目。
填充缺失值有助于保留有價(jià)值的數(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.特征縮放
特征縮放可確保量級(jí)較大的特征不會(huì)超過(guò)量級(jí)較小的特征。
這對(duì)于基于距離的算法(如 k-最近鄰和支持向量機(jī))至關(guān)重要。
真實(shí)示例
在財(cái)務(wù)數(shù)據(jù)中,收入和貸款金額等特征差異很大。
如果不進(jìn)行縮放,模型可能會(huì)因?yàn)橘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.特征編碼
許多機(jī)器學(xué)習(xí)算法無(wú)法直接處理分類數(shù)據(jù)(例如顏色或國(guó)家)。特征編碼將分類數(shù)據(jù)轉(zhuǎn)換為模型可以理解的數(shù)字格式。
真實(shí)示例:
在電子商務(wù)數(shù)據(jù)集中,電子產(chǎn)品、家具和服裝等產(chǎn)品類別需要編碼為數(shù)字格式,以便機(jī)器學(xué)習(xí)模型進(jìn)行處理。
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í),數(shù)據(jù)分布會(huì)出現(xiàn)偏差,這會(huì)影響機(jī)器學(xué)習(xí)模型的性能。
對(duì)數(shù)變換等特征變換技術(shù)可以減少偏差并使數(shù)據(jù)更加正常。
真實(shí)示例:
在房地產(chǎn)行業(yè),房?jī)r(jià)可能會(huì)有很大差異,當(dāng)數(shù)據(jù)偏差較小時(shí),大多數(shù)模型的表現(xiàn)會(huì)更好。對(duì)數(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)換為離散類別或箱。
當(dāng)特征和目標(biāo)變量之間沒(méi)有線性關(guān)系時(shí),這尤其有用。
真實(shí)示例:
在營(yíng)銷中,可以將年齡分為不同的組別(例如 18-25 歲、26-35 歲等),從而創(chuàng)建有助于細(xì)分客戶以進(jìn)行有針對(duì)性的廣告的類別。
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ù)集可能會(huì)使機(jī)器學(xué)習(xí)模型不堪重負(fù),導(dǎo)致過(guò)度擬合。
降維技術(shù)(如 PCA)可以減少特征數(shù)量,同時(shí)保留大部分信息。
真實(shí)示例:
在遺傳學(xué)中,需要測(cè)量數(shù)千個(gè)基因,降維有助于識(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_components=2)
df_pca = pd.DataFrame(pca.fit_transform(df_scaled))
print(df_pca)
7.特征選擇
并非所有特征都對(duì)預(yù)測(cè)有用。
特征選擇技術(shù)有助于識(shí)別最相關(guān)的特征,減少噪音并提高模型的性能。
真實(shí)示例:
在客戶行為分析中,年齡和購(gòu)買歷史等特征可能比電子郵件點(diǎn)擊等其他特征更重要。
特征選擇有助于關(guān)注最具預(yù)測(cè)性的特征。
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.基于領(lǐng)域知識(shí)的特征創(chuàng)建
有時(shí),最具預(yù)測(cè)性的特征來(lái)自領(lǐng)域知識(shí)。根據(jù)行業(yè)見(jiàn)解結(jié)合原始特征可以得到更好的模型。
真實(shí)示例:
在銀行業(yè),通過(guò)將貸款金額除以收入來(lái)創(chuàng)建債務(wù)收入比,可以為信用評(píng)分模型提供比單獨(dú)使用任何一個(gè)特征更強(qiáng)大的預(yù)測(cè)能力。
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í)間特征工程
通過(guò)提取時(shí)間序列數(shù)據(jù)中有關(guān)時(shí)間的日、月或季節(jié)等特征,我們可以捕捉重要的時(shí)間相關(guān)趨勢(shì)。
真實(shí)示例
在零售業(yè),可以通過(guò)從銷售數(shù)據(jù)中提取基于時(shí)間的特征來(lái)捕捉季節(jié)性購(gòu)物趨勢(shì)。
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)