特征名称长度与特征数量不匹配报错及决策树可视化问题咨询
解决
ValueError: Length of feature_names, 177 does not match number of features, 6 这个报错的核心逻辑非常清晰:你给export_graphviz的feature_names参数传错了值,导致特征名的数量和模型训练时用的特征总数不匹配。
为什么会出现这个问题?
你当前代码里写的是feature_names=X,这里的X是你的整个特征数据集(看起来它有177行或者177个元素被误当成了特征名),但export_graphviz的feature_names参数需要的是对应每个特征的名称列表/数组,长度必须和模型的特征数(这里是6)完全一致。
快速解决步骤
根据你的X数据类型,分两种情况修改代码:
情况1:X是Pandas DataFrame
如果你的特征数据是用DataFrame存储的,直接用X.columns就能拿到正确的特征名列表(长度应该正好是6):
dt = rf.estimators_[0] dot_data = StringIO() # 替换feature_names=X为X.columns export_graphviz(dt, out_file=dot_data, feature_names=X.columns) (graph, ) = graph_from_dot_data(dot_data.getvalue()) Image(graph.create_png())
情况2:X是NumPy数组
如果X是numpy数组(没有自带列名),你需要手动定义一个包含6个元素的特征名列表:
dt = rf.estimators_[0] dot_data = StringIO() # 手动定义和特征数匹配的名称列表 feature_names = ["特征1", "特征2", "特征3", "特征4", "特征5", "特征6"] export_graphviz(dt, out_file=dot_data, feature_names=feature_names) (graph, ) = graph_from_dot_data(dot_data.getvalue()) Image(graph.create_png())
额外验证建议
为了避免类似问题,你可以先打印一下特征名列表的长度,确认和模型特征数一致:
# 如果是DataFrame print(len(X.columns)) # 如果是手动定义的列表 print(len(feature_names)) # 输出应该是6,和报错里的"number of features, 6"对应
另外要注意:如果你的随机森林是经过特征选择、降维等预处理后训练的,要确保特征名列表只包含实际被用来训练模型的那6个特征的名称,不要包含被剔除的特征。
内容的提问来源于stack exchange,提问作者Gesang Bekti Setyo Nugroho
相关产品推荐
相关产品推荐

