实验四:SMO 算法实现与测试
一、实验目的
深入理解支持向量机(SVM)的算法原理,能够使用 Python 语言实现支持向量机的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);
(2)使用训练集训练支持向量机—SMO 分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的部分。
三、算法步骤、代码、及结果
1. 算法伪代码
开始
# 导入必要的库
导入 sklearn.datasets 中的 load_iris
导入 sklearn.model_selection 中的 train_test_split 和 cross_val_score
导入 sklearn.svm 中的 SVC
导入 sklearn.metrics 中的 accuracy_score, precision_score, recall_score, f1_score 和 make_scorer
# 加载 iris 数据集
加载 iris 数据集
将特征赋值给 X
将标签赋值给 y
# 划分数据集,留出 1/3 的样本作为测试集
将数据集划分为训练集和测试集,测试集占 1/3,随机种子为 42,保持标签的比例
# 创建 SVM 分类器
创建一个线性核的 SVM 分类器
# 训练模型
使用训练集训练 SVM 分类器
# 定义评分指标
定义评分指标,包括准确度、加权精度、加权召回率和加权 F1 值
# 进行五折交叉验证
使用五折交叉验证评估模型的准确度
输出交叉验证的平均准确度
# 预测测试集
使用训练好的模型对测试集进行预测
# 计算性能指标
计算测试集的准确度
计算测试集的加权精度
计算测试集的加权召回率
计算测试集的加权 F1 值
# 输出结果
输出测试集的准确度
输出测试集的精度
输出测试集的召回率
输出测试集的 F1 值
结束
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
'''
Created on 2024年12月5日
@author: 席酒
'''
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, make_scorer
# 加载 iris 数据集
iris = load_iris()
X = iris.data # 特征
y = iris.target # 标签
# 留出法,留出 1/3 的样本作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)
# 创建 SVM 分类器
svm_classifier = SVC(kernel='linear', random_state=42)
# 训练模型
svm_classifier.fit(X_train, y_train)
# 定义评分指标
scoring = {
'accuracy': 'accuracy',
'precision': make_scorer(precision_score, average='weighted'),
'recall': make_scorer(recall_score, average='weighted'),
'f1': make_scorer(f1_score, average='weighted')
}
# 进行五折交叉验证
scores = cross_val_score(svm_classifier, X_train, y_train, cv=5, scoring='accuracy')
print("交叉验证准确度:", scores.mean())
# 预测测试集
y_pred = svm_classifier.predict(X_test)
# 计算性能指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='weighted')
recall = recall_score(y_test, y_pred, average='weighted')
f1 = f1_score(y_test, y_pred, average='weighted')
# 输出结果
print("测试集准确度:", accuracy)
print("测试集精度:", precision)
print("测试集召回率:", recall)
print("测试集 F1 值:", f1)
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
交叉验证的准确度为 0.97,表明在训练集上进行五折交叉验证时,模型在不同的子集上表现良好,平均准确度为 97%。这意味着模型在训练数据上具有很好的泛化能力。测试集的准确度为 1.0,表示模型在未见过的数据上表现完美,所有测试样本都被正确分类。这通常是一个积极的结果,但也可能表明模型可能存在过拟合的风险,尤其是在数据集较小的情况下。精度为 1.0,意味着所有被模型预测为正类的样本都是正确的。这表明模型在正类样本的预测上没有错误。
召回率为 1.0,表示模型能够识别出所有实际为正类的样本,没有漏掉任何一个。这是一个理想的结果,表明模型在捕捉正类样本方面非常有效。F1 值为 1.0,综合考虑了精度和召回率,表明模型在这两个指标上都表现得非常好。F1 值为 1.0 是完美的,意味着模型在正类样本的预测上没有任何错误。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统