从文档中可以看出,DecisionTreeClassifier
支持多类功能
DecisionTreeClassifier 能够进行二元(其中标签为 [-1, 1])分类和多类(其中标签为 [0, ..., K-1])分类。
但是,似乎每个节点中的决策规则都是基于"大于然后"
我正在尝试构建具有枚举特征的树(每个特征的绝对值没有意义 - 只是等于\不等于)
这在scikit-learn决策树中是否受支持?
我目前的解决方案是将每个特征分离为每个可能值的一组二进制特征 - 但我正在寻找一个更干净、更有效的解决方案。
术语多类只影响目标变量:对于scikit-learn中的随机森林,它要么是分类的,用整数编码进行多类分类,要么是连续的回归。
"大于"规则适用于独立于目标变量类型的输入变量。如果您有低维的分类输入变量(例如,少于几十个可能的值),那么对这些变量使用单热编码可能是有益的。看:
- OneHotEncoder 如果您的类别被编码为整数,
- DictVectorizer,如果您的类别在python字典列表中编码为字符串标签。
如果某些分类变量具有高基数(例如数千个可能的值或更多),那么实验表明,DecisionTreeClassifier
s和基于它们的更好模型(如RandomForestClassifier
s)可以直接在原始整数编码上进行训练,而无需将其转换为会浪费内存或模型大小的单热编码。
DecisionTreeClassifier
当然能够进行多类分类。 "大于"恰好在该链接中得到了说明,但达到该决策规则是它对信息增益或基尼的影响的结果(请参阅该页面的后面部分)。决策树节点通常具有二进制规则,因此它们通常采用某个值大于另一个值的形式。诀窍是转换数据,使其具有良好的预测值可供比较。
需要明确的是,多类意味着您的数据(例如文档)将被归类为一组可能的类之一。 这与多标签分类不同,在多标签分类中,文档需要使用一组可能的类中的多个类进行分类。 大多数scikit-learn分类器都支持多类,并且它有一些元包装器来完成多标签。 您还可以使用概率(使用 predict_proba
方法的模型)或决策函数距离(使用 decision_function
方法的模型)进行多重标记。
如果你说你需要对每个基准面应用多个标签(如['红色','运动','快速']到汽车),那么你需要为每个可能的组合创建一个唯一的标签来使用树木/森林,这将成为你的[0...K-1]类集。 但是,这意味着数据中存在一些预测相关性(对于汽车示例中的组合颜色、类型和速度)。 对于汽车,可能有红色/黄色快速跑车,但不太可能用于其他 3 向组合。 数据可能对少数人具有很强的预测性,而对其余部分则非常弱。最好使用 SVM 或 LinearSVC 和/或使用 OneVsRestClassifier 或类似工具进行包装。
有一个名为 DecisionTree 的 Python 包 https://engineering.purdue.edu/kak/distDT/DecisionTree-2.2.2.html我觉得很有帮助。
这与你的scikit/sklearn问题没有直接关系,但对其他人有帮助。另外,当我在寻找python工具时,我总是去pyindex。https://pypi.python.org/pypi/pyindex
谢谢