树图像可视化报错'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
相关产品推荐
相关产品推荐

