sklearn LabelEncoder 和 pd.get_dummies 有啥区别?

Posted

技术标签:

【中文标题】sklearn LabelEncoder 和 pd.get_dummies 有啥区别?【英文标题】:What is the difference between sklearn LabelEncoder and pd.get_dummies?sklearn LabelEncoder 和 pd.get_dummies 有什么区别? 【发布时间】:2016-11-19 16:41:01 【问题描述】:

我想知道 sklearn LabelEncoder 与 pandas get_dummies 之间的区别。为什么会选择 LabelEncoder 而不是 get_dummies。使用一个比另一个有什么优势?缺点?

据我所知,如果我有 A 类

ClassA = ["Apple", "Ball", "Cat"]
encoder = [1, 2, 3]

dummy = [001, 010, 100]

我理解错了吗?

【问题讨论】:

顺便说一句,get_dummies 的等价物是OneHotEncoder 【参考方案1】:

这些只是方便的函数,它们自然地落入这两个库各自倾向于做事的方式中。第一个通过将事物更改为整数来“压缩”信息,第二个“扩展”维度,允许(可能)更方便地访问。


sklearn.preprocessing.LabelEncoder 只是简单地转换来自任何域的数据,使其域为 0, ..., k - 1,其中 k 是类的数量.

所以,例如

["paris", "paris", "tokyo", "amsterdam"]

可能变成

[0, 0, 1, 2]

pandas.get_dummies 还接受一个包含来自某个域的元素的系列,但将其扩展为一个 DataFrame,其列对应于系列中的条目,值是 0 或 1,具体取决于它们的原始值。所以,例如,相同的

["paris", "paris", "tokyo", "amsterdam"]

会变成带标签的DataFrame

["paris", "tokyo", "amsterdam"]

"paris" 条目将是系列

[1, 1, 0, 0]

第一种方法的主要优点是节省空间。相反,将事物编码为整数可能会给您(给您或某些机器学习算法)这样的印象,即顺序意味着什么。仅仅因为整数编码,“阿姆斯特丹”是否更接近“东京”而不是“巴黎”?可能不是。第二种表达方式更清楚一点。

【讨论】:

感谢您的澄清。如果您要处理分类问题,您会在响应变量上也使用 get_dummy 还是使用标签编码器更好? 根据经验,如果类没有自然顺序,则为虚拟变量,但主要考虑的是您的算法实现所期望的。您可能想打开一个不同的问题来描述问题,以及您计划使用哪个特定分类(最好甚至指定库中的特定函数)。 另外,我认为如果我们有很多分类类并且我们希望有更好的性能,那么我们也应该使用标签编码 将变量编码为整数仅在使用回归时才重要。在分类中,我们使用适合定性/分类响应值的方法进行预测,因此编码之间的“距离”并不重要。 (来源:Introduction to Statistical Learning,第 4 章,第 4.2 节)【参考方案2】:

pandas.get_dummies是one-hot编码但sklearn.preprocessing.LabelEncoder是增量编码,比如0,1,2,3,4,...

one-hot 编码更适合机器学习。因为标签是相互独立的,例如2 并不意味着是 1 的两倍。

如果训练集和测试集相同特征的类数不同,请参考Keep same dummy variable in training and testing data两种解决方案。

【讨论】:

以上是关于sklearn LabelEncoder 和 pd.get_dummies 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn中的LabelEncoder和OneHotEncoder的区别

LabelEncoder 与 sklearn ,变换和值之间的反向单一关系?

sklearn中labelEncoder的工作

sklearn-标准化标签LabelEncoder

sklearn.preprocessing 中 LabelEncoder 的类似方法?

11.sklearn.preprocessing.LabelEncoder的作用