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
相关产品推荐
相关产品推荐

