如何在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
相关产品推荐
相关产品推荐

