使用单个管道

时间:2018-06-05 22:24:48

标签: python pandas scikit-learn

我正在尝试预处理和准备数据集来训练模型。数据集具有一些数字和分类特征。我们假设这是数据集(表示为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函数应用于所有要素的子集,这使我相信这不能使用单个管道来完成。但我很高兴被证明是错误的。

由于

1 个答案:

答案 0 :(得分: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)