【发布时间】: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