我目前正在绘制随机森林模型的基尼杂质分数,如下所示:
##### Calculating Gini Impurity across model features #####
feature_names = np.array(X_train.columns) # len = 191
gini_impu = rf.feature_importances_
std_gini = np.std([tree.feature_importances_ for tree in rf.estimators_],
axis = 0)
idx_gini = np.argsort(gini_impu)
# Plotting
fig, ax = plt.subplots(1, 1, figsize=(23, 25))
ax.barh(range(len(idx_gini)),
gini_impu[idx_gini],
yerr = std_gini[idx_gini],
color = "b",
align = "center")
ax.set_title("Random Forest Feature Importance (Gini)", fontsize = 20)
ax.set_xlabel("Gini Impurity", fontsize = 15)
ax.set_yticklabels(range(len(idx_gini)), feature_names[idx_gini])
ax.tick_params(labelsize=15)然而,我遇到了这样的错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-111-4691ce5fa1c9> in <module>
20 ax.set_title("Random Forest Feature Importance (Gini)", fontsize = 20)
21 ax.set_xlabel("Gini Impurity", fontsize = 15)
---> 22 ax.set_yticklabels(range(len(idx_gini)), feature_names[idx_gini])
...
...
ValueError: dictionary update sequence element #0 has length 14; 2 is required我检查了我想要绘制的每个变量的长度,它们是相同的。我不太清楚这个错误告诉了我什么。我试着看过同样错误的其他例子,但是它们太具体了。提前谢谢。
发布于 2021-08-18 14:28:21
根据matplotlib axis.set_yticklabels documentation,该方法采用参数labels、fontdict、minor。你要传递两个参数,首先是y标签的位置,其次是y标签本身。
根据前面提到的文件,它警告说:
此方法只应在使用Axes.set_yticks固定滴答位置后使用。否则,标签可能会以意想不到的位置结束。
因此,您似乎错误地组合了这两种方法的功能。
你应该做的是:
ax.set_yticks(range(len(idx_gini)))
ax.set_yticklabels(feature_names[idx_gini])https://stackoverflow.com/questions/68834194
复制相似问题