Feature-engine#
一个用户友好的特征工程替代方案,用于替代Scikit-learn#
Feature-engine 是一个 Python 库,包含多个用于机器学习模型特征工程和选择的转换器。与 Scikit-learn 类似,Feature-engine 使用 fit()
和 transform()
方法来学习参数并转换数据。
使用数据框?👉 Feature-engine 是一个无需多想的选择#
与 Scikit-learn 不同,Feature-engine 设计用于处理数据框。不会改变列的顺序或名称。数据框输入,相同的数据框输出,只是变量经过了转换。
我们通常对不同的特征子集应用不同的特征工程过程。使用 sklearn,我们通过使用一个辅助类来限制特征工程技术到某些变量组:ColumnTransformer
。这个类还会导致变量在转换后名称的改变。
Feature-engine 允许你在每个转换器中选择你想要转换的变量 在 每个转换器中。这样,不同的工程过程可以轻松地应用于不同的特征子集,而无需额外的转换器或更改特征名称。
位于 pandas 和 scikit-learn 的接口处#
Pandas 非常适合数据分析和转换。我们也 ❤️ 它。但它不会自动从数据中学习和存储参数。而这对于机器学习是关键的。这就是我们创建 Feature-engine 的原因。
Feature-engine 将 pandas 功能封装在类似 Scikit-learn 的转换器中,捕获了学习、存储参数所需的大部分 pandas 逻辑,同时使这些转换与 Scikit-learn 估计器、选择器、交叉验证函数和超参数搜索方法兼容。
如果你的工作主要是为机器学习进行数据分析和转换,并且pandas和scikit-learn是你的主要工具,那么Feature-engine就是你的朋友。
Feature-engine 转换器#
Feature-engine 包含以下转换器:
缺失数据插补
分类特征的编码
离散化
异常值的限制或移除
特征变换
创建新功能
特征选择
日期时间特征
时间序列
预处理
Feature-engine 转换器与 scikit-learn 完全兼容。这意味着你可以在 Scikit-learn 管道中组装 Feature-engine 转换器,或者在超参数的网格搜索或随机搜索中使用它们。查看 **快速开始** 以获取示例。
你是怎么找到我们的?👀#
我们希望与更多人分享 Feature-engine。如果您能告诉我们您是如何发现我们的,这将对我们有很大帮助。
然后我们可以知道我们在做什么是对的,以及我们应该使用哪些渠道来分享爱。
🙏 请通过回答1个快速问题来分享你的故事 在这个链接 😃
什么是特征工程?#
特征工程是利用领域知识和统计工具为机器学习算法创建特征的过程。我们通常作为业务活动一部分收集的原始数据很少适合训练机器学习模型。相反,数据科学家花费大量时间进行数据分析、预处理和特征工程。
Pandas 是一个常用的数据预处理和特征工程库。它几乎支持所有常用的数据转换方法。然而,pandas 不能直接与 sklearn 兼容,也无法学习和存储特征工程参数。
Feature-engine 的转换器围绕一个 API 封装了 pandas 的功能,该 API 公开了 fit
和 transform
方法,用于从数据中学习和存储参数,然后使用这些参数来转换变量。通过这种方式,Feature-engine 使 pandas 中强大的功能完全兼容 Scikit-Learn。
Feature-engine 有什么独特之处?#
以下特性使得 Feature-engine 独一无二:
Feature-engine 包含了最全面的特征工程转换集合。
Feature-engine 可以直接对数据框中的特定变量组进行转换。
Feature-engine 返回数据框,因此适用于数据分析和模型部署。
Feature-engine 与 Scikit-learn 管道、网格搜索、随机搜索和交叉验证兼容。
Feature-engine 自动识别数值、分类和日期时间变量。
Feature-engine 会在无法进行转换时提醒你,例如,对负变量应用对数或除以0。
安装#
Feature-engine 是一个 Python 3 包,并且与 3.9 或更高版本兼容。
安装 Feature-engine 最简单的方法是通过 PyPI 使用 pip:
$ pip install feature-engine
注意,你也可以用以下方式安装它:
$ pip install feature_engine
Feature-engine 是一个活跃的项目,并定期发布新版本。要升级 Feature-engine 到最新版本,请使用 pip 如下操作:
$ pip install -U feature-engine
如果你使用的是 Anaconda,你可以安装 Anaconda Feature-engine 包:
$ conda install -c conda-forge feature_engine
Feature-engine 功能在以下教程中#
机器学习中的特征工程, 在线课程。
机器学习中的特征选择, 在线课程。
时间序列预测的特征工程, 在线课程。
Python 特征工程食谱, 书籍。
更多学习资源请参见 **学习资源**。
Feature-engine 的转换器#
Feature-engine 托管了以下几组转换器:
缺失数据插补:插补器#
缺失数据插补包括用对那些nan值的估计或任意数据点来替换分类数据和数值变量中的缺失值。Feature-engine支持以下缺失数据插补方法:
MeanMedianImputer:用数值变量的均值或中位数替换缺失数据
ArbitraryNumberImputer: 用任意数字替换数值变量中的缺失数据
EndTailImputer: 用分布尾部的数字替换数值变量中的缺失数据
CategoricalImputer: 用任意字符串或最频繁的类别替换缺失数据
RandomSampleImputer: 通过从变量中随机抽样观察值来替换缺失数据
添加缺失指示器: 添加一个二进制缺失指示器,用于标记含有缺失数据的观测值
DropMissingData: 从数据框中移除包含缺失值的观测(行)
分类编码器:编码器#
分类编码是将分类值替换为数值的过程。大多数机器学习模型,特别是那些由 scikit-learn 支持的模型,不接受字符串作为输入。因此,我们需要将这些字符串转换为这些模型可以解释的数字。
有多种分类编码技术,包括独热编码、序数编码和目标编码。Feature-engine 支持以下方法:
OneHotEncoder: 执行独热编码,可选:流行类别
CountFrequencyEncoder: 用观察次数或百分比替换类别
OrdinalEncoder:用数字替换类别,数字可以是任意的或按目标排序
MeanEncoder:用目标均值替换类别
WoEEncoder: 用证据权重替换类别
DecisionTreeEncoder: 用决策树的预测结果替换类别
RareLabelEncoder: 将不常见的类别分组
StringSimilarityEncoder: 基于字符串相似度对类别进行编码
变量离散化:离散器#
离散化,或分箱,包括将数值特征排序到离散区间中。最常用的方法是等宽和等频离散化。Feature-engine 支持这些以及更高级的方法,如使用决策树进行离散化:
ArbitraryDiscretiser: 将变量排序到用户定义的区间中
EqualFrequencyDiscretiser:将变量排序到等频区间
EqualWidthDiscretiser: 将变量排序为等宽区间
DecisionTreeDiscretiser: 使用决策树创建有限变量
GeometricWidthDiscretiser: 将变量分类到几何间隔中
异常值上限或移除#
离群值是指与变量观察到的分布非常不同的值。一些机器学习模型和统计测试对离群值敏感。在某些情况下,我们可能希望移除离群值或将其替换为允许的值。
ArbitraryOutlierCapper:将最大值和最小值限制在用户定义的值
Winsorizer: 使用统计参数限制最大或最小值
OutlierTrimmer: 从数据集中移除异常值
数值变换:变换器#
我们通常使用方差稳定变换来使数据满足某些统计检验(如方差分析)和机器学习模型(如线性回归)的假设。Feature-engine 支持以下变换:
LogTransformer: 对数值变量执行对数变换
LogCpTransformer: 在添加一个常数值后执行对数变换
ReciprocalTransformer: 对数值变量执行倒数变换
PowerTransformer:对数值变量执行幂变换
BoxCoxTransformer: 对数值变量执行Box-Cox变换
YeoJohnsonTransformer:执行数值变量的Yeo-Johnson变换
ArcsinTransformer:对数值变量执行反正弦变换
功能创建:#
Feature-engine 允许你通过数学组合或使用数学函数转换来创建新特征:
数学特性: 通过结合特征与数学运算来创建新变量
相对特征: 结合变量与参考特征
CyclicalFeatures:使用正弦和余弦创建变量,适用于周期性特征
决策树特征: 创建由决策树对一个或多个特征的预测结果产生的变量
日期时间:#
数据科学家很少在机器学习模型中使用原始表示的日期时间特征。相反,我们从日期时间变量的日期和时间部分提取许多新特征:
DatetimeFeatures: 从日期时间变量中提取特征
DatetimeSubtraction:计算日期时间变量之间的减法
特征选择:#
更简单的模型更容易解释、部署和维护。Feature-engine 扩展了其他库(如 sklearn 和 MLXtend)中现有的特征选择功能,增加了额外的方法:
DropFeatures: 从数据框中删除任意子集的变量
DropConstantFeatures: 从数据框中删除常量和准常量变量
DropDuplicateFeatures: 从数据框中删除重复的变量
DropCorrelatedFeatures: 从数据框中删除相关变量
SmartCorrelatedSelection: 从相关组中选择最佳特征
DropHighPSIFeatures: 根据人口稳定性指数(PSI)选择特征
SelectByInformationValue: 根据信息值选择特征
SelectByShuffling: 通过评估特征打乱后的模型性能来选择特征
SelectBySingleFeaturePerformance: 根据单变量估计器的表现选择特征
SelectByTargetMeanPerformance: 根据目标均值编码性能选择特征
递归特征消除: 通过评估模型性能,递归地选择特征
递归特征添加:通过评估模型性能递归地选择特征。
ProbeFeatureSelection: 选择重要性高于随机变量的特征
预测:#
为了通过使用传统机器学习算法将预测视为回归问题,我们首先需要将时间序列转换为静态特征表。我们可以通过滞后和窗口结合对过去数据的聚合来实现这一点:
LagFeatures: 提取滞后特征
WindowFeatures: 创建窗口特征
ExpandingWindowFeatures: 创建扩展窗口特征
预处理:#
在转换变量和进行数据清洗时,我们通常会改变变量的数据类型(在 pandas 中称为 dtype)。这些改变可能会在后续的数据处理流程中引发问题。为了直接解决这个问题,Feature-engine 提供了转换器,以确保数据类型和变量名称匹配。
Scikit-learn 包装器:#
scikit-learn 的 ColumnTransformer
的替代方案:
SklearnTransformerWrapper:将 Scikit-learn 转换器应用于所选的特征子集
特征缩放#
Scikit-learn 提供了全面的一系列工具来应用数据归一化、标准化和最小-最大缩放等过程,因此我们认为没有必要将这些功能引入 Feature-engine。如果你想仅对变量的一个子集应用这些程序,请查看 SklearnTransformerWrapper:
获取帮助#
无法让某些功能正常工作?以下是你可以寻求帮助的地方。
文档中的 **用户指南**。
Stack Overflow. 如果你提问,请在其中提及“feature_engine”。
如果你报名参加了 机器学习特征工程课程 ,请在相关部分发表一个问题。
如果你报名参加了 机器学习中的特征选择课程 ,请在相关部分发布一个问题。
加入我们的 gitter 社区。你也可以在这里提问。
在仓库中通过提交一个 issue 来提问(在提交之前检查是否已经存在类似的问题 :) )。
贡献#
有兴趣为 Feature-engine 做贡献吗?那真是太好了!
Feature-engine 是一个欢迎和包容的项目,我们非常高兴能有您的加入。我们遵循 Python 软件基金会行为准则。
无论你的技能水平如何,你都可以帮助我们。我们感谢错误报告、用户测试、功能请求、错误修复、测试的添加、产品增强和文档改进。我们也欢迎关于 Feature-engine 的博客。如果你有,请告诉我们!
有关如何贡献的更多详细信息,请查看贡献页面。点击 **贡献** 指南。
赞助我们#
Empower Sole,Feature-engine 的主要开发者,组建一个付费贡献者团队,以加速 Feature-engine 的开发。
目前,Sole 和我们的贡献者自愿利用他们的空闲时间来推进项目。您可以帮助我们达到一个资金里程碑,以便我们可以聚集一组 2-3 名贡献者,他们将每周定期投入时间来改进文档并加快扩展 Feature-engine 的功能。
您的贡献 将在推动 Feature-engine 达到新高度方面发挥关键作用,确保它继续成为数据科学社区的宝贵资源。
如果你没有Github账户,你也可以 在这里赞助我们。