【发布时间】:2016-09-02 20:49:01
【问题描述】:
我学习了两个sklearn.tree.tree.DecisionTreeClassifiers。两者都使用相同的训练数据进行训练。两者都使用不同的决策树最大深度。 decision_tree_model 的深度是 6,small_model 的深度是 2。除了max_depth,没有指定其他参数。
当我想获得训练数据的准确性时:
small_model_accuracy = small_model.score(training_data_sparse_matrix, training_data_labels)
decision_tree_model_accuracy = decision_tree_model.score(training_data_sparse_matrix, training_data_labels)
令人惊讶的输出是:
small_model accuracy: 0.61170212766
decision_tree_model accuracy: 0.422496238986
这怎么可能?当使用相同的训练数据学习时,具有更高最大深度的树不应该在训练数据上始终具有更高的准确度吗?可能是 score 函数,它输出 1 - accuracy 还是什么?
编辑:
- 我刚刚用更高的最大深度对其进行了测试。返回的值变得更低。这暗示它是
1 - accuracy或类似的东西。
编辑#2:
这似乎是我在处理训练数据时犯的一个错误。我又想了一遍,得出结论:“好吧,如果深度更高,树不应该是这个原因。还有什么?训练数据本身。但我使用相同的数据!也许我对中间的训练数据做了什么?”
然后我再次检查,我使用训练数据的方式有所不同。我需要将它从 SFrame 转换为 scipy 矩阵(可能也必须是稀疏的)。现在我在拟合两个模型后立即进行了另一个精度计算。这导致small_model 的准确率为 61%,decision_tree_model 的准确率为 64%。这仅增加了 3%,仍然有些令人惊讶,但至少这是可能的。
编辑#3:
问题已解决。我以错误的方式处理训练数据,导致拟合不同。
以下是修正错误后的准确度图:
这看起来是正确的,也可以解释为什么作业创建者选择 6 作为最大深度。
【问题讨论】:
-
您指定
max_depth有什么原因吗?如果您输入 None,算法将尝试根据需要扩展节点(粗略地说)。另外,您能否告知您可能设置的其他参数,例如min_samples_split和max_leaf_nodes,这可能很重要? -
@tuliocasagrande 这是有原因的。将这些模型的深度设置为 2 和 6 是在线课程作业的一部分。没有指定其他参数,我会将此信息添加到问题中。
-
由于您使用的是训练数据,较低的准确性也让我感到困惑。我唯一能说的是
score()只是对accuracy_score() 的旁路,并且输出不是您想象的1 - accuracy。在内部它只是做一个score = y_true == y_pred。 -
@tuliocasagrande 嗯,好的,谢谢你的信息,也许它会帮助我找到问题。
-
值得您花时间看看是否可以在其他 (perhaps smaller and publicly available) 数据集上重现此问题,以便您可以在这里分享一个最小的工作示例。
标签: scipy scikit-learn decision-tree