24.12.09
实验四:SMO算法实现与测试
一、实验目的
深入理解支持向量机(SVM)的算法原理,能够使用Python语言实现支持向量机的训 练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);
(2)使用训练集训练支持向量机—SMO分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的 部分。
三、算法步骤、代码、及结果
1. 算法伪代码
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
2. 加载数据集并分割
- 加载 iris 数据集 (X, y)
- 使用 train_test_split 将数据集按 2:1 比例分为训练集 (X_train, y_train) 和测试集 (X_test, y_test),确保 stratify=y 保持标签分布一致
3. 定义支持向量机模型
- 使用 SVC 类,设置内核和其他参数(如 kernel='rbf',C=1.0,gamma='scale')
4. 训练模型
- 使用 X_train 和 y_train 拟合模型
5. 五折交叉验证
- 使用 cross_val_score 计算模型的以下性能指标:
- 准确度
- 精度
- 召回率
- F1 值
6. 测试集性能评估
- 在测试集 X_test 上预测 y_pred
- 计算并记录以下指标:
- 准确度 (accuracy_score)
- 精度 (precision_score)
- 召回率 (recall_score)
- F1 值
7. 分析五折交叉验证与测试集结果的差异
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
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
# 1. 加载数据集
iris = load_iris()
X = iris.data
y = 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. 定义支持向量机模型
model = SVC(
kernel='rbf', # 使用径向基函数核
C=1.0, # 正则化参数
gamma='scale', # 核系数,'scale' 为 1 / (n_features * X.var())
random_state=42 # 确保结果可复现
)
# 4. 训练模型
model.fit(X_train, y_train)
# 5. 五折交叉验证评估
accuracy_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
precision_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='precision_macro')
recall_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='recall_macro')
f1_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='f1_macro')
print(f"五折交叉验证结果:")
print(f"准确度:{accuracy_scores.mean():.4f}")
print(f"精度:{precision_scores.mean():.4f}")
print(f"召回率:{recall_scores.mean():.4f}")
print(f"F1值:{f1_scores.mean():.4f}")
# 6. 测试集评估
y_pred = model.predict(X_test)
test_accuracy = accuracy_score(y_test, y_pred)
test_precision = precision_score(y_test, y_pred, average='macro')
test_recall = recall_score(y_test, y_pred, average='macro')
test_f1 = f1_score(y_test, y_pred, average='macro')
print(f"测试集性能:")
print(f"准确度:{test_accuracy:.4f}")
print(f"精度:{test_precision:.4f}")
print(f"召回率:{test_recall:.4f}")
print(f"F1值:{test_f1:.4f}")
SVC 参数说明
1. C
• 作用:正则化参数,控制对误分类的惩罚力度,决定支持向量的数量。
• 取值:正浮点数(默认为 1.0)。
o 值越大,模型对误分类的惩罚越高,可能会减少训练误差但增大泛化误差,导致过拟合。
o 值越小,对误分类的惩罚越低,允许更多误分类,可能出现欠拟合。
2. kernel
• 作用:核函数,用于将数据映射到高维空间,支持非线性分类。
• 取值:字符串,选择不同的核函数类型(默认为 'rbf')。
o 'linear':线性核,适合线性可分的数据。
o 'poly':多项式核,适合较复杂的非线性分类。
o 'rbf':径向基函数核(高斯核),适合大部分非线性分类问题。
o 'sigmoid':S型核,有时用于神经网络。
3. degree
• 作用:指定多项式核的次数。
• 取值:正整数(默认为 3)。
o 仅在 kernel='poly' 时有效,控制多项式的次数。
4. gamma
• 作用:核函数的系数,控制决策边界的形状。
• 取值:
o 'scale':使用 1 / (n_features * X.var()) 作为默认值。
o 'auto':使用 1 / n_features 作为默认值。
o 浮点数:指定具体的 gamma 值,值越大,决策边界越复杂,可能导致过拟合。
• 默认值:'scale'。
5. coef0
• 作用:多项式核或 Sigmoid 核中的独立项。
• 取值:浮点数(默认为 0.0)。
o 仅在 kernel='poly' 或 kernel='sigmoid' 时有效,影响非线性映射。
6. shrinking
• 作用:是否使用启发式缩减技术加速计算。
• 取值:布尔值。
o True:使用启发式方法,加快收敛速度。
o False:不使用该方法。
• 默认值:True。
7. probability
• 作用:是否启用概率估计。
• 取值:布尔值。
o True:计算每个类的概率分数,但计算较慢。
o False:不计算概率。
• 默认值:False。
8. tol
• 作用:容差,用于控制模型收敛的精度。
• 取值:正浮点数(默认为 1e-3)。
o 值越小,精度越高,但训练时间增加。
9. class_weight
• 作用:指定类别的权重,适合处理类别不平衡问题。
• 取值:
o None:不调整类别权重。
o 'balanced':根据类别频率自动调整权重。
o 字典形式:指定每个类别的权重。
• 默认值:None。
10. verbose
• 作用:是否启用详细输出,帮助调试。
• 取值:布尔值。
o True:显示详细训练过程。
o False:不显示详细输出。
• 默认值:False。
11. max_iter
• 作用:控制算法的最大迭代次数。
• 取值:整数。
o -1:无最大迭代次数限制,直至收敛。
• 默认值:-1。
12. decision_function_shape
• 作用:设置决策函数的返回形状。
• 取值:
o 'ovr':一对多,返回 (n_samples, n_classes) 矩阵。
o 'ovo':一对一,适用于多类分类。
• 默认值:'ovr'。
13. break_ties
• 作用:在多类分类问题中是否打破平局。
• 取值:布尔值。
o True:打破平局,但耗费更多计算。
o False:不打破平局。
• 默认值:False。
14. random_state
• 作用:控制数据洗牌,以保证结果可复现。
• 取值:整数或 None。
o 如果指定整数,模型随机性可复现。
• 默认值:None。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
模型稳定性
五折交叉验证的指标和测试集的指标差异不大,最大差异不超过 1%,说明模型在不同数据集上的表现比较稳定,没有明显的过拟合或欠拟合。
训练集 vs. 测试集
准确度:五折交叉验证和测试集准确度分别为 0.9700 和 0.9600,说明模型在测试集上与训练集上预测结果接近,但略有下降。
精度:精度从 0.9738 降到 0.9649,表示在测试集中,模型对正类预测的正确性略有降低。
召回率:从 0.9698 下降到 0.9608,模型在测试集中能够捕捉到正类样本的比例也稍有下降。
F1值:从 0.9697 降到 0.9606,说明模型对精度和召回率的平衡性在测试集上依然维持得很好。
泛化能力
测试集性能接近交叉验证性能,表明模型在未见数据上表现良好,具备很强的泛化能力。这也反映了SVM模型在处理小型数据集(如
Iris 数据集)时的优势。
细微下降的原因
测试集性能指标略低于交叉验证结果,这可能与测试集样本的随机性有关。由于 SVM 模型会寻找最优的超平面来划分数据,这种下降属于正常现象,尤其在小样本情况下。