我有一个数据集,其中包含很多缺失的分类值,我想创建一个自定义填补器,用"no-variable_name"
的值来填充这些空值。
例如,如果"Workclass"
列有一个Nan
值,就用"No Workclass"
替换它。
我目前是这样做的
X_train['workclass'].fillna("No workclass", inplace = True)
但我想创建一个Imputer
,这样我就可以在管道中使用它。
回答:
您可以使用TransformerMixin
定义一个自定义转换器。这里是一个简单的例子,如何定义一个简单的转换器并将其包含在管道中:
df = pd.DataFrame({'workclass':['class1', np.nan, 'Some other class', 'class1', np.nan, 'class12', 'class2', 'class121'], 'color':['red', 'blue', np.nan, 'pink', 'green', 'magenta', np.nan, 'yellow']})# train test split of Xdf_train = df[:3]df_test = df[3:]print(df_test) workclass color3 class1 pink4 NaN green5 class12 magenta6 class2 NaN7 class121 yellow
这个想法是使用df_train
数据框进行拟合,并将转换应用到df_test
上。我们可以定义一个从TransformerMixin
继承的自定义转换类:
from sklearn.pipeline import Pipelinefrom sklearn.base import TransformerMixinclass InputColName(TransformerMixin): def fit(self, X, y): self.fill_with = X.columns return self def transform(self, X): return np.where(X.isna(), 'No ' + self.fill_with, X)
然后将其包含在您的管道中(这里仅使用InputColName
以保持示例的简单性),并使用训练数据进行拟合:
pipeline = Pipeline(steps=[ ('inputter', InputColName())])pipeline.fit(df_train)
现在,如果我们尝试使用未见过的数据进行转换:
print(pd.DataFrame(pipeline.transform(df_test), columns=df.columns)) workclass color0 class1 pink1 No workclass green2 class12 magenta3 class2 No color4 class121 yellow