在进行机器学习分类任务的标签预处理时,我需要对取字符串值的标签进行独热编码。由于来自 sklearn.preprocessing
的 OneHotEncoder
或来自 kera.np_utils
的 to_categorical
需要 int
输入,这意味着我需要在独热编码之前使用 LabelEncoder
。我已经手动用一个自定义类完成了这个过程:
class LabelOneHotEncoder():
def __init__(self):
self.ohe = OneHotEncoder()
self.le = LabelEncoder()
def fit_transform(self, x):
features = self.le.fit_transform( x)
return self.ohe.fit_transform( features.reshape(-1,1))
def transform( self, x):
return self.ohe.transform( self.la.transform( x.reshape(-1,1)))
def inverse_tranform( self, x):
return self.le.inverse_transform( self.ohe.inverse_tranform( x))
def inverse_labels( self, x):
return self.le.inverse_transform( x)
我相信在sklearn API中使用 sklearn.pipeline
一定有办法做到这一点,但是当使用以下代码时:
LabelOneHotEncoder = Pipeline( [ ("le",LabelEncoder), ("ohe", OneHotEncoder)])
我从OneHotEncoder
那里得到了错误的提示信息ValueError: bad input shape()
。我猜测是由于LabelEncoder
的输出需要通过添加一个无关的第二维来进行重塑。但我不知道如何添加这个特性。
ModifiedLabelEncoder
而不是ModifiedLabelEncoder()
。其次,reshape参数应该是(-1,1)
。之后,ModifiedLabelEncoder
可以自行工作,但在管道中却不行。当调用fit_transform
时,我得到一个TypeError: super(type, obj): obj must be an instance or subtype of type
的错误。 - Learning is a mess*args, **kwargs
)之后,这段代码能够正常工作。已接受答案,谢谢! - Learning is a mess