我正在尝试在UCI银行营销数据上构建决策树和随机森林分类器 - > https://archive.ics.uci.edu/ml/datasets/bank+marketing。数据集中有许多分类特征(具有字符串值)。
在spark ml文档中,提到可以使用StringIndexer或VectorIndexer通过索引将分类变量转换为数字。我选择使用StringIndexer(矢量索引需要矢量特征和矢量汇编器,它将特征转换为矢量特征只接受数字类型)。使用这种方法,分类特征的每个级别将根据其频率(对于类别特征的最频繁标签为0)分配数值。
我的问题是随机森林或决策树的算法将如何理解新特征(源自分类特征)与连续变量不同。索引特征在算法中会被认为是连续的吗?这是正确的方法吗?或者我应该继续使用One-Hot-Encoding进行分类功能。
我从这个论坛上读到了一些答案,但我没有弄清楚最后一部分。
答案 0 :(得分:6)
应对类别>的分类变量进行一次热编码; 2。强>
要了解原因,您应该了解分类数据的子类别之间的差异:Ordinal data
和Nominal 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的可行性感到困惑。