我想为sklearn的Pipeline
创建自己的转换器。
我正在创建一个实现了fit和transform方法的类。这个转换器的目的是从矩阵中删除那些NaN值超过指定数量的行。
我面临的问题是如何同时改变传递给转换器的X和y矩阵?
我认为这必须在fit方法中完成,因为它可以访问X和y。由于Python通过赋值传递参数,一旦我将X重新赋值为一个行数更少的新矩阵,原始X的引用就会丢失(当然,y也是如此)。是否有可能保持这个引用?
我使用pandas DataFrame来轻松删除那些NaN值过多的行,这可能不是我的用例的正确方法。当前的代码如下所示:
class Dropna(): # thresh是行中允许的最大NaN数量 def __init__(self, thresh=0): self.thresh = thresh def fit(self, X, y): total = X.shape[1] # +1以考虑'y'被添加到数据框中 new_thresh = total + 1 - self.thresh df = pd.DataFrame(X) df['y'] = y df.dropna(thresh=new_thresh, inplace=True) X = df.drop('y', axis=1).values y = df['y'].values return self def transform(self, X): return X
回答:
修改样本轴,例如删除样本,目前还不符合scikit-learn转换器API的要求。因此,如果你需要这样做,应该在调用scikit-learn之前作为预处理步骤来完成。
目前,转换器API用于将给定样本的特征转换为新的东西。这可以隐式地包含来自其他样本的信息,但样本永远不会被删除。
另一种选择是尝试填补缺失的值。但同样,如果你需要删除样本,请在使用scikit-learn之前将其视为预处理步骤。