特征工程(Feature Engineering)詳解
特征工程是機器學習和數據科學中的核心環節,旨在通過對原始數據的轉換、組合和提取,構建更適合模型的高質量特征。其質量直接決定模型性能上限(“數據和特征決定了模型的上限,而算法只是逼近這個上限”)。
1. 特征工程的核心目標
- 提升模型性能:增強特征與目標變量的相關性。
- 降低計算成本:減少冗余特征,加速訓練。
- 改善泛化能力:避免過擬合,提高魯棒性。
2. 特征工程的主要步驟
(1) 數據理解與探索
- 查看數據分布:統計描述(均值、方差、分位數)、可視化(直方圖、箱線圖)。
- 檢測異常值:Z-score、IQR方法。
- 分析特征相關性:熱力圖、皮爾遜相關系數。
代碼示例:
import pandas as pd
import seaborn as sns# 加載數據
data = pd.read_csv("data.csv")
# 統計描述
print(data.describe())
# 相關性熱力圖
sns.heatmap(data.corr(), annot=True)
(2) 數據清洗
- 處理缺失值:
- 刪除:
data.dropna()
- 填充:均值/中位數(
data.fillna()
)、預測模型(如KNN)。
- 刪除:
- 處理異常值:
- 截斷:
np.clip(values, lower, upper)
- 分箱平滑。
- 截斷:
示例:
# 填充缺失值
data["age"].fillna(data["age"].median(), inplace=True)
# 處理異常值(基于IQR)
Q1, Q3 = data["income"].quantile([0.25, 0.75])
IQR = Q3 - Q1
data = data[(data["income"] >= Q1 - 1.5*IQR) & (data["income"] <= Q3 + 1.5*IQR)]
(3) 特征構造
- 領域知識驅動:
- 電商:從“購買時間”提取“是否周末”、“時段(早/中/晚)”。
- 文本:從“評論”提取“情感分數”、“關鍵詞頻率”。
- 數學變換:
- 對數變換:
np.log(x)
(處理長尾分布)。 - 多項式特征:
sklearn.preprocessing.PolynomialFeatures
(如 (x^2, xy))。
- 對數變換:
代碼示例:
from sklearn.preprocessing import PolynomialFeatures# 多項式特征
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X[["feature1", "feature2"]])
(4) 特征編碼
- 分類變量編碼:
- 獨熱編碼(One-Hot):
pd.get_dummies()
- 目標編碼(Target Encoding):用目標變量均值代替類別。
- 獨熱編碼(One-Hot):
- 數值變量分箱:
- 等寬分箱:
pd.cut(data, bins=5)
- 等頻分箱:
pd.qcut(data, q=5)
- 等寬分箱:
示例:
# 獨熱編碼
data_encoded = pd.get_dummies(data, columns=["city"])
# 分箱
data["age_bin"] = pd.cut(data["age"], bins=[0, 18, 35, 60, 100], labels=["child", "young", "adult", "elder"])
(5) 特征縮放
- 標準化(Standardization):
StandardScaler
(均值0,方差1)。 - 歸一化(Normalization):
MinMaxScaler
(縮放到[0,1])。 - 魯棒縮放(Robust Scaling):
RobustScaler
(抗異常值)。
代碼:
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
(6) 特征選擇
- 過濾法(Filter):
- 方差閾值:
VarianceThreshold(threshold=0.1)
- 相關性:選擇與目標變量相關性高的特征(如相關系數 > 0.3)。
- 方差閾值:
- 包裹法(Wrapper):
- 遞歸特征消除(RFE):
RFECV(estimator=LogisticRegression())
- 遞歸特征消除(RFE):
- 嵌入法(Embedded):
- L1正則化(Lasso):
Lasso(alpha=0.1).fit(X, y)
- L1正則化(Lasso):
示例:
from sklearn.feature_selection import SelectKBest, f_classif# 選擇K個最佳特征
selector = SelectKBest(score_func=f_classif, k=5)
X_selected = selector.fit_transform(X, y)
3. 高級特征工程技術
(1) 時間序列特征
- 滑動窗口統計:均值、標準差(
pandas.rolling()
)。 - 周期性特征:提取小時、星期、季節。
(2) 文本特征
- 詞袋模型:
CountVectorizer
- TF-IDF:
TfidfVectorizer
- 詞嵌入:Word2Vec、BERT。
(3) 圖像特征
- 手工特征:HOG(方向梯度直方圖)、SIFT。
- 深度學習:CNN提取的特征(如ResNet最后一層輸出)。
4. 特征工程的評估
- 模型性能對比:在驗證集上測試特征工程前后的AUC、RMSE等指標。
- 特征重要性分析:
- 樹模型:
model.feature_importances_
- SHAP值:解釋特征貢獻。
- 樹模型:
代碼:
import shap# 計算SHAP值
explainer = shap.Explainer(model)
shap_values = explainer(X)
shap.summary_plot(shap_values, X)
5. 工具與庫推薦
任務 | 工具 |
---|---|
數據清洗 | Pandas, OpenRefine |
特征構造 | FeatureTools, Tsfresh(時間序列) |
特征選擇 | Scikit-learn, XGBoost內置特征重要性 |
自動化特征工程 | AutoFeat, Feature-engine |
6. 總結
- 核心原則:理解業務、迭代實驗、持續驗證。
- 關鍵步驟:清洗 → 構造 → 編碼 → 縮放 → 選擇。
- 避坑指南:
- 避免數據泄漏(先拆分再處理)。
- 平衡特征數量與信息量(防止維度災難)。
特征工程是藝術與科學的結合,需結合領域知識和數據直覺,不斷優化!