scikit-learn决策树是否支持无序('enum')多类功能?

时间:2013-09-11 06:33:11

标签: python scikit-learn decision-tree

documentation开始,DecisionTreeClassifier似乎支持多类功能

  

DecisionTreeClassifier能够二进制(标签为[-1,1])分类和多类(标签为[0,...,K-1])分类。

但是,似乎每个节点中的决策规则都基于'大于'

我正在尝试使用枚举功能构建树(其中每个功能的绝对值没有意义 - 只等于\不等于)

这是scikit-learn决策树支持吗?

我目前的解决方案是将每个功能分离为每个可能值的一组二进制功能 - 但我正在寻找更清洁,更有效的解决方案。

3 个答案:

答案 0 :(得分:10)

术语多类仅影响目标变量:对于scikit中的随机森林 - 学习它是分类的,带有用于多类分类的整数编码或用于回归的连续。

“大于”规则适用于输入变量,与目标变量的类型无关。如果您有具有低维度的分类输入变量(例如,少于几十个可能的值),则对那些使用单热编码可能是有益的。参见:

  • OneHotEncoder如果您的类别被编码为整数,
  • DictVectorizer如果您的类别在python dict列表中编码为字符串标签。

如果某些分类变量具有较高的基数(例如,数千个可能的值或更多),那么已经通过实验证明DecisionTreeClassifier和基于它们的更好模型,例如RandomForestClassifier s直接在原始整数编码上进行训练,而不将其转换为会浪费内存或模型大小的单热编码。

答案 1 :(得分:1)

DecisionTreeClassifier当然能够进行多类分类。恰好恰好在该链接中说明了“大于”,但是达到该决策规则是其对信息增益或基尼(see later in that page)的影响的结果。决策树节点通常具有二进制规则,因此它们通常采用某个值大于另一个值的形式。诀窍是转换数据,使其具有良好的预测值来进行比较。

要明确,多类意味着您的数据(比如文档)将被归类为一组可能的类之一。这与 multilabel 分类不同,其中文档需要使用一组可能的类中的几个类进行分类。大多数scikit-learn分类器都支持多类,并且它有一些meta-wrappers来完成多标记。您还可以使用概率(具有predict_proba方法的模型)或决策函数距离(具有decision_function方法的模型)进行多标记。

如果您说您需要为每个数据应用多个标签(例如['red','sport','fast']到汽车),那么您需要为每个可能的组合创建一个唯一的标签以使用树/ forests,它们成为你的[0 ... K-1]类。但是,这意味着数据中存在一些预测相关性(对于汽车示例中的组合颜色,类型和速度)。对于汽车,可能会有红色/黄色,快速跑车,但不太可能用于其他三向组合。对于那些少数人而言,数据可能具有强烈的预测性最好使用SVM或LinearSVC和/或用OneVsRestClassifier或类似的包装。

答案 2 :(得分:1)

有一个名为DecisionTree https://engineering.purdue.edu/kak/distDT/DecisionTree-2.2.2.html的Python包 我觉得非常有帮助。

这与您的scikit / sklearn问题没有直接关系,但对其他人有帮助。 另外,当我在寻找python工具时,我总是去pyindex。 https://pypi.python.org/pypi/pyindex

谢谢