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

Python装饰器NameError问题:如何为机器学习算法计算AUC分数

问题修复与代码修改

错误原因分析

  • 装饰器AUC无法访问被装饰函数DT内部的局部变量predictions和y_test,触发NameError。
  • AccuracyScore类的__init__方法中self.self = self是无效错误代码。
  • DT方法重复传入已在类初始化时保存的数据集参数,冗余且易混淆。

修改后的完整代码

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import roc_auc_score

class AUC:
    def __init__(self, function):
        self.function = function

    def __call__(self, *args, **kwargs):
        # 接收被装饰函数返回的预测结果和测试集标签
        predictions, y_test = self.function(*args, **kwargs)
        print('-> AUC Score {}'.format(roc_auc_score(y_test, predictions)))
        return predictions, y_test  # 可选:返回结果供后续使用

class AccuracyScore:
    def __init__(self, X_train, y_train, X_test, y_test):
        self.X_train = X_train
        self.y_train = y_train
        self.X_test = X_test
        self.y_test = y_test
         
    @AUC
    def DT(self):
        clf_dt = DecisionTreeClassifier(max_depth=2, random_state=2023)
        clf_dt.fit(self.X_train, self.y_train)
        predictions = clf_dt.predict(self.X_test)
        accuracy = clf_dt.score(self.X_test, self.y_test)
        print('DT Accuracy:', accuracy)
        # 返回装饰器需要的预测结果和测试集标签
        return predictions, self.y_test

# 使用示例(需替换为你的实际数据集)
# acc = AccuracyScore(X_train, y_train, X_test, y_test)
# acc.DT()

关键修改点

  • 装饰器逻辑调整:让被装饰的DT方法返回predictions和y_test,装饰器通过函数返回值获取变量,解决作用域问题。
  • 类初始化修正:删除无效的self.self = self,正确存储数据集属性。
  • DT方法优化:不再重复传入数据集参数,直接调用实例的self.X_train等属性,代码更简洁。
  • 补充依赖导入:添加sklearn相关模块的导入,避免运行时找不到对应类和函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:32:40