支持向量机(SVM)
-
基本概念:
SVM(Support Vector Machine)是一种强大的监督学习算法 ,主要用于
分类任务和回归任务。- 分类任务:model = SVC()
- 回归任务:model = SVR()
-
核心思想【重点!】:间隔最大化
-
通俗理解 :在特征空间中找到一个最优超平面(理解为:分界线),将不同类别的数据点分开,并使两类中最近的样本点到超平面的距离尽可能大。
-
什么是间隔 :分类超平面(理解为:分界线)到两类数据中最近点的距离之和,代表分类的"安全距离"。
- 硬间隔:要求所有数据必须分对,容易过拟合(现实中基本不存在)。
- 软间隔 :允许一些数据点分错,通过
C参数来控制惩罚力度(C越大,越接近硬间隔;C越小,容错率越高)。
-
为什么要最大化 :间隔越大,模型对新数据的容错空间就越大,误分类风险越低,模型的泛化能力(在测试集上的表现)就越强。
-
如何实现:转化为凸优化问题,通过拉格朗日乘数法求解。
-
-
支持向量(概念理解):训练数据中里决策边界最近的那些数据点。
SVM只需靠这些关键点即可确定整个分类模型,其他远离边界的点对模型没有影响,因此称该算法为:支持向量机。
-
核函数(概念理解) :主要用于让 SVM 处理非线性问题 【线性核是特例,用于线性问题】。
深入理解:核函数让 SVM 隐式地在高维特征空间做线性分类,从而处理原始空间中的非线性问题。
-
工作原理:核技巧
指的是核函数不需要显式地将数据映射到高维空间,而是直接计算高维空间中的内积。
-
主要分类:
核函数 对应SVC参数 讲解 线性核 kernel='linear'适用于线性可分数据,计算速度快, 适合高维数据和大规模数据集 RBF核(高斯核) kernel='rbf'最常用的非线性核函数 多项式核 kernel='poly'适合处理具有多项式关系的数据 可以通过 degree参数控制多项式的阶数
-
-
SVM的模型参数:
对应的代码:model = SVC(C=...,kernel=...,gamma=...)
参数 作用 调参要点 C 惩罚系数,控制对误分类的容忍度 C 越大:误分类惩罚越重,间隔越窄,易过拟合;C 越小:容忍误分类,间隔越宽,易欠拟合 kernel 核函数,决定决策边界的形态 linear:线性;rbf:最常用非线性;poly:多项式。通常先选 kernelgamma RBF/多项式核系数,控制单样本影响范围 gamma 越大:影响范围小,边界复杂,易过拟合;gamma 越小:影响范围大,边界平滑,易欠拟合 默认为gamma='scale',一般不需要写该参数。 -
案例:手写数字识别
第一步:网格搜索 + 交叉验证(确定参数)
采用网格搜索调参 :利用
GridSearchCV系统搜索最佳参数组合。pythonfrom sklearn.datasets import load_digits from sklearn.model_selection import train_test_split from sklearn.model_selection import GridSearchCV from sklearn.svm import SVC from sklearn.pipeline import Pipeline # 准备数据 digits = load_digits() x = digits.data y = digits.target # 划分数据集和测试集 x_train,x_test,y_train,y_test = train_test_split( x,y,test_size=0.2,random_state=42 ) # 数据标准化【必需!!】 from sklearn.preprocessing import StandardScaler # 把标准化和SVM模型打包在一起(Pipe会将x_test和x_train自动标准化) # 使用pipe管道,放置数据泄露 pipe = Pipeline([ ('scaler', StandardScaler()), # 第一步:标准化 ('svc', SVC()) # 第二步:SVM分类器 ]) # 定义参数网格 param_grid = { 'svc__C': [0.1, 1, 10, 100], 'svc__kernel': ['linear', 'rbf', 'poly'], 'svc__gamma': [0.001, 0.01, 0.1, 1, 'auto'] } # 用 GridSearchCV 自动交叉验证找最佳参数 grid = GridSearchCV( estimator=pipe, param_grid=param_grid, cv=5, # 5折交叉验证 scoring='accuracy', # 分类用准确率 n_jobs=-1, # 并行 ) # 执行网格搜索 grid.fit(x_train,y_train) #输出最佳参数 print(f"最佳参数:{grid.best_params_}") print(f"最佳交叉验证得分:{grid.best_score_:.4f}") print(f"测试集准确率:{grid.score(x_test, y_test):.4f}") ------------------------------------------------------------------------------------ 最佳参数:{'svc__C': 100, 'svc__gamma': 0.01, 'svc__kernel': 'rbf'} 最佳交叉验证得分:0.9812 测试集准确率:0.9806 ------------------------------------------------------------------------------------第二步:模型构建与应用
pythonfrom sklearn.datasets import load_digits from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.metrics import accuracy_score # 准备数据 digits = load_digits() x = digits.data y = digits.target # 划分数据集和测试集 x_train,x_test,y_train,y_test = train_test_split( x,y,test_size=0.2,random_state=42 ) # 数据标准化【必需!!】 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() x_train_scaler = scaler.fit_transform(x_train) x_test_scaler = scaler.transform(x_test) # 模型 model = SVC( C=100, gamma=0.01, kernel = 'rbf' ) # 模型训练 model.fit(x_train_scaler,y_train) # 计算指标 y_pred = model.predict(x_test_scaler) accuracy = accuracy_score(y_test,y_pred) print(f"准确率:{accuracy:.4f}") --------------------------------------------------------------- 准确率:0.9806 --------------------------------------------------------------- -
SVM vs 其他算法
对比算法 SVM 的特点 其他算法特点 选择建议 SVM vs 逻辑回归 更适合高维数据,通过间隔最大化提高泛化能力 逻辑回归:训练速度快,输出概率值,模型可解释性强 特征数远大于样本数时选 SVM;需要概率输出时选逻辑回归 SVM vs 决策树 对噪声鲁棒(健壮、抗干扰能力强),不易过拟合,但难以解释 决策树:直观易懂,可以处理非线性关系,但容易过拟合 需要模型可解释性时选决策树;追求性能时选 SVM SVM vs 神经网络 小样本情况下表现好,无需大量调参 神经网络:可以自动学习特征,适合超大规模数据 小规模项目选 SVM;大规模复杂任务选神经网络