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

如何在sklearn Pipeline中获取RBF SVC的支持向量数量与数值?

从Sklearn Pipeline中提取RBF SVC的支持向量信息

当然可以,训练完Pipeline后,你可以直接访问管道内的SVC组件,获取其支持向量相关属性:

1. 访问Pipeline中的SVC模型

训练完成后,通过named_steps属性定位到SVC组件:

svc_model = classifier_obj.named_steps['svc']

2. 获取支持向量数量

  • n_support_:返回每个类对应的支持向量数量数组,求和得到总支持向量数
# 每个类的支持向量数量
per_class_support_num = svc_model.n_support_
# 总支持向量数
total_support_num = sum(per_class_support_num)

3. 获取具体支持向量数值

support_vectors_属性返回所有支持向量的数组,形状为(总支持向量数, 降维后的特征数),这些向量是经过StandardScaler和TruncatedSVD处理后的特征空间向量:

support_vectors = svc_model.support_vectors_

4. 获取对偶系数(用于空间计算)

RBF SVC的dual_coef_属性存储了支持向量对应的系数,形状为(类别数-1, 总支持向量数),计算模型占用空间时需要包含这部分:

dual_coefficients = svc_model.dual_coef_

5. 计算模型占用空间并用于Optuna优化

可以结合数组的字节数和对象本身的内存占用计算总空间,将其作为Optuna的优化目标(比如最小化空间):

import sys

# 计算支持向量的总占用空间
sv_total_bytes = sys.getsizeof(support_vectors) + support_vectors.nbytes
# 计算对偶系数的总占用空间
coef_total_bytes = sys.getsizeof(dual_coefficients) + dual_coefficients.nbytes
# 模型相关总占用空间
total_model_space = sv_total_bytes + coef_total_bytes

# 在Optuna目标函数中使用该指标
def objective(trial):
    # 定义超参数搜索逻辑
    svc_c = trial.suggest_float("svc_c", 1e-3, 1e3, log=True)
    svc_gamma = trial.suggest_float("svc_gamma", 1e-4, 1e2, log=True)
    
    # 初始化并训练Pipeline
    classifier_obj = sklearn.pipeline.Pipeline([
        ('scaler', sklearn.preprocessing.StandardScaler()),
        ('dim_reduction', TruncatedSVD(n_components=dim_reduction_n_comp, random_state=611)),
        ('svc', sklearn.svm.SVC(C=svc_c, gamma=svc_gamma, probability=True))
    ])
    classifier_obj.fit(X_train, y_train)
    
    # 计算空间
    svc_model = classifier_obj.named_steps['svc']
    sv_total_bytes = sys.getsizeof(svc_model.support_vectors_) + svc_model.support_vectors_.nbytes
    coef_total_bytes = sys.getsizeof(svc_model.dual_coef_) + svc_model.dual_coef_.nbytes
    total_space = sv_total_bytes + coef_total_bytes
    
    # 可返回分类精度和空间做双目标优化,或仅返回空间做单目标优化
    accuracy = classifier_obj.score(X_val, y_val)
    return accuracy, total_space

注意事项

  • 支持向量是经过管道中预处理和降维后的特征,若需要映射回原始输入特征,需要依次调用dim_reduction.inverse_transform()和scaler.inverse_transform(),但计算模型占用空间时无需这一步——模型本身存储的就是降维后的向量。
  • sys.getsizeof()返回对象本身的内存开销,nbytes是数组元素的总字节数,两者结合能更准确计算实际占用空间。

内容的提问来源于stack exchange,提问作者Shahnawaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:15:41