我有以下内容:
train_set, test_set = train_test_split(arbres_df, test_size=0.2, random_state=42)
哪个是旧的
train_test_split
我们知道。
然后我将功能和目标分开:
train_feat = train_set.drop("anneedeplantation", axis=1).reset_index(drop=True)
train_target = train_set["anneedeplantation"].copy().reset_index(drop=True)
遵循著名的书 机器学习实践 我在构建管道时遇到了一个小问题:
作者在项目开始时使用
train_test_split
,他还在
X_train
中将目标和功能分开,并在
y_train
中做了一些分析,构建一些新功能等,然后将所有内容放入管道中以转换数据。一切都很好。
train_data
现在我正在处理另一个项目,但有一点不同:分割数据后,我需要在
中删除一些行。在书中,他不必删除任何行,这就是为什么在管道中转换数据时不会出现问题。但我需要删除一些行,最终得到的行数比
train_feat
少。
train_feat
我的问题是:
train_target
如何在管道中插入指令以删除等效行
?我无法删除任何行,它必须是与
-
中删除的行相对应的行。
train_target
上述问题的答案很简单:“不要将train_features
中的数据与 -
在管道之前但仅在“之后”?如果是这样,这是好的做法吗?
X_train
andy_train
before the pipeline but only after"? If so, is this good practice?
是对的,在的管道
之前
从
train_features
中删除行,同时还要从
train_target
中删除对应的行,这是很重要的。否则,的特征和标签将不匹配,这会导致的模型训练和评估出现问题。
在管道之前分离和过滤数据通常是一种很好的做法,原因如下:
-
数据一致性: 通过在管道之前同步特征和目标数据的过滤或删除操作,可以确保在所有后续处理步骤中数据保持一致。
-
管道简单性: 将数据转换与过滤操作分开,可以简化管道的结构,并使其更易于理解和维护。管道应主要关注数据转换,而不是数据清理。
-
避免数据泄漏: 在某些情况下,在管道内部过滤数据(尤其是在基于来自测试集的信息进行过滤的情况下)可能会导致数据泄漏,其中来自测试集的信息会泄漏到训练集中。通过在拆分和管道之前预先处理数据,可以降低此类泄漏的风险。
以下是更新后的工作流程示例:
# 1. 将数据拆分为训练集和测试集
train_set, test_set = train_test_split(arbres_df, test_size=0.2, random_state=42)
# 2. 在训练集中分离特征和目标
train_feat = train_set.drop("anneedeplantation", axis=1).reset_index(drop=True)
train_target = train_set["anneedeplantation"].copy().reset_index(drop=True)
# 3. 从 train_feat 中过滤行
# (在此处应用的过滤逻辑)
# 例如,删除特定列中具有缺失值的行:
train_feat = train_feat.dropna(subset=['some_column'])
# 4. 从 train_target 中删除对应的行
train_target = train_target[train_feat.index]
# 5. 创建的管道
pipeline = Pipeline([
# (的数据转换步骤)
])
# 6. 使用过滤后的数据拟合的管道
pipeline.fit(train_feat, train_target)
通过在构建管道之前执行过滤步骤,可以确保特征和目标数据保持一致,并且管道仅专注于数据转换。这会使的代码更简洁、更易于维护,并有助于防止潜在的数据泄漏问题。
标签:python,scikit-learn,pipeline,training-data,data-preprocessing From: 78844809