使用GridSearchCV对OneClassSVM做穷尽网格搜索时报TypeError如何解决?
问题原因
GridSearchCV在未指定评估指标时,会自动调用传入模型的score()方法计算交叉验证得分,以此筛选最优参数。
- 监督分类模型
SVC内置了分类准确率计算的score()方法,因此可以直接运行 OneClassSVM是无监督异常检测模型,scikit-learn官方实现中并未提供内置的score()方法,因此触发报错
解决方法
你只需要给GridSearchCV显式传入scoring参数,指定适合异常检测任务的评估指标即可,有两种常用实现方案:
方案1:使用scikit-learn内置评估指标
如果你的标签格式符合常规异常检测规范(正常样本标签为1,异常样本标签为-1),可以直接使用内置的roc_auc、f1等指标,修改后的代码如下:
from sklearn import svm from sklearn.model_selection import GridSearchCV param_grid={'nu':[0.0001,0.001,0.01,0.1,1],'gamma':[0.0001,0.001,0.01,0.1,1],'kernel':['rbf','poly','linear']} svc = svm.OneClassSVM() # 显式指定scoring参数为ROC-AUC,也可替换为其他符合需求的内置指标 model = GridSearchCV(svc, param_grid, scoring='roc_auc') model.fit(X_train, y_train)
方案2:自定义评估函数
如果内置指标不符合业务需求,可以用make_scorer封装自定义的得分计算逻辑,示例如下:
from sklearn.metrics import make_scorer import numpy as np # 自定义得分计算逻辑,可根据业务规则调整 def custom_anomaly_score(y_true, y_pred): # 示例:计算预测结果的准确率 return np.mean(y_true == y_pred) # 封装自定义指标,greater_is_better指定得分越高越好 scorer = make_scorer(custom_anomaly_score, greater_is_better=True) model = GridSearchCV(svc, param_grid, scoring=scorer) model.fit(X_train, y_train)
内容的提问来源于stack exchange,提问作者user3318590
相关产品推荐
相关产品推荐

