【问题标题】:Preprocess a dataset with different feature types using a single Pipeline使用单个管道预处理具有不同特征类型的数据集
【发布时间】:2018-06-05 22:24:48
【问题描述】:

我正在尝试预处理和准备数据集以训练模型。该数据集具有一些数字和分类特征。假设这是数据集(呈现为 Pandas DataFrame): Age,Gender,Height 23,M,170 33,M,195 31,F,165

我们希望将其转换为以下格式,仅使用 scikit-learn 0.19.0 中的 Transform 函数和单个 Pipeline 对象 Age,Gender_M,Gender_F,Height 0.0,1,0,170 1.0,1,0,195 0.8,0,1,165

变换如下:

年龄:MinMaxScaler

性别:OneHotEncoder

身高:不变

这甚至可能吗(为了让它稍微容易一些的替代方法是暂时放弃高度功能)?

在我自己尝试提出解决方案的过程中,我注意到无法将 Transform 函数应用于所有功能的子集,这让我相信这无法使用单个 Pipeline 完成。但我会很高兴被证明是错误的。

谢谢

【问题讨论】:

  • 你试过了吗?如果是这样,请edit 提供您的最新尝试。提示:官方文档中有一些很好的例子(以及跨 SO):here & here
  • 感谢您的评论。问题有点棘手。不仅仅是知道某些变换函数的存在。它是关于如何使用它们并将它们部分应用到数据集以及在 Pipeline 对象内(我现在怀疑这是否可行)。
  • 除了@AbhishekMishra 给出的答案,您还可以查看this scikit example,它解释了这个用例。

标签: python pandas scikit-learn


【解决方案1】:

您可以编写自己的转换器来执行所需的操作,如下所示。

from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import MinMaxScaler

class CustomTransformer((BaseEstimator, TransformerMixin):
   def __init__(self):
      self.one_hot_encoder = OneHotEncoder()
      self.min_max_scaler = MinMaxScaler()
   def fit(self, X, y):
       self.one_hot_encoder.fit(X.Gender)
       self.min_max_scaler.fit(X.Age)
       return self
   def transform(self, X, y):
       X["Gender"] = self.one_hot_encoder.transform(X["Gender"])
       X["Age"] = self.min_max_scaler(X["Age"]
       return X

现在您可以在此转换器上使用 Pipeline 对象,如下所示:

from sklearn.pipeline import Pipeline 
pipeline = Pipeline(("transform", CustomTransformer()), ("estimator", est))
pipeline.fit(X, y)

【讨论】:

  • 感谢您的友好回复。但是,我需要完全依赖 scikit-learn 中现有的 Transform 函数,而不需要实现自定义函数。
猜你喜欢
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 2023-01-13
  • 2022-09-28
  • 2016-04-12
  • 2012-08-28
  • 2021-10-30
相关资源
最近更新 更多