前言:学习记录
一、简述
svm(支持向量机)是经典有监督分类算法,核心目标:寻找最优分隔超平面,最大化不同类别样本之间的几何间隔;依靠少数关键样本(支持向量)完成决策,泛化能力优秀,适合中小规模数据集。
线性可分数据:线性核直接划分;
线性不可分数据:通过核函数将数据映射至高维空间,实现非线性分割。 SVM 对特征数值尺度极度敏感,训练前必须做标准化处理
二、核心参数
class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='scale', coef0=0.0, random_state=1)
1.C惩罚因子(软间隔)
C 越大:对错分样本惩罚更强,追求训练集全部分类正确,易过拟合,泛化差;
C 越小:允许样本错分,容错噪声,泛化能力更强;
调优方式:搭配交叉验证选取最优值。
2.kernel 核函数(默认 rbf 高斯核)
linear:线性核,用于线性可分数据,速度快;
poly:多项式核,degree 参数控制多项式次数;
rbf:径向基高斯核,处理非线性数据,日常实验首选;
sigmoid:sigmoid 核,类似神经网络激活函数。
3.degree:仅 poly 多项式核生效,代表多项式次数,默认 3;使用 rbf/linear 时自动忽略。
4.gamma: rbf/poly/sigmoid 核系数
scale:新版默认,gamma=1/(特征数×数据方差);
gamma 越大:决策边界细碎,过拟合风险高;gamma 越小:边界平滑,降低过拟合。
**5.coef0:**多项式、sigmoid 核的偏置常数,一般默认 0 无需修改。
**6.probability:**是否输出类别预测概率,开启会大幅降低训练速度,实验默认关闭。
【训练后内置属性】
1.support_vectors_:所有支持向量样本;
2.n_support_:每一类对应的支持向量数量;
3.coef_:超平面权重 w(仅 linear 线性核可用);
4.intercept_:超平面偏置 b(仅 linear 线性核可用)。
三、代码
1、库导导入与绘图设置
导入 matplotlib 用于可视化,设置绘图后端规避画布报错,配置中文字体防止图表中文方框;导入鸢尾花数据集、数据集划分工具、交叉验证工具、SVC 模型、标准化器、分类评估指标。
2. 数据加载与划分
加载 sklearn 内置鸢尾花数据集,分离特征矩阵 X 与分类标签 y;通过train_test_split划分 80% 训练集、20% 独立测试集,random_state 固定随机种子保证实验可复现。
3. 特征标准化
SVM 依靠距离计算分类边界,不同特征数值量级差异会扭曲距离结果;使用 StandardScaler 对训练集拟合标准化规则,再同步转换测试集,避免测试集数据泄露。
4.SVC 模型实例化
参照 API 文档设置核心超参数:惩罚系数 C=1,高斯核 rbf,gamma 采用新版默认 scale,固定随机种子;次要参数全部使用默认值,不额外开启 probability 概率输出。
5.5 折交叉验证
使用cross_val_score在训练集上做 5 折交叉验证:将训练集均分 5 份,轮流 4 份训练、1 份验证,循环 5 次;输出每组准确率、平均准确率、标准差,消除单次数据划分带来的偶然性,客观衡量模型泛化能力。
6. 模型训练 fit ()(SVM 核心学习流程)
若选用 rbf 非线性核,自动将低维特征映射至高维特征空间;
遍历全部训练样本,筛选出距离分类超平面最近的样本(支持向量);
求解最优化方程,生成最大化类别间隔的分割超平面;
根据参数 C 控制软间隔,平衡训练集准确率与模型容错能力。
7. 预测与模型评估
调用 predict 对从未参与训练的测试集预测类别;score 计算整体准确率;classification_report 输出每一类的精确率、召回率、F1 分数,全方位评价分类效果。
8. 输出模型内置属性
打印每一类支持向量数量、支持向量样本;区分线性核与高斯核,线性核额外输出超平面权重 w 和偏置项 b,对应 API 文档属性说明。
python
# 绘图环境配置,解决画布、中文乱码问题
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report
# 1.加载鸢尾花数据集
iris = load_iris()
X = iris.data # 特征:花萼、花瓣长宽4个数值特征
y = iris.target # 真实分类标签(3种鸢尾花)
# 2.划分训练集80%、独立测试集20%
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=1
)
# 3.特征标准化(SVM必须步骤,消除量纲影响)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 4.实例化SVC模型,严格按照API核心参数配置
svc = SVC(
C=1.0,
kernel="rbf",
gamma="scale",
random_state=1
)
# 5.5折交叉验证(仅在训练集上执行,评估模型泛化性能)
cv_scores = cross_val_score(svc, X_train, y_train, cv=5, scoring="accuracy")
print("=====5折交叉验证结果=====")
print("每折准确率:", cv_scores)
print(f"交叉验证平均准确率:{cv_scores.mean():.4f}")
print(f"准确率标准差:{cv_scores.std():.4f}")
# 6.模型核心训练fit():SVM学习过程
# ①使用rbf核将低维特征映射到高维空间
# ②筛选距离分割平面最近的样本:支持向量
# ③求解最优间隔超平面,通过C控制对错分样本的惩罚力度
svc.fit(X_train, y_train)
# 7.测试集预测与评估
y_pred = svc.predict(X_test)
test_acc = svc.score(X_test, y_test)
print("\n=====独立测试集评估=====")
print(f"测试集整体准确率:{test_acc}")
print("=====分类详细报告=====")
print(classification_report(y_test, y_pred))
# 8.输出API文档规定的模型属性
print("\n=====SVM模型内置属性=====")
print("每类支持向量数量:", svc.n_support_)
print("支持向量样本数组形状:", svc.support_vectors_.shape)
# rbf核无coef_、intercept_,仅线性核可输出
if svc.kernel == "linear":
print("超平面权重w:", svc.coef_)
print("超平面偏置b:", svc.intercept_)

1.使用 RBF 高斯核 SVM 对鸢尾花数据集分类,5 折交叉验证平均准确率95.83%,独立测试集准确率96.67%,模型泛化能力强。
2.仅有少数样本预测错误,主要发生在类别 1、类别 2 之间,这两类鸢尾花特征本身比较接近,存在特征重叠。
3.模型一共选出 48 个支持向量,SVM 算法的决策边界完全由这些边界附近样本决定,体现支持向量机算法特点。
4.本次实验做了标准化处理,如果去掉标准化,SVM 分类效果会出现明显下降,证明 SVM 对特征量纲十分敏感。