You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过随机搜索优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:59:37