如何处理 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 data
和Nominal data
。
序数数据:值之间有某种排序。例子:
客户反馈(优秀、良好、中立、差、非常差)。正如您所看到的,它们之间有一个明确的顺序(优秀 > 好 > 中性 > 差 > 非常差)。在这种情况下,仅 StringIndexer
就足以用于建模目的。
标称数据:值之间没有定义的顺序。
示例:颜色(黑色、蓝色、白色、...)。在这种情况下,仅 StringIndexer
是 NOT 就足够了。在 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 的可行性感到困惑。
我正在尝试在 UCI 银行营销数据上构建决策树和随机森林分类器 -> https://archive.ics.uci.edu/ml/datasets/bank+marketing。数据集中有许多分类特征(具有字符串值)。
在 spark ml 文档中,提到可以使用 StringIndexer 或 VectorIndexer 通过索引将分类变量转换为数值。我选择使用 StringIndexer(向量索引需要向量特征,而将特征转换为向量特征的向量汇编器只接受数字类型)。使用这种方法,分类特征的每个级别都将根据其频率分配数值(0 表示类别特征的最常见标签)。
我的问题是随机森林或决策树的算法如何理解新特征(源自分类特征)与连续变量不同。索引特征在算法中会被认为是连续的吗?这是正确的方法吗?或者我应该继续使用 One-Hot-Encoding 来获得分类特征。
我阅读了这个论坛的一些答案,但最后一部分我没有弄清楚。
应该对类别 > 2 的分类变量进行一次热编码。
要理解为什么,你应该知道分类数据的子类别之间的区别:Ordinal data
和Nominal data
。
序数数据:值之间有某种排序。例子:
客户反馈(优秀、良好、中立、差、非常差)。正如您所看到的,它们之间有一个明确的顺序(优秀 > 好 > 中性 > 差 > 非常差)。在这种情况下,仅 StringIndexer
就足以用于建模目的。
标称数据:值之间没有定义的顺序。
示例:颜色(黑色、蓝色、白色、...)。在这种情况下,仅 StringIndexer
是 NOT 就足够了。在 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 的可行性感到困惑。