【问题标题】:Create my custom Imputer for categorical variables sklearn为分类变量 sklearn 创建我的自定义 Imputer
【发布时间】:2020-07-31 08:45:40
【问题描述】:

我有一个缺少很多分类值的数据集,我想制作一个自定义估算器,它将用等于 "no-variable_name" 的值填充空值。

例如,如果列 "Workclass" 具有 Nan 值,请将其替换为 "No Workclass"

我是这样做的

X_train['workclass'].fillna("No workclass", inplace = True)

但我想创建一个Imputer,所以我可以在管道中传递它。

【问题讨论】:

  • 看起来 sklearn 已经有一个 SimpleImputer class 可以满足您的需求。如果它缺少某些东西,那么你总是可以继承它。
  • 答案对@vasilis 有帮助吗?不要忘记您可以投票并接受答案。见What should I do when someone answers my question?,谢谢:)
  • 是的,他们帮了很多忙!我只是检查了它们,因为我有点忙。谢谢大家!

标签: python pandas machine-learning scikit-learn sklearn-pandas


【解决方案1】:

您可以使用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 X
df_train = df[:3]
df_test = df[3:]

print(df_test)

  workclass    color
3    class1     pink
4       NaN    green
5   class12  magenta
6    class2      NaN
7  class121   yellow

我们的想法是使用df_train 数据框进行拟合,并在df_test 上复制转换。我们可以定义继承自 TransformerMixin 的自定义转换类:

from sklearn.pipeline import Pipeline
from sklearn.base import TransformerMixin

class 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     color
0        class1      pink
1  No workclass     green
2       class12   magenta
3        class2  No color
4      class121    yellow

【讨论】:

    【解决方案2】:

    您可以像这样自定义simpleImputer

    from sklearn.impute import SimpleImputer
    
    class customImputer(SimpleImputer):
        def fit(self, X, y=None):
            self.fill_value = ['No '+c for c in X.columns]
            return super().fit(X, y)
    
    
    df = pd.DataFrame({'workclass': ['classA', 'classB', np.NaN],
                       'fruit': ['apple',np.NaN,'orange']})
    df
    
    #   workclass   fruit
    #0  classA  apple
    #1  classB  NaN
    #2  NaN orange
    
    customImputer(strategy='constant').fit_transform(df)
    
    #array([['classA', 'apple'],
    #       ['classB', 'No fruit'],
    #       ['No workclass', 'orange']], dtype=object)
    

    【讨论】:

      【解决方案3】:

      您可以定义一个自定义函数并使用FunctionTransformer 调用它:

      from sklearn.preprocessing import FunctionTransformer
      
      def custom_fillna(X):
          return X.fillna('NONE')
      
      custom_imputer = FunctionTransformer(custom_fillna)
      custom_imputer.transform(X)
      

      【讨论】:

        猜你喜欢
        • 2018-06-27
        • 2016-11-14
        • 1970-01-01
        • 1970-01-01
        • 2019-05-26
        • 2016-11-04
        • 2020-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多