首页 > 解决方案 > 何时使用 StringIndexer 与 StringIndexer+OneHotEncoder?

问题描述

何时/在什么情况下应该使用 StringIndexer 与 StringIndexer+OneHotEncoder?

查看 sparkml 的 StringIndexer ( https://spark.apache.org/docs/latest/ml-features#stringindexer ) 和 OneHotEncoder ( https://spark.apache.org/docs/latest/ml-features#onehotencoder ) 的文档),对我来说,何时仅使用 StringIndexer 与 StringIndexer+OneHotEncoder 并不明显(我一直在基准数据集上使用 StringIndexer 并获得了相当好的结果,但我认为这并不意味着这样做一定是“正确的”)。ohe 文档引用了 StringIndexer > OneHotEncoder > VectorAssembler 暂存管道,但它的措辞方式使它看起来是可选的(与仅执行 StringIndexer > VectorAssembler 相比)。

任何人都可以为我澄清这一点吗?

标签: apache-spark-mllibapache-spark-ml

解决方案


首先,必须在 OneHotEncoder 之前使用 StringIndexer,因为OneHotEncoder需要一列类别索引作为输入。

为了回答您的问题,StringIndexer 可能会偏向某些机器学习模型。例如,在将具有三个类别(0、1 和 2)的分类列的数据框传递给线性回归模型之后。值 1 和 2 之间的双倍关系可能会得出结论,而它只是一个不同的类别,一个不同的索引。当在特定位置具有零和一的向量时,可以传输所需的类别差异信息。所以最后,它取决于训练期间使用的模型,基于树的模型对 one-hot 编码很敏感,并且对 one-hot 编码向量变得更糟。

您可以考虑阅读Create a Pipeline - Learning Spark以了解热编码背后的更多详细信息。


推荐阅读