如何从sklearn反转Label Encoder多列?
我想在多列上对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)
有没有办法修改代码并对其进行更改,以便将其用于反转编码器中的标签?
谢谢
-
为了对数据进行逆变换,您需要记住用于变换每一列的编码器。一种可行的方法是将
LabelEncoder
s保存在对象内部的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
,将调用LabelEncoder
s的相同方法。只要确保在需要逆变换时将编码器摆在附近即可。 - 当您调用