一、支持向量机简介
svm(支持向量机)以感知机为原型,但是它的能力要远远强于感知机,svm在回归,分类和异常检测上都有重要作用,并且可以通过kernel trick实现高维数据的非线性分类。sklearn里面提供了很多svm及其变种,本篇将详细介绍其中的分类器之一svc。
二、SVC变量详解
svc的变量如下所示,显示的皆为默认参数:
C:惩罚系数,用来平衡分类间隔margin和错分样本,默认参数为1.0
kernel:参数选择,有RBF, Linear, Poly, Sigmoid
degree:多项式核函数的阶数
gamma:核函数的系数(只对'Poly', 'RBF' 和 'Sigmoid'生效),如果未专门设置gamma,代表其值为样本特征数的倒数,即1/n_features.
coef0:核函数中的独立项,只对'RBF' and 'Poly'有效,表示其中的参数c
shrinking:是否采用启发式收缩方式,默认为True,用以加速代码运行速度
probablity: 是否启用概率估计。 这必须在调用fit()之前启用,并且会fit()方法速度变慢
tol: svm停止训练的误差精度。这个对泛化能力有影响,可以适当调大,但太大会导致欠拟合。
cache_size:指定训练所需要的内存,单位为MB
class_weight: 是否根据每个类所占据的权重,为不同的类设置不同的惩罚参数C
verbose :是否启用详细输出
max_iter: 最大迭代次数
decision_function_shape:‘ovo’ 一对一, ‘ovr’ 多对多 or None 无
当然,实际操作时上述很多参数均无需调整。依kernel不同产生影响的参数也不相同,影响最终结果的参数如下
核函数 | 需要调整的参数 |
---|---|
RBF | C,gamma,tol,class_weight |
poly | C,gamma,tol,degree,coef0,class_weight |
sigmoid | C, gamma,tol,coef0,class_weight |
三、参数优化示例
from sklearn.datasets import make_moons
from sklearn import svm
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import train_test_split
'''数据预处理'''
X,y = make_moons(n_samples=150, noise=0.15, random_state=42)
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)
# 初始化scores列表,用于存储不同参数组合的召回率平均值
scores = []
# 定义参数范围
c_param_range = [0.01, 0.1, 1, 10, 100]
gamma_param_range = [0.1, 0.5, 1, 5, 10]
# 外层循环遍历C参数
for c in c_param_range:
# 内层循环遍历gamma参数
for gamma in gamma_param_range:
# 创建SVC模型实例,使用当前的C和gamma参数
clf = svm.SVC(C=c, kernel='rbf', gamma=gamma)
# 使用交叉验证计算召回率
score = cross_val_score(clf, x_train, y_train, cv=10, scoring='recall')
# 计算召回率的平均值
score_mean = sum(score) / len(score)
# 将当前参数组合的召回率平均值添加到scores列表中
scores.append((score_mean, (c, gamma)))
# 打印当前参数组合和对应的召回率平均值
print(f"C={c}, gamma={gamma}, Mean Recall={score_mean}") # 找到最佳参数组合和对应的召回率
best_score = max(scores, key=lambda x: x[0])
print(f"最佳参数: C={best_score[1][0]}, gamma={best_score[1][1]}, Best Mean Recall={best_score[0]}")