我想知道sklearn LabelEncoder和pandas get_dummies之间的区别。为什么会选择LabelEncoder而不是get_dummies。 使用一个比另一个有什么优势?弊?
据我了解,我是否有A类
ClassA = ["Apple", "Ball", "Cat"]
encoder = [1, 2, 3]
和
dummy = [001, 010, 100]
我理解错了吗?
这些只是方便的函数,自然而然地落入这两个库分别倾向于做事的方式中。第一个通过将内容更改为整数来"压缩"信息,第二个"扩展"维度,允许(可能)更方便地访问。
sklearn.preprocessing.LabelEncoder
只是从任何域转换数据,使其域为 0, ..., k - 1,其中 k 是类的数量。
所以,例如
["paris", "paris", "tokyo", "amsterdam"]
可以成为
[0, 0, 1, 2]
pandas.get_dummies
还采用包含来自某个域的元素的 Series,但将其扩展为数据帧,其列对应于系列中的条目,并且值为 0 或 1,具体取决于它们最初是什么。所以,例如,相同的
["paris", "paris", "tokyo", "amsterdam"]
将成为带有标签的数据帧
["paris", "tokyo", "amsterdam"]
谁"paris"
条目将是该系列
[1, 1, 0, 0]
第一种方法的主要优点是可以节省空间。相反,将事物编码为整数可能会给人一种印象(对您或某些机器学习算法而言),即顺序意味着什么。"阿姆斯特丹"是否仅仅因为整数编码而更接近"东京"而不是"巴黎"?应该不会。第二种表示法对此更清楚一些。
pandas.get_dummies
是独热编码,但sklearn.preprocessing.LabelEncoder
是增量编码,例如0,1,2,3,4,...
独热编码更适合机器学习。因为标签是相互独立的,例如 2 并不意味着值 1 的两倍。
如果同一特征的训练集和测试集具有不同数量的类,请参阅在训练和测试数据中保留相同的虚拟变量以获取两个解决方案。