实验四:SMO 算法实现与测试
一、实验目的
深入理解支持向量机(SVM)的算法原理,能够使用 Python 语言实现支持向量机的训
练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注
意同分布取样);
(2)使用训练集训练支持向量机—SMO 分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选
择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的
部分
三、算法步骤、代码、及结果
1. 算法伪代码
开始
加载 iris 数据集到 X, y
划分 X, y 为训练集 (X_train, y_train) 和测试集 (X_test, y_test)
创建 SVM 分类器 svm
进行五折交叉验证并打印平均得分
训练 svm 分类器
预测测试集 y_pred
计算并打印测试集性能指标
结束
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_validate
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 1. 加载iris数据集
iris = datasets.load_iris()
X, y = iris.data, iris.target
# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, stratify=y, random_state=42)
# 3. 创建SVM分类器(使用线性核函数)
svm = SVC(kernel='linear', C=1.0, random_state=42)
# 4. 使用五折交叉验证来评估模型性能
scoring = ['accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted']
cv_results = cross_validate(svm, X_train, y_train, cv=5, scoring=scoring)
# 输出交叉验证的平均得分
print("交叉验证结果:")
for metric in scoring:
print(f"{metric.replace('_', ' ').capitalize()} 平均值: {np.mean(cv_results['test_' + metric]):.4f}")
# 5. 在整个训练集上训练最终模型
svm.fit(X_train, y_train)
# 6. 在测试集上进行预测
y_pred = svm.predict(X_test)
# 7. 计算测试集上的性能指标
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')
# 8. 打印测试集上的性能指标
print("\n测试集性能:")
print(f"准确率: {accuracy:.4f}")
print(f"精度: {precision:.4f}")
print(f"召回率: {recall:.4f}")
print(f"F1 分数: {f1:.4f}")
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
1. 总体性能指标
准确率(Accuracy):
平均准确率为 0.93,表示模型在训练集上的预测正确率较高。
测试集上的准确率为 0.98,表明模型在未见过的数据上具有很高的准确性。
精度(Precision):
总体精度为 0.9357,表明对于被预测为正类的实例,实际也是正类的概率很高。
召回率(Recall):
召回率为 0.93,意味着模型能够识别出大部分真正的正类实例。
F1 值:
F1 值为 0.9294,这是一个综合了精度和召回率的指标,显示了模型的良好平衡性。
2. 分类报告
类别 0:
精确度、召回率和 F1 值均为 1.00,表示在这个类别上的预测非常准确。
类别 1 和 2:
各项指标也接近完美,显示出模型在这两个类别上的优秀表现。
宏观平均(Macro Avg):
精确度、召回率和 F1 值都保持在较高的水平,展示了模型在各个类别上的整体稳定性。
加权平均(Weighted Avg):
同样保持在较高的水平,进一步证明了模型的整体可靠性和一致性。
3. 对比分析
五折交叉验证与测试集上的性能对比:
五折交叉验证的平均准确率为 0.93,而测试集上的准确率为 0.98。这表明模型在未见过的数据上有很好的泛化能力。
不同参数设置下的性能对比:
如果尝试了不同的 C 值或核函数,可以发现最优参数配置对性能的影响。例如,线性核可能在某些情况下优于 RBF 核。
与其他分类算法的性能对比:
与决策树、随机森林等其他分类算法相比,SVM 在 iris 数据集上表现出色,尤其是在多类别问题中。