【问题标题】:Scikit-Learn Pipeline: How to Handle PreprocessingScikit-Learn 管道:如何处理预处理
【发布时间】:2018-07-07 10:40:37
【问题描述】:

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

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

这是我尝试自定义 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 的组合可能少于 30% NaNs,因此它不会丢弃 colA,导致我的模型在不同于第一遍的列上进行训练。 p>

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

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

谢谢!

【问题讨论】:

  • 应该为整个数据集处理缺失值,而不是单独处理训练和测试。
  • @Vivek Kumar 那错了。必须对训练集和测试集分别进行预处理,否则测试集不会“干净”。在这种情况下,分层交叉验证可能会起作用,或者完全放弃这些特征。

标签: python scikit-learn


【解决方案1】:

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

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

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

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-03-29
    • 2013-04-14
    • 2012-10-15
    • 1970-01-01
    • 2020-01-28
    • 2020-03-26
    • 2020-11-10
    • 2020-01-13
    • 2019-05-29
    相关资源
    最近更新 更多