今天在用ColumnTransformer方法对数值变量和非数值变量进行合成转换的时候,掌柜选择对其中的类别特征用LabelEncoder()方法,结果出现报错如上。但是换成OneHotEncoder(独热编码)就成功运行。
于是疑惑 为什么会出现这样的情况? 一搜发现Stackoverflow上面也有同样疑问的朋友,结合两位答主回答:
发现两个主要的原因为什么不适合用LabelEncoder():
因为LabelEncoder()的transformer是用来编码目标变量(y)(可参见官方文档)(感觉蛮多人误用了这个方法。。。也包括掌柜我 )
,所以LabelEncoder()其实是作用于一维(y)值,那么多维特征列(>=2)输入的时候就会报错!
其次,LabelEncoder()调用fit_transform(self, y)函数,这里是定义了两个参数的:
而 如果使用ColumnTransformer()方法在pipeline中进行fit_transform的时候,就会默认调用 fit_transform(self, X, y=None) 函数
这里就出现了三个定义参数。。。那么就会华丽丽地报错❌如题。
总结一句话就是:LabelEncoder()不适用于ColumnTransformer方法在Pipeline中进行transformer多维的类别特征/变量转换。
然后解决的办法两种:
怪不得掌柜有时候翻看官方文档的时候,发现在sklearn的很多官方示例里面,如果使用ColumnTransformer方法对多个特征列进行转换,一般都是使用OneHotEncoder()来对多列的类别特征处理。
参考资料:
sklearn.compose.ColumnTransformer: fit_transform() takes 2 positional arguments but 3 were given
LabelEncoder官方文档和源码
ColumnTransformer的官方文档和源码