不使用类时,如何从logreg函数获取clf_hyper变量用于train函数?
解决函数间局部变量无法访问的NameError问题
看起来你遇到了Python函数间变量传递的典型问题——clf_hyper是logreg函数内部的局部变量,默认情况下外部的train函数根本看不到它,所以才会抛出NameError。不用类的话,最简单直接的解决方式就是让logreg函数把这个变量返回给调用它的地方,具体操作分两步:
1. 修改logreg函数,添加返回语句
在logreg函数的最后,把生成好的clf_hyper返回出去,这样函数执行完就会把这个最优模型实例传递给调用者:
from sklearn import model_selection def logreg(clf,xtrain, ytrain): # 定义参数网格,可以是字典或字典列表 param_grid = { "solver": ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'], "penalty": ['none', 'l1', 'l2', 'elasticnet'], "C": [100, 10] } # 初始化网格搜索 model = model_selection.GridSearchCV( estimator = clf, param_grid = param_grid, scoring = "accuracy", verbose = 10, n_jobs = 1 ) # 拟合模型并提取最优参数 model.fit(xtrain, ytrain) best_parameters = model.best_estimator_.get_params() for param_name in sorted(param_grid.keys()): print(f"\t{param_name}: {best_parameters[param_name]}") # 用最优估计器初始化模型 clf_hyper = model.best_estimator_ # 添加这一行,返回最优模型给调用者 return clf_hyper
2. 在train函数中接收返回值
在run函数里(也就是你说的train函数),调用logreg的时候,把返回的结果赋值给clf_hyper变量,这样后续就能正常使用它了:
# 替换原来注释掉的部分,调用logreg并接收返回的最优模型 clf_hyper = hyperparameter.logreg(clf, xtrain, ytrain) # 接下来就可以正常执行拟合和预测逻辑 clf_hyper.fit(xtrain, df_train.Rating) preds = clf_hyper.predict(xtest) # ... 后续计算准确率、保存模型的代码保持不变
补充说明
Python中,函数内部定义的变量属于局部作用域,只有函数内部能访问;如果要让外部获取,除了返回值,还可以用全局变量,但全局变量容易引发变量污染、逻辑混乱等问题,所以用返回值是最规范、最安全的方式,完全符合你“不使用类”的要求。
内容的提问来源于stack exchange,提问作者cahya faisal reza
相关产品推荐
相关产品推荐

