【问题标题】:How to reverse Label Encoder from sklearn for multiple columns?如何从 sklearn 为多列反转标签编码器?
【发布时间】:2021-05-29 00:15:06
【问题描述】:

我想在多个列上对 LabelEncoder 使用 inverse_transform 函数。

这是我在数据帧上应用 LabelEncoder 时用于多个列的代码:

class MultiColumnLabelEncoder:
    def __init__(self,columns = None):
        self.columns = columns # array of column names to encode

    def fit(self,X,y=None):
        return self # not relevant here

    def transform(self,X):
        '''
        Transforms columns of X specified in self.columns using
        LabelEncoder(). If no columns specified, transforms all
        columns in X.
        '''
        output = X.copy()
        if self.columns is not None:
            for col in self.columns:
                output[col] = LabelEncoder().fit_transform(output[col])
        else:
            for colname,col in output.iteritems():
                output[colname] = LabelEncoder().fit_transform(col)
        return output

    def fit_transform(self,X,y=None):
        return self.fit(X,y).transform(X)

有没有办法修改代码并将其更改为用于反转编码器的标签?

谢谢

【问题讨论】:

    标签: python scikit-learn categorical-data


    【解决方案1】:

    为了对数据进行逆变换,您需要记住用于转换每一列的编码器。一种可能的方法是将LabelEncoders 保存在对象内的字典中。它的工作方式:

    • 当您调用 fit 时,每列的编码器都适合并保存
    • 当您致电 transform 时,他们会习惯于转换数据
    • 当您致电 inverse_transform 时,他们会习惯于进行逆变换

    示例代码:

    class MultiColumnLabelEncoder:
    
        def __init__(self, columns=None):
            self.columns = columns # array of column names to encode
    
    
        def fit(self, X, y=None):
            self.encoders = {}
            columns = X.columns if self.columns is None else self.columns
            for col in columns:
                self.encoders[col] = LabelEncoder().fit(X[col])
            return self
    
    
        def transform(self, X):
            output = X.copy()
            columns = X.columns if self.columns is None else self.columns
            for col in columns:
                output[col] = self.encoders[col].transform(X[col])
            return output
    
    
        def fit_transform(self, X, y=None):
            return self.fit(X,y).transform(X)
    
    
        def inverse_transform(self, X):
            output = X.copy()
            columns = X.columns if self.columns is None else self.columns
            for col in columns:
                output[col] = self.encoders[col].inverse_transform(X[col])
            return output
    

    然后你可以像这样使用它:

    multi = MultiColumnLabelEncoder(columns=['city','size'])
    df = pd.DataFrame({'city':    ['London','Paris','Moscow'],
                       'size':    ['M',     'M',    'L'],
                       'quantity':[12,       1,      4]})
    X = multi.fit_transform(df)
    print(X)
    #    city  size  quantity
    # 0     0     1        12
    # 1     2     1         1
    # 2     1     0         4
    inv = multi.inverse_transform(X)
    print(inv)
    #      city size  quantity
    # 0  London    M        12
    # 1   Paris    M         1
    # 2  Moscow    L         4
    

    fit_transform 的单独实现可能会调用 LabelEncoders 的相同方法。只需确保在需要逆变换时保留编码器即可。

    【讨论】:

      【解决方案2】:

      您不需要以这种方式修改它。它已经实现为方法inverse_transform

      示例:

      from sklearn import preprocessing
      
      le = preprocessing.LabelEncoder()
      df = ["paris", "paris", "tokyo", "amsterdam"]
      
      le_fitted = le.fit_transform(df)
      
      inverted = le.inverse_transform(le_fitted)
      
      print(inverted)
      # array(['paris', 'paris', 'tokyo', 'amsterdam'], dtype='|S9')
      

      【讨论】:

      • 如果我想在整个数据帧上使用该函数而不是手动列出每一列怎么办?
      【解决方案3】:

      LabelEncoder() 只能用于编码目标。这就是为什么您不能像任何其他变压器一样在多个列上同时使用它。另一种选择是OrdinalEncoder,它与LabelEncoder 完成相同的工作,但可以同时用于所有分类列,就像OneHotEncoder

      from sklear.preprocessing import OrdinalEncoder
      
      oe = OrdinalEncoder()
      X = or.fit_transform(X)
      

      【讨论】:

        猜你喜欢
        • 2018-05-11
        • 2019-05-22
        • 2020-09-02
        • 2021-07-23
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        • 2017-07-27
        • 2017-03-27
        相关资源
        最近更新 更多