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 模型会寻找最优的超平面来划分数据,这种下降属于正常现象,尤其在小样本情况下。

 

posted on 2024-12-09 15:32  Daniel350  阅读(26)  评论(0)    收藏  举报