自定义转换器用于sklearn Pipeline,同时改变X和y

我想为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之前将其视为预处理步骤。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注