使用GridSearchCV调参时遇AttributeError:Model_selection无classes_属性
问题解决:AttributeError: 'Model_selection' object has no attribute 'classes_'
错误原因
你的Model_selection包装类没有暴露内部estimator的classes_属性,而roc_auc_score通过make_scorer使用时,会尝试访问模型的classes_来确定分类的类别顺序,因此触发了这个属性不存在的错误。
解决方案
需要让Model_selection类代理内部estimator的classes_属性,有两种可行方式:
方式1:在fit方法中同步内部模型的classes_属性
修改后的Model_selection类代码:
class Model_selection(BaseEstimator): def __init__(self, estimator = RandomForestClassifier()): self.estimator = estimator def fit(self, X, y=None, **kwargs): self.estimator.fit(X, y) self.classes_ = self.estimator.classes_ # 新增此行,同步classes_属性 return self def predict(self, X, y=None): return self.estimator.predict(X) def predict_proba(self, X): return self.estimator.predict_proba(X) def score(self, X, y): return self.estimator.score(X, y)
方式2:使用@property装饰器动态返回内部模型的classes_
修改后的Model_selection类代码:
class Model_selection(BaseEstimator): def __init__(self, estimator = RandomForestClassifier()): self.estimator = estimator def fit(self, X, y=None, **kwargs): self.estimator.fit(X, y) return self def predict(self, X, y=None): return self.estimator.predict(X) def predict_proba(self, X): return self.estimator.predict_proba(X) def score(self, X, y): return self.estimator.score(X, y) @property def classes_(self): return self.estimator.classes_
说明
两种方式都能让GridSearchCV的roc_auc评分器正确获取到类别信息,完成超参数优化计算。第一种是在fit后直接缓存属性,第二种是每次访问时动态从内部模型获取,按需选择即可。
内容的提问来源于stack exchange,提问作者Dushi Fdz
相关产品推荐
相关产品推荐

