python - 多个级别的 DecisionTreeClassifier

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

我试图根据一个人的位置、最喜欢的流派以及他们喜欢的其他乐队来确定一个人喜欢某个乐队的概率。

最佳答案

您有一个简单的解决方案:只需将每个波段转换为二进制特征(您可以使用 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算法从矩阵中提取“潜在特征”。
  4. 将潜在特征提供给您的决策树(或任何其他估计器)。

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

关于python - 多个级别的 DecisionTreeClassifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47206168/

相关文章:

python - 将 2D 数组添加到 3D 数组

python - 根据条件分组和子集行

python - PyCharm 无法解析 PyGObject 3.0,但代码运行良好

python - 如何使用 python 从 G(n,p) 图创建邻接矩阵?

HTML 到 RST 转换器

machine-learning - 如何使用 MinMaxScaler 一次性标准化所有训练样本

Python - 在已经存在的演示文稿中编辑 Powerpoint 幻灯片内容

python - 机器学习中计算机决策的概率?

python - 如何使用分类器算法对单个文本进行分类

python - 如何在 python 中的管道中结合 LabelBinarizer 和 OneHotEncoder 来处理分类变量?