如何从sklearn反转Label Encoder多列?

发布于 2021-01-29 16:31:58

我想在多列上对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)

有没有办法修改代码并对其进行更改,以便将其用于反转编码器中的标签?

谢谢

关注者
0
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    • 当您调用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的相同方法。只要确保在需要逆变换时将编码器摆在附近即可。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看