使用sklearn SVC调优时报TypeError: an integer is required错误如何解决?
问题原因分析
报错的核心是参数传值错误,你把需要传入整数的degree参数传入了字符串类型值:
- 你定义的
rng_ga = ['auto', 'scale']是gamma参数的候选值,但你在循环中将其赋值给了SVC的degree参数 degree是多项式核(poly)的专用参数,要求必须是正整数,传入字符串自然触发需要整数的类型错误- 额外逻辑问题:你定义的
rng_degree=np.arange(2,5)完全没有用到,参数对应关系完全混乱
修正方案
方案1:修改原生嵌套循环
调整参数对应关系,同时可以优化仅在kernel为poly时遍历degree,减少无效计算:
import numpy as np from sklearn.svm import SVC from sklearn.metrics import accuracy_score krn= ['linear', 'poly', 'rbf', 'sigmoid'] rng_C = np.arange(1,101,20) rng_degree=np.arange(2,5) # 仅poly核生效 rng_gamma= ['auto', 'scale'] # gamma参数候选 best_score=0 for i in krn: for j in rng_C: for k in rng_gamma: # 仅poly核需要遍历degree参数,其他核随便填默认值不生效 degree_list = rng_degree if i == 'poly' else [3] for deg in degree_list: SVModel=SVC(kernel=i, C=j, degree=deg, gamma=k) SVModel.fit(x_train, y_train) acc_score= accuracy_score(y_test, SVModel.predict(x_test)) if best_score<acc_score: best_score=acc_score bi=i bj=j b_deg=deg b_gamma=k print(best_score, bi, bj, b_deg, b_gamma)
方案2:使用sklearn自带的网格搜索工具(更简洁不易出错)
不需要手写嵌套循环,直接用GridSearchCV自动完成超参数遍历:
from sklearn.model_selection import GridSearchCV from sklearn.svm import SVC from sklearn.metrics import accuracy_score # 定义超参数搜索空间 param_grid = { 'kernel': ['linear', 'poly', 'rbf', 'sigmoid'], 'C': np.arange(1,101,20), 'degree': np.arange(2,5), 'gamma': ['auto', 'scale'] } svc = SVC() grid_search = GridSearchCV(svc, param_grid, scoring='accuracy', cv=5) grid_search.fit(x_train, y_train) # 输出最优结果 print("最优交叉验证准确率:", grid_search.best_score_) print("最优超参数组合:", grid_search.best_params_) # 直接用最优模型预测测试集 y_pred = grid_search.predict(x_test) print("测试集准确率:", accuracy_score(y_test, y_pred))
内容的提问来源于stack exchange,提问作者whomst
相关产品推荐
相关产品推荐

