2024.11.23
机器学习实验四
实验四:SMO算法实现与测试
一、实验目的
深入理解支持向量机(SVM)的算法原理,能够使用Python语言实现支持向量机的训 练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);
(2)使用训练集训练支持向量机—SMO分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的 部分。
三、算法步骤、代码、及结果
1. 算法伪代码
1. 加载数据集
- 使用 sklearn 的 datasets 加载鸢尾花数据集。
2. 数据划分
- 使用 train_test_split 将数据集划分为训练集和测试集,测试集占 1/3。
3. 训练支持向量机模型
- 初始化 SVM 模型,设置 C、kernel(选择径向基核函数 rbf)、gamma、random_state。
- 使用训练集训练 SVM 模型。
4. 五折交叉验证
- 使用 cross_validate 进行五折交叉验证,评估准确率、精度、召回率和 F1 值。
5. 测试集评估
- 使用测试集对训练好的 SVM 模型进行预测,计算准确率、精度、召回率、F1 值。
- 输出分类报告,显示每个类的精度、召回率、F1 值和支持数。
6. 输出结果
- 输出交叉验证结果的各项指标。
- 输出测试集的性能评估结果和分类报告。
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, classification_report
# Step 1: 加载数据集并划分数据
iris = datasets.load_iris()
X, y = iris.data, iris.target
# 划分数据集
X_train, X_test, y_train, y_test =
train_test_split(
X, y, test_size=1/3, random_state=42,
stratify=y
)
# Step 2: 训练支持向量机(SMO)
svm_model = SVC(
C=1.0, # 正则化参数,默认值为 1.0,较大时增加惩罚过拟合
kernel='rbf', #
核函数,默认为 'rbf'(径向基函数),适合非线性问题
gamma='scale', #
核系数,默认为 'scale',值为 1 / (n_features * X.var())
random_state=42 #
随机种子,确保结果可复现
)
svm_model.fit(X_train, y_train)
# Step 3: 五折交叉验证
scoring_metrics = ['accuracy',
'precision_macro', 'recall_macro', 'f1_macro']
cv_results = cross_validate(svm_model, X_train, y_train, cv=5,
scoring=scoring_metrics)
print("五折交叉验证结果:")
for metric in scoring_metrics:
print(f"{metric}:
{cv_results['test_' + metric].mean():.4f}")
# Step 4: 测试集评估
y_pred = svm_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
print("\n测试集性能:")
print(f"Accuracy: {accuracy:.4f}")
print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")
print(f"F1 Score: {f1:.4f}")
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
1. datasets.load_iris(): 加载鸢尾花数据集(包括数据和目标标签)。
2. train_test_split(): 将数据集随机划分为训练集和测试集,指定测试集比例为 1/3。
3. SVC(): 初始化支持向量机模型,设置 C、kernel 和 gamma 等参数。
4. cross_validate(): 进行交叉验证,计算并输出指定的评估指标(如准确率、精度、召回率和 F1 值)。
5. accuracy_score(), precision_score(), recall_score(), f1_score(): 分别计算模型的准确率、精度、召回率和 F1 值。
6. classification_report(): 输出每个类别的详细分类报告,包括精度、召回率和 F1 值等指标。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
- 准确率(Accuracy):在五折交叉验证和测试集上的准确率都非常高,均接近 98%,说明模型能够有效区分不同的类别。
- 精度(Precision):精度的表现也很好,特别是 Versicolor 类别,精度接近 1,说明大部分预测为该类的样本都是正确的。
- 召回率(Recall):召回率在所有类别上都接近 1,意味着模型能够有效地识别所有类别的样本。特别是在 Virginica 类别,召回率为 0.96,表现也相当不错。
- F1 值:F1 值是精度和召回率的综合评价,所有类别的 F1 值都非常接近 1,表示模型的分类能力相对均衡。
总体来看,SVM 模型在鸢尾花数据集上表现出了极好的性能,特别是在分类的精度和召回率方面,表明它具有较强的泛化能力。通过交叉验证和测试集评估的对比分析,可以确认该模型适用于此类多分类问题,并且在实际应用中可以提供可靠的分类性能。