scikit-learn 决策树是不是支持无序(“枚举”)多类特征?
Posted
技术标签:
【中文标题】scikit-learn 决策树是不是支持无序(“枚举”)多类特征?【英文标题】:does scikit-lean decision tree support unordered ('enum') multiclass features?scikit-learn 决策树是否支持无序(“枚举”)多类特征? 【发布时间】:2013-09-15 01:32:21 【问题描述】:从documentation 看来,DecisionTreeClassifier
支持多类功能
DecisionTreeClassifier 能够进行二元(标签为 [-1, 1])分类和多类(标签为 [0, ..., K-1])分类。
但是,似乎每个节点中的决策规则都是基于“大于”
我正在尝试构建具有枚举特征的树(每个特征的绝对值没有意义 - 只是相等\不相等)
scikit-learn 决策树是否支持此功能?
我目前的解决方案是将每个特征分离为一组二进制特征,以获得每个可能的值 - 但我正在寻找一种更清洁、更有效的解决方案。
【问题讨论】:
【参考方案1】:术语多类只影响目标变量:对于 scikit-learn 中的随机森林,它要么是分类的,多类分类的整数编码,要么是回归的连续。
“大于”规则适用于输入变量,与目标变量的种类无关。如果您有低维的分类输入变量(例如,少于几十个可能值),那么对这些变量使用 one-hot-encoding 可能是有益的。见:
OneHotEncoder 如果您的类别编码为整数, DictVectorizer 如果您的类别在 python dict 列表中编码为字符串标签。如果某些分类变量具有高基数(例如数千个或更多可能值),则实验表明DecisionTreeClassifier
s 和基于它们的更好模型(例如RandomForestClassifier
s)可以直接在未将其转换为会浪费内存或模型大小的一次性编码的原始整数编码。
【讨论】:
你对最后的声明有参考吗? 没有参考,这是scikit-learn邮件列表中的从业者刚刚报告的。 @ogrisel 如果有一个指向邮件列表存档的链接,那就太好了:)。谢谢!【参考方案2】:DecisionTreeClassifier
当然可以进行多类分类。 “大于”恰好在该链接中说明,但到达该决策规则是它对信息增益或基尼 (see later in that page) 的影响的结果。决策树节点通常具有二进制规则,因此它们通常采用某个值大于另一个值的形式。诀窍是转换您的数据,使其具有良好的预测值进行比较。
明确地说,multiclass 意味着您的数据(例如文档)将被归类为一组可能的类别之一。这与 multilabel 分类不同,后者需要从一组可能的类中对文档进行分类。大多数 scikit-learn 分类器都支持多类,并且它有一些元包装器来完成多标签。您还可以使用概率(使用predict_proba
方法的模型)或决策函数距离(使用decision_function
方法的模型)进行多标签。
如果您说您需要为每个数据应用多个标签(如 ['red','sport','fast'] 到汽车),那么您需要为每个可能的组合创建一个唯一标签以使用树/forests,它成为您的 [0...K-1] 类集。但是,这意味着数据中存在一些预测相关性(对于汽车示例中的颜色、类型和速度的组合)。对于汽车,可能有红色/黄色的快速跑车,但不太可能用于其他 3 路组合。数据可能对少数人具有很强的预测性,而对其余的人则非常弱。最好使用 SVM 或 LinearSVC 和/或使用 OneVsRestClassifier 或类似的包装。
【讨论】:
【参考方案3】:有一个名为 DecisionTree https://engineering.purdue.edu/kak/distDT/DecisionTree-2.2.2.html 的 Python 包 我觉得这很有帮助。
这与您的 scikit/sklearn 问题没有直接关系,但对其他人有帮助。 另外,当我在寻找 python 工具时,我总是去 pyindex。 https://pypi.python.org/pypi/pyindex
谢谢
【讨论】:
以上是关于scikit-learn 决策树是不是支持无序(“枚举”)多类特征?的主要内容,如果未能解决你的问题,请参考以下文章