如何通过随机搜索优化SVM权重?含类别不平衡场景实践
处理类别不平衡场景下的SVM参数调优方案
针对你用sklearn.svm.SVC开展2/3/4类分类、存在严重类别不平衡(二类70%对30%),同时要结合RandomizedSearchCV调优gamma和C的需求,我整理了完整的实现思路和代码示例:
1. 正确启用class_weight解决类别不平衡
对于你的场景,最省心且有效的方式是设置class_weight='balanced':
- 二类任务中,sklearn会自动按照
n_samples/(n_classes*np.bincount(y))公式计算类别权重,给少数类更高的权重; - 多类任务(3/4类)同样适用,它会为每个类别分配与样本占比成反比的权重,自动适配不平衡情况。
如果你需要自定义权重(比如针对特定类别调整),也可以传入字典格式,比如二类场景class_weight={0:0.7, 1:1.5},但'balanced'是更通用的选择。
2. 整合class_weight到RandomizedSearchCV调参流程
你可以直接把class_weight加入SVC模型初始化,再配合RandomizedSearchCV完成参数搜索,完整代码示例如下:
from sklearn.svm import SVC from sklearn.model_selection import RandomizedSearchCV import numpy as np # 假设你的特征和标签数据为X、y X, y = ... # 初始化带类别权重的SVC模型 mdl = SVC(probability=True, random_state=1, class_weight='balanced') # 定义待搜索的参数分布:gamma和C用对数分布覆盖更广的取值范围 param_distributions = { 'C': np.logspace(-3, 3, 7), # 取值范围0.001到1000 'gamma': np.logspace(-4, 2, 7) # 取值范围0.0001到100 } # 配置RandomizedSearchCV random_search = RandomizedSearchCV( estimator=mdl, param_distributions=param_distributions, n_iter=50, # 迭代次数可根据计算资源调整,越多覆盖参数组合越全 cv=5, # 5折交叉验证保证结果稳定性 scoring='roc_auc', # 二类任务推荐用roc_auc;多类可换f1_weighted/recall_weighted random_state=1, n_jobs=-1 # 启用所有CPU核心加速调参 ) # 执行参数搜索 random_search.fit(X, y) # 查看最优结果 print("最优参数组合:", random_search.best_params_) print("最优交叉验证得分:", random_search.best_score_)
3. 额外注意要点
- 类别不平衡场景下不要仅用accuracy作为评估指标:二类任务优先选roc_auc、precision-recall曲线;多类任务选f1_weighted、recall_weighted,避免模型偏向多数类。
- 如果计算资源充足,可以调大
n_iter到100+,能更充分地搜索参数空间;cv折数建议至少5折,减少结果波动。
内容的提问来源于stack exchange,提问作者machinery
相关产品推荐
相关产品推荐

