Python实现SVM网格搜索时出现NoneType对象不可迭代错误如何解决
错误原因
- 变量名不匹配:函数内部定义的标准差存储列表为
stds,但返回时错误写为未定义的stddevs,导致函数返回None,多变量解包时触发NoneType不可迭代的报错 - 参数遍历逻辑错误:直接遍历字典类型的
parameters只会获取到kernel、C这类参数字段名,没有遍历所有参数组合 - 调优逻辑完全未生效:硬编码了
kernel='rbf',没有传入遍历得到的参数,也没有用到传入的C参数值 - 未使用交叉验证:传入的
cv参数没有被调用,每次循环重新切分训练测试集的逻辑不符合交叉验证的要求 - 无结果存储逻辑:循环中没有向
means、stds、params列表中追加任何结果,返回的始终是空列表 - 缩进格式错误:Python要求函数体、循环体需要缩进,现有代码缩进不符合语法规范,会直接运行报错
修复方案
直接使用你已经导入的GridSearchCV实现网格搜索交叉验证,无需手动实现交叉验证逻辑,代码更规范不易出错:
修复后的函数代码
from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV def svm_grid_search(parameters, cv, X, y): means = [] stds = [] params = [] # 初始化SVM基础模型 svm = SVC(gamma='auto', probability=True) # 初始化网格搜索实例,评估指标采用AUC grid = GridSearchCV(estimator=svm, param_grid=parameters, cv=cv, scoring='roc_auc', n_jobs=-1) grid.fit(X, y.values.ravel()) # 提取所有参数组合的交叉验证结果 for mean, std, param in zip(grid.cv_results_['mean_test_score'], grid.cv_results_['std_test_score'], grid.cv_results_['params']): means.append(mean) stds.append(std) params.append(param) return means, stds, params
调用示例
parameters = {'kernel':['linear','poly','rbf'],'C':[0.2,0.5,1.0]} # 传入你的特征数据集X和标签y means, stddevs, params = svm_grid_search(parameters, 10, X, y) print('Mean AUC (+/- standard deviation), for parameters') for mean, std, param in zip(means, stddevs, params): print("%0.3f (+/- %0.03f) for %r" % (mean, std, param))
内容的提问来源于stack exchange,提问作者kelroy james
相关产品推荐
相关产品推荐

