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

不使用类时,如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:27:38