You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树图像可视化报错'numpy.ndarray'无columns属性解决方法

报错原因

AttributeError: 'numpy.ndarray' object has no attribute 'columns'由以下代码问题导致:

  • 核心触发点:定义特征矩阵X时追加了.values,将pandas DataFrame对象转换为numpy ndarray数组,ndarray类型不存在columns属性,后续调用X.columns给export_graphviz传参时直接触发报错。
  • 隐藏语法错误:预测环节调用了未定义的变量forest_new,实际训练完成的模型变量名为forest,运行到该行会触发NameError。
  • 逻辑错误:tree.export_graphviz仅支持传入单棵决策树对象,无法直接接收随机森林实例(随机森林是多棵决策树的集成模型),即便解决前两个问题也无法正常生成可视化结果。
修复方案
  • 若要直接通过X.columns获取特征名,定义X、y时去掉.values,保留DataFrame/Series格式即可,sklearn训练接口完全兼容pandas数据结构。
  • 统一预测环节的变量名,使用已训练完成的forest模型调用predict方法。
  • 可视化时指定随机森林中的某一棵基决策树传入导出函数,例如选择第一棵树forest.estimators_[0]。
修复后完整可运行代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv("heart.csv")
# 移除.values,保留X为DataFrame格式,自带columns属性
X = df.iloc[:,0:12]
y = df.iloc[:, 13]

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

from sklearn.ensemble import RandomForestClassifier

forest = RandomForestClassifier(random_state=0, n_jobs=1, max_depth=5, n_estimators=100, oob_score=True)
forest.fit(X_train, y_train)

# 修正变量名错误
pred = forest.predict(X_test)


from IPython.display import Image
from six import StringIO
from sklearn import tree
import pydotplus

dot_data = StringIO()
# 传入单棵基决策树,不要直接传入整个随机森林对象
tree.export_graphviz(forest.estimators_[0], out_file=dot_data,
                    feature_names=X.columns,
                    filled=True, rounded=True) # 可选参数,让可视化节点带颜色更美观
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
Image(graph.create_png())

若坚持使用.values将特征转为numpy数组训练,只需提前单独提取特征名列表传入即可,无需保留X为DataFrame:将feature_names=X.columns替换为feature_names=df.iloc[:,0:12].columns就能解决属性报错。

内容的提问来源于stack exchange,提问作者tetea hauhnar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:24:15