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 ,变换和值之间的反向单一关系?