绘制Random Forest时出现TypeError: unhashable type: 'slice'错误求助
解决随机森林绘图的TypeError和空白图问题
嘿,我来帮你搞定这个问题~ 首先看你的代码,有几个明显的小坑,咱们一步步来修复:
1. 先修正重复导入的问题
你代码里写了两次matplotlib导入:
import matplotlib as plt import matplotlib.pyplot as plt
第一次把matplotlib库本身命名成了plt,第二次又把pyplot子模块覆盖成plt,这会导致后续绘图的对象混乱,直接删掉第一行import matplotlib as plt就行,只保留import matplotlib.pyplot as plt。
2. 排查循环绘图的核心错误
你提到的TypeError: unhashable type: 'slice',大概率是在循环绘制单棵树的时候,错误地传入了切片对象而不是单个树模型。比如你可能写了类似forest.estimators_[i:]这种代码,而mglearn.plots.plot_tree()需要的是单个DecisionTreeClassifier对象(也就是随机森林里的某一棵子树)。
结合你2行3列的子图布局,正确的循环代码应该是这样的:
# 遍历所有子图和前6棵树(2*3=6) for i, (ax, tree) in enumerate(zip(axes.flat, forest.estimators_[:6])): # 绘制单棵树,传入对应的子图ax mglearn.plots.plot_tree(tree, ax=ax, fill=True) # 设置子图标题 ax.set_title(f"Random Forest Tree {i+1}") # 调整子图间距,避免标题重叠 plt.tight_layout() plt.show()
这段代码里:
forest.estimators_[:6]取前6棵树,刚好对应2行3列的子图zip(axes.flat, ...)把扁平化的子图对象和每棵树一一对应- 给每个子图传入单个树模型
tree,而不是切片,就不会触发unhashable的错误了
3. 为什么会出现空白图?
空白图的原因通常有两个:
- 要么是循环里根本没把图画到子图上(比如传错了ax参数)
- 要么是最后没调用
plt.show()来显示图形(你代码里没写这一步,记得加上)
按照上面的修改,你应该能正常看到6棵随机森林子树的可视化图,也不会再报slice的错误啦~
内容的提问来源于stack exchange,提问作者Mia
相关产品推荐
相关产品推荐

