【问题标题】:DecisionTreeClassifier on multiple levels多层次的决策树分类器
【发布时间】:2018-04-22 16:51:05
【问题描述】:

我正在尝试对具有多个级别的对象进行分类。我可以用一个例子来解释它的最好方法:

我可以这样做:

from sklearn import tree
features = ['Hip Hop','Boston'],['Metal', 'Cleveland'],['Gospel','Ohio'],['Grindcore','Agusta']]
labels = [1,0,0,0]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(features, labels)

但我想这样做:

from sklearn import tree
features = ['Hip Hop','Boston',['Run DMC','Kanye West']],['Metal', 'Cleveland',['Guns n roses','Poison']],['Gospel','Ohio',['Christmania','I Dream of Jesus']],['Grindcore','Agusta', ['Pig Destroyer', 'Carcas', 'Cannibal Corpse']]
labels = [1,0,0,0]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(features, labels)
clf.predict_proba(<blah blah>)

我试图根据一个人的位置、最喜欢的流派和他们喜欢的其他乐队来分配一个人喜欢乐队的概率。

【问题讨论】:

  • 这些是连续的还是分类的特征?在我看来,对于您想要的features ([1,2,[1,2,3]]) 中的第一个元素,您可以对[1,2,3] 部分进行一次热编码,基本上编码该行具有[1,2,3] 的属性,无论该特定级别的组合对应于...
  • 似乎每个观察都有一些单例属性(如12本身,但也有交互,如[6, 7, 3]...它会真的 i> 如果您可以定义(通过一个最小的示例)您希望完成的任务以及 features 中的每个数字对应的内容,这将很有帮助...
  • 顺便说一句,如果明确编程,您知道决策树将考虑变量/级别之间的交互,对吧?
  • @blacksite 我将问题更新为更具体一点。这是我第一次解决机器学习问题,如果你还不知道的话:)
  • 应使用Multi-labelBinarizer将单个特征单元格中的值列表转换为单热编码列。

标签: python machine-learning scikit-learn supervised-learning


【解决方案1】:

您有一个简单的解决方案:只需将每个波段转换为二进制特征(您可以使用 MultiLabelBinarizer 或类似的东西)。您的 X 矩阵在将其送入树之前将如下所示:

您可以使用以下代码创建这样的矩阵:

import pandas as pd
features = [['Hip Hop','Boston',['Run DMC','Kanye West']],
            ['Metal', 'Cleveland',['Guns n roses','Poison']],
            ['Gospel','Ohio',['Christmania','I Dream of Jesus']],
            ['Grindcore','Agusta', ['Pig Destroyer', 'Carcas', 'Cannibal Corpse']]]
df = pd.DataFrame([{**{f[0]:1, f[1]:1}, **{k:1 for k in f[2]}} for f in features]).fillna(0)

如果波段数较少,二进制编码就足够了。但如果波段太多,您可能需要降低维度。您可以通过以下步骤完成:

  1. 创建用户波段计数矩阵,如上所示
  2. (可选)对其进行标准化,例如使用 tf-idf
  3. 对其应用matrix decomposition 算法以从矩阵中提取“潜在特征”。
  4. 将潜在特征提供给您的决策树(或任何其他估算器)。

如果波段的数量很大,但您的观测值太少,那么即使矩阵分解也可能没有多大帮助。如果是这种情况,唯一的建议是使用更简单的功能,例如用相应的流派替换组。

【讨论】:

  • 感谢您的回复。这对我来说很有意义,我会试一试。还有一个问题:多少个频段才算太多?数十、数百或数千?
  • 这取决于您预测的频段频率和类别分布。如果没有这些信息,我会粗略估计“太多”为 min(10000, num_samples/10)
猜你喜欢
  • 2018-10-20
  • 2018-12-31
  • 1970-01-01
  • 2021-06-17
  • 2021-09-23
  • 2011-03-15
  • 2018-04-11
  • 1970-01-01
  • 2018-08-18
相关资源
最近更新 更多