如何从 sklearn 中为多列反转 Label Encoder?
How to reverse Label Encoder from sklearn for multiple columns?
我想在多个列上使用 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)
有没有办法修改代码并将其更改为用于反转编码器的标签?
谢谢
您不需要这样修改它。它已经实现为方法 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')
为了对数据进行逆变换,您需要记住用于变换每一列的编码器。一种可能的方法是将 LabelEncoder
保存在对象内的字典中。它的工作方式:
- 当您调用
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
的相同方法。只需确保在需要逆变换时保留编码器即可。
LabelEncoder()
应该只用于对目标进行编码。这就是为什么您不能像任何其他转换器一样同时在多个列上使用它。另一种方法是 OrdinalEncoder
,它与 LabelEncoder 的作用相同,但可以同时用于所有分类列,就像 OneHotEncoder
:
from sklear.preprocessing import OrdinalEncoder
oe = OrdinalEncoder()
X = or.fit_transform(X)
我想在多个列上使用 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)
有没有办法修改代码并将其更改为用于反转编码器的标签?
谢谢
您不需要这样修改它。它已经实现为方法 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')
为了对数据进行逆变换,您需要记住用于变换每一列的编码器。一种可能的方法是将 LabelEncoder
保存在对象内的字典中。它的工作方式:
- 当您调用
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
的相同方法。只需确保在需要逆变换时保留编码器即可。
LabelEncoder()
应该只用于对目标进行编码。这就是为什么您不能像任何其他转换器一样同时在多个列上使用它。另一种方法是 OrdinalEncoder
,它与 LabelEncoder 的作用相同,但可以同时用于所有分类列,就像 OneHotEncoder
:
from sklear.preprocessing import OrdinalEncoder
oe = OrdinalEncoder()
X = or.fit_transform(X)