【问题标题】:scikit-learn: transformer to select columns by namescikit-learn:按名称选择列的转换器
【发布时间】:2020-05-02 08:55:38
【问题描述】:

上下文

我正在使用 scikit-learn 并正在寻找一个转换器,它允许我简单地选择保留哪些列或删除哪些列。

问题

实际上,我想在我的管道中包含一个附加转换器步骤,让我可以选择保留哪些列或删除哪些列。我知道在下面的示例中我可以简单地使用其余部分,但这在我的实际实现中不起作用,我需要参数化列选择以便轻松地将其应用于训练、测试和最终评分。

示例

import numpy as np
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn import preprocessing
prep_pipeline = ColumnTransformer(transformers=[("std_num", preprocessing.StandardScaler(), ["a", "b"])],
                                  remainder = "passthrough")
X = pd.DataFrame([[0., 1., 2., 2.],
              [1., 1., 0., 1.]])
X.columns = ["a", "b", "c", "d"]
prep_pipeline.fit_transform(X)

预期的解决方案

解决方案我需要一个 additional 转换器步骤,该步骤的角色专门用于选定的列 ["a", "d"] 因此预期的输出是:

array([[-1.,  1.],
       [ 1., -1.]])

【问题讨论】:

  • 您可以通过定义从 BaseEstimator 和 TransformerMixin 扩展的类来编写您的转换器,并覆盖 fit 和 transform 方法来进行自定义转换

标签: python scikit-learn


【解决方案1】:

我认为您应该在该管道中使用 sklearn 的管道和以下类(当前的 StandardScaler 不支持数据帧的缩放部分)

import pandas as pd
from sklearn.base import BaseEstimator, TransformerMixin

class DropSomeColumns(BaseEstimator, TransformerMixin):

    def __init__(self, cols):
        if not isinstance(cols, list):
            self.cols = [cols]
        else:
            self.cols = cols

    def fit(self, X: pd.DataFrame, y: pd.Series):
        # there is nothing to fit
        return self

    def transform(self, X:pd.DataFrame):
        X = X.copy()
        return X[self.cols]

【讨论】:

  • 谢谢。 import numpy as np import pandas as pd from sklearn.compose import ColumnTransformer from sklearn import preprocessing prep_pipeline = ColumnTransformer(transformers=[("std_num", preprocessing.StandardScaler(), ["a", "b"]), ("dropcolumns ", DropSomeColumns(), ["b", "c"] )], 余数 = "passthrough") X = pd.DataFrame([[0., 1., 2., 2.], [1., 1 ., 0., 1.]]) X.columns = ["a", "b", "c", "d"] prep_pipeline.fit_transform(X) 给出 __init__() 缺少 1 个必需的位置参数:'cols'
  • @Seymour 我猜你无法通过使用 ColumnTransformer 来实现你的愿望 - 你不能使用 sklearn Pipeline 类来代替?
  • 我没有这个意义上的约束。我猜我可以使用 Pipeline,如何使用 Pipeline 来实现,ColumnTransformer 和 Pipeline 之间的主要区别是什么?
  • 从文档和源代码中,我可以说 ColumnTransformer 获取您的数据框并独立对其应用一些转换(即当前转换不受以前的转换影响 - 如果我错了,请纠正我)然后连接结果。但在 Pipeline 中,每个转换都会影响后面的转换
猜你喜欢
  • 2020-01-29
  • 2020-12-29
  • 2020-10-06
  • 2018-02-24
  • 2020-02-04
  • 2018-06-01
  • 2021-10-25
  • 1970-01-01
  • 2012-04-06
相关资源
最近更新 更多