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

保存pickle模型文件时报NameError: name 'forest' is not defined

问题背景

当前基于Random Forest(随机森林)算法开发前列腺癌检测模型,计划通过pickle.dump(forest,open("model.pkl","wb"))命令将训练完成的模型导出为pickle格式文件,运行时触发NameError,具体报错信息如下:

NameError                                 Traceback (most recent call last)
c:\Users\hp\newtest\pcancer.ipynb Cell 6' in <cell line: 1>()
----> 1 pickle.dump(forest,open("model.pkl","wb"))

NameError: name 'forest' is not defined
项目完整源码
import numpy as np
import pandas as pd
import warnings as wr
#Ignoring warnings
from sklearn.exceptions import UndefinedMetricWarning
wr.filterwarnings("ignore", category=UndefinedMetricWarning)
import pickle

df=pd.read_csv('Prostate_cancer_data.csv')
print(df.head(10))
print(df.shape)
print(df.isna().sum())


df=df.dropna(axis=1)#Drop the column with empty data
df=df.drop(['id'],axis=1)


#Encoding first column
from sklearn.preprocessing import LabelEncoder
labelencoder_X=LabelEncoder() 
df.iloc[:,0]=labelencoder_X.fit_transform(df.iloc[:,0].values)

#Splitting data for dependence
X=df.iloc[:,1:].values
Y=df.iloc[:,0].values

#Train-Test split
from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.25,random_state=1)
 

#Standard scaling
from sklearn.preprocessing import StandardScaler
sc=StandardScaler()
X_train=sc.fit_transform(X_train)
X_test=sc.fit_transform(X_test)



from sklearn.ensemble import RandomForestClassifier
def models(X_train,Y_train):

    #Random forest classifier
    forest=RandomForestClassifier(n_estimators=10,criterion='entropy',random_state=0)
    forest.fit(X_train,Y_train)

    print("Random Forest:",forest.score(X_train,Y_train))

    return forest

    print("Accuracy")
    model=models(X_train,Y_train)
错误原因

报错核心是两处代码逻辑错误:

  • forest是定义在models()函数内部的局部变量,仅在函数运行时的内部作用域有效,函数外部的全局代码无法直接访问这个变量
  • 调用models()函数执行训练的代码model=models(X_train,Y_train)被错误写在了models()函数内部、return forest语句的后面。函数执行到return语句就会直接退出,这行代码永远不会被执行,相当于根本没有实际运行模型训练逻辑,全局环境里既不存在名为forest的变量,也没有生成训练好的模型对象。
修复方案
  1. 调整代码缩进,把return forest后面的无效代码移到models()函数的外部,在全局作用域调用函数完成模型训练,用变量接收训练好的模型对象
  2. 执行pickle导出时,传入实际存储训练好模型的变量即可

修复后的对应代码片段如下:

from sklearn.ensemble import RandomForestClassifier
def models(X_train,Y_train):
    #Random forest classifier
    forest=RandomForestClassifier(n_estimators=10,criterion='entropy',random_state=0)
    forest.fit(X_train,Y_train)
    print("Random Forest:",forest.score(X_train,Y_train))
    return forest

# 移到函数外部,全局作用域调用训练
print("Accuracy")
model = models(X_train,Y_train)

# 导出模型,用with语句处理文件IO可自动关闭文件,避免句柄泄漏
with open("model.pkl","wb") as f:
    pickle.dump(model, f)

补充说明:如果偏好使用forest作为模型变量名,直接把赋值语句改成forest = models(X_train,Y_train)即可,不需要修改后续导出逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:57:27