我在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交叉验证期间在不同行数上训练),这也是一个问题吗?
谢谢!
答案 0 :(得分:1)
30%的数字对我来说有点模棱两可。整个数据集的30%或每个数据集30%?例如,如果您有一个包含90个样本的数据集,并将其分解为30的3倍,您是否希望存在70%的cols和30s的折叠? (我将假设是这种情况)
然后可能以下方法可行:
Nan
)的所有要素和示例的整个数据集,并创建至少有一个Nan
的数据点池。Nan
并将其添加回每个折叠。我希望这会有所帮助。