使用 feature_engine库 提升你的机器学习特征工程效率
文章目录
- 1 安装
- 2 MeanEncoder (目标编码)
- 3 RareLabelEncoder
- 4 OrdinalEncoder
- 5 DecisionTreeEncoder
- 6 MeanMedianImputer
- 7 ArbitraryNumberImputer
- 8 MissingIndicator
- 9 LogTransformer
- 10 PowerTransformer
- 11 Winsorizer (异常值截断器)
- 12 总结
- 13 GitHub
在机器学习中,特征工程的质量决定了模型的成败。你可能听过这样一句话:“垃圾进,垃圾出。”
现在,有一个名为 feature_engine
的库,它能帮助你在数据进入模型之前进行清理。更棒的是:这个包兼容 scikit-learn,并内置了多种工具,可以以简单、可复现的方式进行转换、编码和处理缺失值。
在这篇文章中,我们将介绍 feature_engine 中 10 种最佳方法,你可以立即开始使用。
1 安装
为了应用这些知识,我们可以加载 Seaborn 中的 Attention
数据集,该数据集在 BDS 3 许可下开源。
import pandas as pd
import seaborn as snsdf = sns.load_dataset('attention', index_col=[0])
df.head(3)
数据集视图。
别忘了安装 feature_engine。
pip install feature_engine --quiet
2 MeanEncoder (目标编码)
当分类变量具有太多级别时,这种编码器非常有用。MeanEncoder
不会创建数百个独热编码列,而是用目标变量的均值替换类别。
from feature_engine.encoding import MeanEncoderX = df.drop('score', axis=1)
y = df['score']e = MeanEncoder(variables=['attention'])
X_encoded = e.fit_transform(X, y)
subject attention solutions5 5.116667 113 6.800000 3
可以把它想象成根据平均评分来评价餐馆,而不是列出每一条评论。但别忘了谨慎应用,以避免数据泄露。
- 文档:MeanEncoder
3 RareLabelEncoder
有时,有些类别只出现过少数几次。RareLabelEncoder
不会让这些稀有类别混淆你的模型,而是将它们分组到一个单一的“Rare”标签中。
from feature_engine.encoding import RareLabelEncoderdf.loc[len(df)] = [1, 'not-focused', 0, 0]X = df.drop('score', axis=1)
y = df['score']r = RareLabelEncoder(tol=0.05, n_categories=2)
X_encoded = r.fit_transform(X)
X_encoded
subject attention solutions20 focused 31 Rare 0
如果你有一个分类列,这个方法有助于防止“以上任意一项”破坏你的模型。
- 文档:RareLabelEncoder
4 OrdinalEncoder
当类别具有自然顺序时,OrdinalEncoder
是正确的选择。例如,教育水平:高中 < 本科 < 硕士 < 博士。
from feature_engine.encoding import OrdinalEncodero = OrdinalEncoder(encoding_method='arbitrary')
X_encoded = o.fit_transform(X)
这比将有序类别转换为随机数字要好。
- 文档:OrdinalEncoder
5 DecisionTreeEncoder
DecisionTreeEncoder
使用决策树来寻找编码类别的智能方法。它基本上会问:“类别如何划分目标变量?”
from feature_engine.encoding import DecisionTreeEncoderdt = DecisionTreeEncoder(random_state=42)
X_encoded = dt.fit_transform(X, y)
subject attention solutions5 5.5116667 117 6.8000000 3
把它想象成一个类别“低语者”——它倾听数据并找到最佳划分。
- 文档:DecisionTreeEncoder
6 MeanMedianImputer
缺失数据无处不在。MeanMedianImputer
使用均值或中位数填充数值型缺失值。
from feature_engine.imputation import MeanMedianImputer
import numpy as npdf.loc[len(df)] = [1, 'not-focused', np.nan, 0]X = df.drop('score', axis=1)
y = df['score']imp = MeanMedianImputer(imputation_method='median')
X_imputed = imp.fit_transform(X)
如果你缺少某人的年龄,那么该组的年龄中位数通常是一个公平的猜测。
- 文档:MeanMedianImputer
7 ArbitraryNumberImputer
有时你希望缺失值能够突出。ArbitraryNumberImputer
允许你用一个特定的数字填充它们,比如 -999。
from feature_engine.imputation import ArbitraryNumberImputerimp = ArbitraryNumberImputer(arbitrary_number=-999)
X_imputed = imp.fit_transform(X)
当缺失本身可能带有意义时,这很方便——比如客户没有报告收入。
- 文档:ArbitraryNumberImputer
8 MissingIndicator
想标记缺失值而不是填充它们吗?MissingIndicator
创建二进制列,指示值是否缺失。
from feature_engine.imputation import AddMissingIndicatormi = AddMissingIndicator()
X_with_flags = mi.fit_transform(X)
subject attention solutions solutions_na20 focused 3.0 01 not-focused NaN 1
这就像在空单元格上贴上便利贴——有时数据的缺失比数据本身更能说明问题。
- 文档:AddMissingIndicator
9 LogTransformer
许多数据集具有偏态分布。LogTransformer
应用对数变换,使其更接近正态分布。
from feature_engine.transformation import LogTransformerX = df.drop('score', axis=1)
y = df['score']lt = LogTransformer(variables=['solutions'])
X_transformed = lt.fit_transform(X)
非常适合收入、房价或任何少数富人会扰乱你的直方图的数据。
- 文档:LogTransformer
10 PowerTransformer
当简单的对数变换不足时,PowerTransformer
提供 Box-Cox 和 Yeo-Johnson 变换。它对数值变量应用幂变换或指数变换。如果未提供变量列表,它将转换所有数值变量。
from feature_engine.transformation import PowerTransformerpt = PowerTransformer(variables=['skewed_var'])
X_transformed = pt.fit_transform(X)
当你的数据不“听话”时,这就像给它做了一次“改造”。
- 文档:PowerTransformer
11 Winsorizer (异常值截断器)
异常值可能会毁掉你的模型。Winsorizer
会限制极端值,以减少它们的影响。
from feature_engine.outliers import Winsorizerdf.loc[len(df)] = [100, 'winsorize this', 0, 0]X = df.drop('score', axis=1)
y = df['score']w = Winsorizer(capping_method='iqr')
X_winsorized = w.fit_transform(X)
例如,如果有人报告年收入 $50M,Winsorizer 可以防止这个异常值扭曲你的整个数据集。
- 文档:Winsorizer
12 总结
特征工程不必杂乱无章或耗时。
有了 feature_engine,你将获得一致、对管道友好的工具,可以处理预处理中最棘手的部分。无论是编码类别、填充缺失值还是驯服异常值,这些方法都能为你提供支持。
请记住,它与 sklearn 的管道集成得非常好,使得这个包在处理机器学习模型时更加不可或缺。
一个管道的快速示例:
df.loc[len(df)] = [1, 'not-focused', np.nan, 0]X = df.drop('score', axis=1)
y = df['score']steps = [('imputer', MeanMedianImputer(imputation_method='mean')),('encoder', MeanEncoder(variables=['attention'])),('model', LinearRegression())
]pipe = Pipeline(steps)pipe.fit(X, y)print(f'First 4 predictions: {pipe.predict(X)[:4]}')print(f'\nScore: {pipe.score(X, y)}')
13 GitHub
这是本参考指南的完整代码。Feature_Engine.ipynb