我正在实施一个可扩展的管道,用于在建模之前清理我的数据并对其进行预处理。
我对用于预处理的 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
所以我基本上最终有两个单独的管道,一个用于在拆分之前对整个数据集执行的操作(并且非常特定于数据集),另一个用于拆分后的操作(我称之为预处理)。
构建可扩展数据管道的方法是什么,包括数据清理、数据提取、特征工程、建模前的预处理?有没有更好或更标准的方法来解决这个问题?
如果您认为我的术语不准确,也请纠正我。