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

时间:2017-07-06 21:25:02

标签: apache-spark-mllib random-forest decision-tree

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

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

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

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

3 个答案:

答案 0 :(得分: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

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

所以回答你的问题

  

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

它将被视为连续变量。

  

这是正确的方法吗?或者我应该继续使用One-Hot-Encoding   对于分类特征

取决于您对数据的理解。虽然随机森林和一些提升方法并不需要OneHot Encoding,但大多数ML算法都需要它。

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

答案 1 :(得分:3)

简而言之,Spark的RandomForest不需要OneHotEncoder用于StringIndexer或VectorIndexer创建的分类功能。

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

答案 2 :(得分:1)

根据vdep答案,StringIndexer对于序数数据就足够了。但是,StringIndexer会按标签频率对数据进行排序,例如“优>优>中性>差>极差”可能会变成“好,优,中”。因此,对于原始数据,StringIndexer不适合它。

第二,对于名义数据,文档告诉我们

  

对于具有一个具有三个类别A,B和C的类别特征的二元分类问题,标签1的对应比例分别为0.2、0.6和0.4,这些类别特征按A,C,B排序。两个拆分候选为A | C,B和A,C | B在哪里表示拆分。

“标签1的对应比例”与标签频率相同吗?因此,我对StringInder到Spark中DecisionTree的可行性感到困惑。