如何处理 spark ml 中决策树、随机森林的分类特征?

How to handle categorical features for Decision Tree, Random Forest in spark ml?

我正在尝试在 UCI 银行营销数据上构建决策树和随机森林分类器 -> https://archive.ics.uci.edu/ml/datasets/bank+marketing。数据集中有许多分类特征(具有字符串值)。

在 spark ml 文档中,提到可以使用 StringIndexer 或 VectorIndexer 通过索引将分类变量转换为数值。我选择使用 StringIndexer(向量索引需要向量特征,而将特征转换为向量特征的向量汇编器只接受数字类型)。使用这种方法,分类特征的每个级别都将根据其频率分配数值(0 表示类别特征的最常见标签)。

我的问题是随机森林或决策树的算法如何理解新特征(源自分类特征)与连续变量不同。索引特征在算法中会被认为是连续的吗?这是正确的方法吗?或者我应该继续使用 One-Hot-Encoding 来获得分类特征。

我阅读了这个论坛的一些答案,但最后一部分我没有弄清楚。

应该对类别 > 2 的分类变量进行一次热编码。

要理解为什么,你应该知道分类数据的子类别之间的区别:Ordinal dataNominal data

序数数据:值之间有某种排序。例子: 客户反馈(优秀、良好、中立、差、非常差)。正如您所看到的,它们之间有一个明确的顺序(优秀 > 好 > 中性 > 差 > 非常差)。在这种情况下,仅 StringIndexer 就足以用于建模目的。

标称数据:值之间没有定义的顺序。 示例:颜色(黑色、蓝色、白色、...)。在这种情况下,仅 StringIndexerNOT 就足够了。在 String Indexing.

之后需要 One Hot Encoding

String Indexing 之后假设输出为:

 id | colour   | categoryIndex
----|----------|---------------
 0  | black    | 0.0
 1  | white    | 1.0
 2  | yellow   | 2.0
 3  | red      | 3.0

然后如果没有 One Hot Encoding,机器学习算法将假设:red > yellow > white > black,我们知道这不是真的。 OneHotEncoder() 会帮助我们避免这种情况。

所以回答你的问题,

Will indexed feature be considered as continuous in the algorithm?

它将被视为连续变量。

Is it the right approach? Or should I go ahead with One-Hot-Encoding for categorical features

取决于您对 data.Although 随机森林的理解,一些提升方法不需要 OneHot Encoding,大多数 ML 算法都需要它。

参考:https://spark.apache.org/docs/latest/ml-features.html#onehotencoder

简而言之,对于由 StringIndexer 或 VectorIndexer 创建的分类特征,Spark 的 RandomForest 不需要 OneHotEncoder。

更长的解释。一般来说,DecisionTrees 可以处理 Ordinal 和 Nominal 类型的数据。但是,当涉及到实现时,可能需要 OneHotEncoder(因为它在 Python 的 scikit-learn 中)。
幸运的是,如果处理得当并且不需要 OneHotEncoder,Spark 的 RandomForest 实现会支持分类特征! 正确处理意味着分类特征包含相应的元数据,以便 RF 知道它正在处理什么。由 StringIndexer 或 VectorIndexer 创建的特征在 DataFrame 中包含有关由索引器生成并分类的元数据。

根据 vdep 的回答,StringIndexer 足以用于序数数据。但是 StringIndexer 按标签频率对数据进行排序,例如 "excellent > good > neutral > bad > very bad" 可能会变成 "good,excellent,neutral"。所以对于 Oridinal 数据,StringIndexer 不适合它。

其次,对于标称数据,文档告诉我们

for a binary classification problem with one categorical feature with three categories A, B and C whose corresponding proportions of label 1 are 0.2, 0.6 and 0.4, the categorical features are ordered as A, C, B. The two split candidates are A | C, B and A , C | B where | denotes the split.

"corresponding proportions of label 1"与标签频率相同?所以我对 StringInder 到 Spark 中的 DecisionTree 的可行性感到困惑。