12.4
实验四:SMO 算法实现与测试
一、实验目的
深入理解支持向量机(SVM)的算法原理,能够使用 Python 语言实现支持向量机的训
练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);
(2)使用训练集训练支持向量机—SMO 分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的部分。
三、算法步骤、代码、及结果
1. 算法伪代码
① 加载iris数据集
②留出1/3样本作为测试集
③创建SVM分类器,设置核函数为RBF
④训练SVM分类器
⑤使用五折交叉验证评估模型准确度
⑥打印准确度和分类报告
⑦使用测试集测试模型性能
⑧计算并打印准确度、精度、召回率和F1值
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.metrics import classification_report, accuracy_score, precision_score, recall_score, f1_score
# 加载iris数据集
iris = datasets.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)
# 创建SVM分类器,使用默认的RBF核
svm_classifier = SVC(kernel='rbf', gamma='scale')
# 训练SVM分类器
svm_classifier.fit(X_train, y_train)
# 使用五折交叉验证评估模型性能(准确度)
scores = cross_val_score(svm_classifier, X_train, y_train, cv=5, scoring='accuracy')
# 打印五折交叉验证的平均准确度
print("五折交叉验证准确度: ", scores.mean())
# 预测训练集结果
y_pred = svm_classifier.predict(X_train)
# 打印分类报告
print(classification_report(y_train, y_pred))
# 预测测试集结果
y_test_pred = svm_classifier.predict(X_test)
# 计算性能指标
accuracy = accuracy_score(y_test, y_test_pred)
precision = precision_score(y_test, y_test_pred, average='macro')
recall = recall_score(y_test, y_test_pred, average='macro')
f1 = f1_score(y_test, y_test_pred, average='macro')
# 打印性能指标
print(f"测试集准确度: {accuracy}")
print(f"测试集精度: {precision}")
print(f"测试集召回率: {recall}")
print(f"测试集F1值: {f1}")
函数参数说明
train_test_split(X, y, test_size=1/3, random_state=42):将数据集分割为训练集和测试集。
X:特征数据。
y:标签数据。
test_size:测试集的比例,默认为0.25。
random_state:随机数种子,确保结果可复现。
SVC(kernel='rbf', gamma='scale'):支持向量机分类器。
kernel:核函数类型,默认为'rbf',可选'linear'、'poly'、'rbf'、'sigmoid'。
gamma:核函数的系数,默认为'scale',也可以是具体的数值。
cross_val_score(estimator, X, y, cv=5, scoring='accuracy'):交叉验证。
estimator:估计器(模型)。
X:特征数据。
y:标签数据。
cv:交叉验证的折数,默认为5。
scoring:评分标准,默认为'accuracy'。
accuracy_score(y_true, y_pred):计算准确度。
y_true:真实标签。
y_pred:预测标签。
precision_score(y_true, y_pred, average='macro'):计算精度。
y_true:真实标签。
y_pred:预测标签。
average:计算方式,默认为'macro'。
recall_score(y_true, y_pred, average='macro'):计算召回率。
y_true:真实标签。
y_pred:预测标签。
average:计算方式,默认为'macro'。
f1_score(y_true, y_pred, average='macro'):计算F1值。
y_true:真实标签。
y_pred:预测标签。
average:计算方式,默认为'macro'。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
理论对比分析
1、SVM算法原理:
SVM是一种监督学习算法,用于分类和回归分析。
它的核心思想是找到一个超平面,使得不同类别之间的间隔最大化,以此提高分类的鲁棒性。
SVM通过核技巧能够处理非线性问题,将数据映射到高维空间进行线性分割。
2、SMO算法:
SMO(Sequential Minimal Optimization)算法是SVM中的一种优化算法,用于解决SVM的优化问题。
它通过序列最小化优化策略,将大的优化问题分解为一系列最小化二分类问题来解决。
SMO算法简单高效,特别适合处理大规模数据集。
实验对比分析
1、数据集:
实验使用了iris数据集,这是一个经典的多类分类问题。
iris数据集包含150个样本,每个样本有4个特征,属于3个类别之一。
2、模型训练:
实验中使用了留出法将数据集分为训练集和测试集,其中1/3作为测试集,2/3作为训练集。
使用训练集训练SVM模型,这是一种常见的模型评估方法,可以评估模型在未知数据上的表现。
3、模型评估:
实验中使用了五折交叉验证来评估模型的性能,这是一种评估模型泛化能力的方法。
通过交叉验证,可以减少模型评估结果的方差,提高评估的稳定性和可靠性。
4、性能指标:
实验中评估了模型的准确度、精度、召回率和F1值,这些是分类问题中常用的性能指标。
准确度表示模型预测正确的比例;精度表示预测为正类别中实际为正的比例;召回率表示实际为正类别中预测为正的比例;F1值是精度和召回率的调和平均数。
5、实验结果分析:
实验结果需要对测试集上的性能指标进行分析,以评估模型的实际表现。
分析可能包括比较不同参数设置下的性能,或者比较SVM与其他分类算法的性能。
实验总结
通过此次实验,可以深入理解SVM的工作原理和SMO算法的优化过程,并通过实际操作来掌握SVM模型的训练和评估。实验中使用的数据集、模型训练方法、评估方法和性能指标都是机器学习中常用的,通过对比分析这些内容,可以更好地理解SVM在实际问题中的应用和效果。此外,实验还提供了一个框架,用于比较SVM与其他机器学习算法的性能,从而帮助选择最适合特定问题的算法。