一、实验目的
深入理解支持向量机(SVM)的算法原理,能够使用Python语言实现支持向量机的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);
(2)使用训练集训练支持向量机—SMO分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的部分。
三、算法步骤、代码、及结果
- 算法伪代码
- 加载数据集
- 划分数据集
- 初始化支持向量机 (SVM) 分类器
- 定义评估指标
- 执行五折交叉验证
- 输出交叉验证的结果
- 使用训练集训练完整模型
- 在测试集上评估模型
- 算法主要代码
完整源代码\调用库方法(函数参数说明)
import numpy as np
from sklearn.model_selection import train_test_split, cross_validate
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.metrics import make_scorer, precision_score, recall_score, f1_score, accuracy_score
data = load_iris()
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, stratify=y)
clf = SVC(kernel='linear')
scoring = {
'accuracy': 'accuracy',
'precision': make_scorer(precision_score, average='macro'),
'recall': make_scorer(recall_score, average='macro'),
'f1': make_scorer(f1_score, average='macro')
}
cv_results = cross_validate(clf, X_train, y_train, cv=5, scoring=scoring)
# 输出五折交叉验证的结果
print(f"\n交叉验证结果:")
print(f"准确率: {cv_results['test_accuracy'].mean():.4f}")
print(f"精度: {cv_results['test_precision'].mean():.4f}")
print(f"召回率: {cv_results['test_recall'].mean():.4f}")
print(f"F1值: {cv_results['test_f1'].mean():.4f}")
clf.fit(X_train, y_train)
y_pred_test = clf.predict(X_test)
accuracy_test = accuracy_score(y_test, y_pred_test)
precision_test = precision_score(y_test, y_pred_test, average='macro')
recall_test = recall_score(y_test, y_pred_test, average='macro')
f1_test = f1_score(y_test, y_pred_test, average='macro')
print(f"\n测试集测试结果")
print(f"准确率: {accuracy_test:.4f}")
print(f"精度: {precision_test:.4f}")
print(f"召回率: {recall_test:.4f}")
print(f"F1值: {f1_test:.4f}")
参数说明:
- train_test_split
作用:用于将数据集分割为训练集和测试集。
关键参数:
(1)X 和 y:输入特征和目标变量。无默认值,必须提供。
(2)test_size:测试集所占比例(float)或样本数量(int)。默认值:None(此时会根据 train_size 自动计算)。取值范围:0.0 到 1.0 或者正整数。
(3)train_size:训练集所占比例或样本数量。默认值:None(此时由 test_size 决定)。取值范围:0.0 到 1.0 或正整数。
(4)random_state:随机数种子,保证结果可重复。默认值:None(每次分割随机性不同)。
(5)stratify:是否按目标变量分布划分数据(y),保证训练集和测试集中类别比例一致。默认值:None(不考虑分布)。
- SVC
作用:支持向量机分类模型的实现。
关键参数:
(1)C:正则化参数,用于平衡训练错误与间隔大小。
默认值:1.0。取值范围:正数。较大的值倾向于减少训练误差,但可能过拟合。
(2)kernel:核函数,定义样本映射到高维空间的方式。默认值:'rbf'(径向基核函数)。
可选值:
'linear':线性核
'poly':多项式核
'rbf':高斯径向基核
'sigmoid':S 型核函数
(3)gamma:核函数系数,仅适用于 'rbf'、'poly' 和 'sigmoid' 核。默认值:'scale'(使用 1 / (n_features * X.var()))。取值范围:正数或 'auto'、'scale'。
(4)random_state:随机数种子,用于可重复性。默认值:None。
- cross_val_score
作用:对模型进行交叉验证,并返回评分。
关键参数:
(1)estimator:要评估的模型。无默认值,必须提供。
(2)X 和 y:输入特征和目标变量。无默认值,必须提供。
(3)cv:交叉验证的折数或分割方式。默认值:None(等价于 cv=5)。取值范围:整数(如 cv=5 表示五折交叉验证)。
(4)scoring:评分标准。默认值:None(使用模型默认评分方法,如 accuracy)。
可选值:
'accuracy':准确率
'precision_macro':宏平均精度
'recall_macro':宏平均召回率
'f1_macro':宏平均 F1 值
- classification_report
作用:计算分类模型的性能指标,并生成详细报告。
关键参数:
(1)y_true 和 y_pred:真值和预测值。无默认值,必须提供。
(2)target_names:类别名称。默认值:None(用类别索引)。
(3)digits:浮点数精度。默认值:2。
- StratifiedKFold
作用:分层 K 折交叉验证,保证每折中类别分布与整体一致。
关键参数:
(1)n_splits:折数。默认值:5。
(2)shuffle:是否在分割前随机打乱数据。默认值:False。
(3)random_state:随机数种子(当 shuffle=True 时生效)。默认值:None。
- 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
- 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
- 对比分析
从交叉验证和测试集的结果来看,模型的表现非常一致,说明支持向量机(SVM)在该数据集上的训练和测试阶段都能保持很好的分类能力。模型在准确率、精度、召回率和 F1 值上都表现优异,且训练集与测试集之间的差异非常小,证明了模型的良好泛化能力。在实际应用中,SVM 模型能够在不同的数据集上表现出稳定的效果,尤其是在面对类似 Iris 数据集这样的结构化数据时。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步