多层次的DecisionTreeClassifier

时间:2017-11-09 15:52:04

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

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

我可以这样做:

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>)

我正在尝试根据他们的位置,喜欢的流派以及他们喜欢的其他乐队来指定一个人享受乐队的概率。

1 个答案:

答案 0 :(得分:1)

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

binary matrix

您可以使用以下代码创建此类矩阵:

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算法以提取&#34;潜在功能&#34;来自矩阵。
  4. 将潜在功能提供给决策树(或任何其他估算工具)。
  5. 如果波段的数量很大,但观察的数量太少,即使矩阵分解也可能没什么用。如果是这种情况,唯一的建议是使用更简单的功能,例如用相应的类型替换组。