我正在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% 的Nan
s(称为colA
)。 所以我的NanHandler
会在训练前删除这个专栏。 但是,折叠 2 和 3 组合的NaN
可能小于 30%,因此它不会下降colA
,导致我的模型在与第一次传递不同的列上训练。
1) 我应该如何处理这种情况?
2) 如果我想删除具有 30% 或更多 NaN 值的行(因为我将在 k 折叠交叉验证期间训练不同数量的行),这也是一个问题吗?
谢谢!
> 30%这个数字对我来说有点模棱两可。 整个数据集的 30% 还是每折 30%?例如,如果您有一个包含 90 个样本的数据集,并将其分解为 3 个折叠,每 30 个。您是否希望存在 70% 的 30 磅折叠中的列和行?(我假设是这种情况)
那么也许以下方法可以工作:
- 清除整个数据集中具有任何缺失值(
Nan
)的所有特征和样本,并创建一个至少具有一个Nan
的数据点池。 - 然后建立你的褶皱。
- 现在,根据您的数量 您可以从池中重新采样点的功能和示例 点
Nan
并将其添加回您的每个折叠中。
我希望这有所帮助。