posts - 296,comments - 1,views - 2864

实验四:SMO算法实现与测试

一、实验目的

深入理解支持向量机(SVM)的算法原理,能够使用Python语言实现支持向量机的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

(1)从scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);

(2)使用训练集训练支持向量机—SMO分类算法;

(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;

(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的部分。

三、算法步骤、代码、及结果

  1. 算法伪代码
  2. 加载数据集
  3. 划分数据集
  4. 初始化支持向量机 (SVM) 分类器
  5. 定义评估指标
  6. 执行五折交叉验证
  7. 输出交叉验证的结果
  8. 使用训练集训练完整模型
  9. 在测试集上评估模型
  10. 算法主要代码

完整源代码\调用库方法(函数参数说明)

import numpy as np

from sklearn.model_selection import train_test_split, cross_validate

from sklearn.svm import SVC

from sklearn.datasets import load_iris

from sklearn.metrics import make_scorer, precision_score, recall_score, f1_score, accuracy_score

 

data = load_iris()

X = data.data

y = data.target

 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, stratify=y)

 

clf = SVC(kernel='linear')

 

scoring = {

    'accuracy': 'accuracy',

    'precision': make_scorer(precision_score, average='macro'),

    'recall': make_scorer(recall_score, average='macro'),

    'f1': make_scorer(f1_score, average='macro')

}

 

cv_results = cross_validate(clf, X_train, y_train, cv=5, scoring=scoring)

 

# 输出五折交叉验证的结果

print(f"\n交叉验证结果:")

print(f"准确率: {cv_results['test_accuracy'].mean():.4f}")

print(f"精度: {cv_results['test_precision'].mean():.4f}")

print(f"召回率: {cv_results['test_recall'].mean():.4f}")

print(f"F1值: {cv_results['test_f1'].mean():.4f}")

 

clf.fit(X_train, y_train)

 

y_pred_test = clf.predict(X_test)

accuracy_test = accuracy_score(y_test, y_pred_test)

precision_test = precision_score(y_test, y_pred_test, average='macro')

recall_test = recall_score(y_test, y_pred_test, average='macro')

f1_test = f1_score(y_test, y_pred_test, average='macro')

 

print(f"\n测试集测试结果")

print(f"准确率: {accuracy_test:.4f}")

print(f"精度: {precision_test:.4f}")

print(f"召回率: {recall_test:.4f}")

print(f"F1值: {f1_test:.4f}")

 

参数说明:

  1. train_test_split

作用:用于将数据集分割为训练集和测试集。

关键参数:

(1)X 和 y:输入特征和目标变量。无默认值,必须提供。

(2)test_size:测试集所占比例(float)或样本数量(int)。默认值:None(此时会根据 train_size 自动计算)。取值范围:0.0 到 1.0 或者正整数。

(3)train_size:训练集所占比例或样本数量。默认值:None(此时由 test_size 决定)。取值范围:0.0 到 1.0 或正整数。

(4)random_state:随机数种子,保证结果可重复。默认值:None(每次分割随机性不同)。

(5)stratify:是否按目标变量分布划分数据(y),保证训练集和测试集中类别比例一致。默认值:None(不考虑分布)。

  1. SVC

作用:支持向量机分类模型的实现。

关键参数:

(1)C:正则化参数,用于平衡训练错误与间隔大小。

默认值:1.0。取值范围:正数。较大的值倾向于减少训练误差,但可能过拟合。

(2)kernel:核函数,定义样本映射到高维空间的方式。默认值:'rbf'(径向基核函数)。

可选值:

'linear':线性核

'poly':多项式核

'rbf':高斯径向基核

'sigmoid':S 型核函数

(3)gamma:核函数系数,仅适用于 'rbf'、'poly' 和 'sigmoid' 核。默认值:'scale'(使用 1 / (n_features * X.var()))。取值范围:正数或 'auto'、'scale'。

(4)random_state:随机数种子,用于可重复性。默认值:None。

  1. cross_val_score

作用:对模型进行交叉验证,并返回评分。

关键参数:

(1)estimator:要评估的模型。无默认值,必须提供。

(2)X 和 y:输入特征和目标变量。无默认值,必须提供。

(3)cv:交叉验证的折数或分割方式。默认值:None(等价于 cv=5)。取值范围:整数(如 cv=5 表示五折交叉验证)。

(4)scoring:评分标准。默认值:None(使用模型默认评分方法,如 accuracy)。

可选值:

'accuracy':准确率

'precision_macro':宏平均精度

'recall_macro':宏平均召回率

'f1_macro':宏平均 F1 值

  1. classification_report

作用:计算分类模型的性能指标,并生成详细报告。

关键参数:

(1)y_true 和 y_pred:真值和预测值。无默认值,必须提供。

(2)target_names:类别名称。默认值:None(用类别索引)。

(3)digits:浮点数精度。默认值:2。

  1. StratifiedKFold

作用:分层 K 折交叉验证,保证每折中类别分布与整体一致。

关键参数:

(1)n_splits:折数。默认值:5。

(2)shuffle:是否在分割前随机打乱数据。默认值:False。

(3)random_state:随机数种子(当 shuffle=True 时生效)。默认值:None。

 

  1. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

四、实验结果分析

  1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
  2. 对比分析

从交叉验证和测试集的结果来看,模型的表现非常一致,说明支持向量机(SVM)在该数据集上的训练和测试阶段都能保持很好的分类能力。模型在准确率、精度、召回率和 F1 值上都表现优异,且训练集与测试集之间的差异非常小,证明了模型的良好泛化能力。在实际应用中,SVM 模型能够在不同的数据集上表现出稳定的效果,尤其是在面对类似 Iris 数据集这样的结构化数据时。



posted on   leapss  阅读(5)  评论(0编辑  收藏  举报

点击右上角即可分享
微信分享提示