24.11.6
实验四:SMO 算法实现与测试
一、实验目的
深入理解支持向量机(SVM)的算法原理,能够使用 Python 语言实现支持向量机的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);
(2)使用训练集训练支持向量机—SMO 分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的部分。
三、算法步骤、代码、及结果
- 算法伪代码
加载 Iris 数据集
使用 train_test_split 将数据划分为训练集和测试集,并保证类别分布一致
初始化支持向量机(SVM)分类器,设置核函数为 RBF,正则化参数 C = 1.0
使用训练集对 SVM 模型进行训练
定义评估指标:准确度、加权精度、加权召回率、加权 F1 分数
使用五折交叉验证评估模型的性能,并输出每个指标的得分和平均值
使用测试集对训练好的模型进行预测,并生成分类报告 - 算法主要代码
完整源代码\调用库方法(函数参数说明)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
加载 Iris 数据集
iris = load_iris()
X = iris.data
y = iris.target
留出 1/3 数据作为测试集(stratify 保证分布一致)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)
train_test_split主要参数:
sklearn.model_selection.train_test_split(*arrays, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None)
arrays:待划分的特征矩阵 X 和标签向量 y
test_size:测试集比例,默认为 None
取值范围:(0, 1) 表示比例;整数表示测试集样本数;若为 None,则自动计算
train_size:训练集比例,默认为 None。若 test_size 和 train_size 均为 None,则默认 test_size=0.25
random_state:随机种子,整型值使得结果可复现
shuffle:布尔值,是否在划分前打乱数据,默认为 True
stratify:按特定分布划分数据。通常为标签 y,保证训练集和测试集中类别分布一致
print(f"训练集样本数: {len(X_train)}, 测试集样本数: {len(X_test)}")
使用 SVM 训练模型
svm_classifier = SVC(kernel='rbf', C=1.0, random_state=42)
svm_classifier.fit(X_train, y_train)
SVC主要参数:
SVC(*, C=1.0, kernel='rbf', degree=3, gamma='scale', coef0=0.0, shrinking=True, probability=False, tol=1e-3, cache_size=200, ...)
C:正则化参数,用于平衡误差与分类超平面复杂度。默认值:1.0。
kernel:核函数类型。默认值:'rbf'(高斯核)。
其他值:'linear'(线性核),'poly'(多项式核),'sigmoid'。
degree:多项式核函数的次数,仅在 kernel='poly' 时有效。 默认值:3。
gamma:核函数系数,仅在 rbf、poly 和 sigmoid 核时有效。 默认值:'scale'。
random_state:整数值,用于控制随机数生成。默认值:None。
tol:停止准则,默认为 1e-3。
print("支持向量机模型已训练完成。")
五折交叉验证评估
scoring_metrics = ['accuracy', 'precision_weighted', 'recall_weighted', 'f1_weighted']
for metric in scoring_metrics:
scores = cross_val_score(svm_classifier, X_train, y_train, cv=5, scoring=metric)
print(f"{metric.capitalize()} 的五折交叉验证得分: {scores}")
print(f"{metric.capitalize()} 的平均值: {scores.mean():.4f}")
cross_validate主要参数:
sklearn.model_selection.cross_validate(estimator, X, y=None, *, scoring=None, cv=None, n_jobs=None, verbose=0, fit_params=None, return_train_score=False, return_estimator=False, error_score=nan)
estimator:用于训练的模型,如 LogisticRegression()
X:特征矩阵
y:标签向量
scoring:评估指标,默认为 None,即使用模型默认评分标准
可选单个指标(如 'accuracy')或列表(如 ['accuracy', 'precision_macro'])
cv:交叉验证折数,默认值 5
n_jobs:并行计算的线程数,默认为 None
-1 表示使用所有可用CPU
return_train_score:是否返回训练集分数,默认为 False
使用测试集进行预测
y_pred = svm_classifier.predict(X_test)
生成分类报告
report = classification_report(y_test, y_pred, target_names=iris.target_names)
print("测试集分类性能:\n", report)
classification_report主要参数:
sklearn.metrics.classification_report(y_true, y_pred, *, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False, zero_division='warn')
y_true:真实标签
y_pred:预测标签
target_names:类别标签的名称
digits:结果小数位数,默认为 2
output_dict:是否以字典形式返回,默认为 False
- 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、心得体会
通过本次实验,我深入理解了支持向量机(SVM)的算法原理,掌握了其在分类问题中的核心思想,包括超平面的构建、间隔最大化以及核函数的应用。在实践中,我使用Python实现了SVM的训练与测试,并结合五折交叉验证算法对模型进行了训练与评估。这次实验让我更加熟悉SVM在处理线性可分和非线性问题中的优势,同时加深了我对模型泛化能力和参数调优的理解。