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

use*_*992 4 decision-tree random-forest apache-spark-mllib

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

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

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

我从这个论坛上读到了一些答案,但我没有弄清楚最后一部分.

vde*_*dep 6

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

要了解原因,您应该知道分类数据子类别之间的区别:Ordinal dataNominal data.

序数据:值之间有某种排序.示例:客户反馈(优秀,良好,中立,糟糕,非常糟糕).正如你所看到的,他们之间有一个明确的顺序(优秀>好>中立>差>非常糟糕).在这种情况下,StringIndexer单独就足以用于建模目的.

标称数据:值之间没有定义的顺序.例如:颜色(黑色,蓝色,白色......).在这种情况下,StringIndexer单是足够的.并且One Hot Encoding在之后是必需的String Indexing.

之后String Indexing让我们假设输出为:

 id | colour   | categoryIndex
----|----------|---------------
 0  | black    | 0.0
 1  | white    | 1.0
 2  | yellow   | 2.0
 3  | red      | 3.0
Run Code Online (Sandbox Code Playgroud)

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

所以回答你的问题,

索引特征在算法中会被认为是连续的吗?

它将被视为连续变量.

这是正确的方法吗?或者我应该继续使用One-Hot-Encoding进行分类功能

取决于你对数据的理解.虽然Random Forest和一些增强方法不需要OneHot Encoding,但大多数ML算法都需要它.

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