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