【问题标题】:ABCMeta object argument after ** must be a mapping, not GridSearchCV** 后的 ABCMeta 对象参数必须是映射,而不是 GridSearchCV
【发布时间】:2016-05-02 05:17:34
【问题描述】:

我使用 GridSearchCV 开发了一个决策树。当我尝试使用 export graphviz 导出树时,我收到一个我不明白的错误。我根本不使用 ABCMeta 对象。

from sklearn import tree

pipeline = Pipeline([
    ('vect', tfidf_vectorizer),  
    ('clf', DecisionTreeClassifier()),  
])
grid_dt = GridSearchCV(
    pipeline,  
    param_grid=params_dt,  # parameters to tune
    # refit=True,  n_jobs=-1,  
    scoring='accuracy', cv=10
)

dt_fit = grid_dt.fit(X_train, y_train)

with open('dtvis.dot', 'w') as file:
    tree.export_graphviz(dt_fit , out_file = "dtvis.dot", feature_names=terms, class_names=True)
file.close()

import subprocess
subprocess.call(['dot', '-Tpdf', 'dtvis.dot', '-o' 'dtvis.pdf'])

追溯:

Traceback (most recent call last):
  File "../dt.py", line 241, in <module>
    dt_grid = DecisionTreeClassifier(**dt_fit)
TypeError: ABCMeta object argument after ** must be a mapping, not GridSearchCV

新的回溯:

Traceback (most recent call last):
  File ".../dt.py", line 245, in <module>
    export_graphviz(dt_fit, out_file = "dtvis.dot", feature_names=terms, class_names=True) 
  .../export.py", line 403, in export_graphviz
    recurse(decision_tree.tree_, 0, criterion=decision_tree.criterion)
AttributeError: 'GridSearchCV' object has no attribute 'tree_'

这可能是罪魁祸首(tree.export_graphviz):tree.export_graphviz() 与 export_graphviz() 吗?当它起作用时,clf 是 tree.DecisionTreeClassifier 和 tree.export_graphviz。我尝试在两行中使用和不使用这些前缀都没有成功。 任何建议或想法将不胜感激!

【问题讨论】:

  • 请显示完整的回溯。
  • @BrenBarn 好的,谢谢!
  • 您可以看到该错误发生在您到达代码的 graphviz 部分之前,因此 graphviz 与它无关。您打算该代码做什么? dt_fit 是一个拟合的分类器对象;你希望如何从中创建一个新的分类器?
  • 我正在尝试使用 GridSearchCV 将拟合的分类器对象传递给 graphviz,以便它输出树。以前,当我只运行一个没有 GridSearchCV 的简单分类器 tree.DecisionTreeClassifier() 时,我没有任何问题。我将更新我现在拥有的代码。
  • 您拟合的分类器对象是dt_fit。你为什么要创建 另一个 分类器对象?

标签: python scikit-learn graphviz decision-tree


【解决方案1】:

尝试在 dt_fit.best_estimator_ 上拨打您的 graphviz 电话:

tree.export_graphviz(dt_fit.best_estimator_ , out_file = "dtvis.dot", feature_names=terms, class_names=True)

dt_fit 是一个 GridSearchCV 对象,它可以包装任何类型的模型,而不仅仅是一棵树,因此它不能被绘制为一棵树。要将其绘制为一棵树,您需要获取 GridSearchCV 找到的“真实”底层模型,这是 best_estimator_ 给出的。

【讨论】:

  • 感谢您。我还必须添加 (best_estimator_.named_steps['clf']) 才能运行。没有它我得到一个错误:'AttributeError:'Pipeline'对象没有属性'tree_'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 2021-01-27
  • 2013-03-16
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多