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

时间:2018-01-28 17:32:49

标签: python scikit-learn

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

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

这是我尝试自定义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-fold交叉验证。我担心如果我进行3次交叉验证,我不太可能(但可能)遇到以下情况:

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

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

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

组合折叠1和2可能在特定列中超过30%Nan(称之为colA)。因此我的NanHandler会在培训前删除此列。但是,折叠2和3合并可能少于30%NaN s,因此赢了colA,导致我的模型在不同的列上进行训练而不是第一遍。

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

2)如果我想删除具有30%以上NaN值的行(这是我在k-fold交叉验证期间在不同行数上训练),这也是一个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

然后可能以下方法可行:

  1. 清除包含任何缺失值(Nan)的所有要素和示例的整个数据集,并创建至少有一个Nan的数据点池。
  2. 然后建立你的褶皱。
  3. 现在,根据你的数量 您可以从池中重新取样点的功能和示例 点Nan并将其添加回每个折叠。
  4. 我希望这会有所帮助。