Scikit-Learn Pipeline:如何处理预处理



我正在Kaggle上进行一些机器学习练习,我开始使用sklearn.pipeline.Pipeline类多次转换数据,然后在其上训练模型。

我想封装预处理数据的几个部分:删除 30% 或更多NaN秒的行,删除 30% 或更多NaN秒的列,等等。

这是我尝试自定义Transformer的开始:

class NanHandler(BaseEstimator, TransformerMixin):
def __init__(self, target_col, row_threshold=0.7, col_threshold=0.7):
self.target_col = target_col
self.row_threshold = row_threshold
self.col_threshold = col_threshold
def transform(self, X):
# drop rows and columns with >= 30% NaN values
def fit(self, *_):
return self

但是,我想将此Transformer与 k 折叠交叉验证一起使用。 我担心如果我进行 3 倍交叉验证,我不太可能(但可能)遇到以下情况:

在折叠 1 和 2 上训练,在 3 上测试

在折叠 2 和 3 上训练,在 1 上测试

在折叠 1 和 3 上训练,在 2 上进行测试

折叠 1 和 2 组合在特定列中可能有超过 30% 的Nans(称为colA)。 所以我的NanHandler会在训练前删除这个专栏。 但是,折叠 2 和 3 组合的NaN可能小于 30%,因此它不会下降colA,导致我的模型在与第一次传递不同的列上训练。

1) 我应该如何处理这种情况?

2) 如果我想删除具有 30% 或更多 NaN 值的行(因为我将在 k 折叠交叉验证期间训练不同数量的行),这也是一个问题吗?

谢谢!

> 30%这个数字对我来说有点模棱两可。 整个数据集的 30% 还是每折 30%?例如,如果您有一个包含 90 个样本的数据集,并将其分解为 3 个折叠,每 30 个。您是否希望存在 70% 的 30 磅折叠中的列和行?(我假设是这种情况)

那么也许以下方法可以工作:

  1. 清除整个数据集中具有任何缺失值(Nan)的所有特征和样本,并创建一个至少具有一个Nan的数据点池。
  2. 然后建立你的褶皱。
  3. 现在,根据您的数量 您可以从池中重新采样点的功能和示例 点Nan并将其添加回您的每个折叠中。

我希望这有所帮助。

最新更新