在 sklearn 管道中包含数据清理或特征工程步骤以创建可扩展的管道是一种好习惯吗?

数据挖掘 Python scikit-学习 数据清理 预处理 管道
2022-02-21 14:13:31

我正在实施一个可扩展的管道,用于在建模之前清理我的数据并对其进行预处理。

我对用于预处理的 sklearn 对象非常满意,Pipeline但我不确定是否应该包括数据清理、数据提取和特征工程步骤,这些步骤通常更针对我正在处理的数据集。

我的总体思路是,预处理阶段会包括对数据进行拆分需要进行的操作,以避免数据泄露。这些通常是:

  • 缩放
  • 估算(如果不是按常数值)
  • 编码

另一方面,数据清理或特征工程是可以对整个数据集执行的操作,例如:

def clean_price(data):
    """Clean the price feature."""
    data['Prezzo_EUR'] = data['Prezzo'].str.split('€').str[1].str.replace('.', '').astype('float')
    return data

def create_energy_class(data):
    """Create energy class feature."""
    data['Classe_energetica'] = data['Efficienza energetica'].str.extract(r'([A-G]\d?)')
    return data

这些操作非常特定FunctionTransformer于数据集,不会导致数据泄漏,例如,使用该对象将它们包含在 sklearn 管道中并没有任何价值。我可以轻松完成 20 多个简单操作,如上所示,而我所做的是构建一个连接所有功能的自定义管道:

def create_pipeline(list_functions):
    """Pipeline function for data cleaning steps."""

    def pipeline(data):
        out = data
        for function in list_functions:
            out = function(out)
        return out

    return pipeline

所以我基本上最终有两个单独的管道,一个用于在拆分之前对整个数据集执行的操作(并且非常特定于数据集),另一个用于拆分的操作(我称之为预处理)。

构建可扩展数据管道的方法是什么,包括数据清理、数据提取、特征工程、建模前的预处理?有没有更好或更标准的方法来解决这个问题?

如果您认为我的术语不准确,也请纠正我。

2个回答

使用 scikit-learn 的 Pipeline 的好处之一是将操作适当地应用于训练和预测数据集。您提到的“整个数据集”只是您当前可用的训练数据。Scikit-learn 的 Pipeline 可以自动处理附加数据,例如生产数据。

拥有两个不同的管道会产生不必要的开销,并可能导致系统出现错误。拥有一个处理所有操作的管道是最佳实践。

对于较大的数据集,拥有两个单独的管道会更有效。版本化不同的清洁/标准化/预处理数据集,并在特定的清洁数据集上运行精益学习和预测模型。

话虽如此,如果清洁过程很便宜,那么将其保留在同一管道中。如果没有必要,你不想让你的工作变得臃肿。