使用DecisionTreeClassifier可视化决策树时遭遇NotFittedError问题求助
解决DecisionTreeClassifier出现NotFittedError的问题
问题分析
你遇到的sklearn.exceptions.NotFittedError错误,核心诱因如下:
- 代码中调用了
DT_model.print_tree()——DecisionTreeClassifier类不存在该方法,这会直接触发报错,中断后续代码执行,导致模型拟合后的可视化逻辑无法运行。 - 目标变量
Y以二维DataFrame格式传入,sklearn分类模型的目标变量通常要求为一维数组,格式不匹配可能导致模型拟合不彻底。 - 预测时输入的
data维度不符合要求,可能引发异常导致模型状态异常。 class_names参数传入的是列名而非实际类别标签,虽不直接引发拟合错误,但会影响可视化效果,也可能间接导致模型相关异常。
修正后的代码
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier, plot_tree import matplotlib.pyplot as plt # 读取数据集 datapisang = pd.read_csv('DataModusdiperbaiki.csv') X = datapisang[['ModusH']] # 将目标变量转为一维数组,适配sklearn分类模型要求 Y = datapisang['Index'].values.ravel() # 划分训练测试集,添加random_state保证结果可复现 X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=42) # 初始化并拟合模型 DT_model = DecisionTreeClassifier() DT_model.fit(X_train, Y_train) # 修正预测输入格式:确保为二维数组,与训练数据维度匹配 Modus_citra = # 替换为你的图像Modus实际数值 hasilprediksi = DT_model.predict([[Modus_citra]]) # 定义特征名和实际类别名(类别名需根据Index列的真实取值调整) fn = ['ModusH'] # 示例:若Index取值为0、1、2,对应标签改为你的业务场景名称 cn = ['正常', '轻度异常', '重度异常'] # 可视化决策树 fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(4,4), dpi=300) plot_tree(DT_model, feature_names=fn, class_names=cn, filled=True) fig.savefig('imagename.png') plt.show()
关键修正点说明
- 移除无效方法调用:直接删除
DT_model.print_tree(),该方法不属于DecisionTreeClassifier的API。 - 调整目标变量格式:用
values.ravel()将二维DataFrame转为一维数组,满足sklearn分类模型的输入规范。 - 修正预测输入维度:
predict()要求输入为二维数组,因此将[data]改为[[Modus_citra]],与训练数据的维度保持一致。 - 规范类别名称参数:传入实际的类别标签字符串列表,而非列名,让可视化结果更具可读性。
- 添加随机种子:在
train_test_split中加入random_state,保证数据划分结果可复现,便于调试。
内容的提问来源于stack exchange,提问作者Doni Fidomen
相关产品推荐
相关产品推荐

