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

一、实验目的

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

二、实验内容

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

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

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

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

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

   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 make_scorer

 

# 加载 iris 数据集

加载 iris 数据集

将特征赋值给 X

将标签赋值给 y

 

# 划分数据集,留出 1/3 的样本作为测试集

将数据集划分为训练集和测试集,测试集占 1/3,随机种子为 42,保持标签的比例

 

# 创建 SVM 分类器

创建一个线性核的 SVM 分类器

 

# 训练模型

使用训练集训练 SVM 分类器

 

# 定义评分指标

定义评分指标,包括准确度、加权精度、加权召回率和加权 F1

 

# 进行五折交叉验证

使用五折交叉验证评估模型的准确度

输出交叉验证的平均准确度

 

# 预测测试集

使用训练好的模型对测试集进行预测

 

# 计算性能指标

计算测试集的准确度

计算测试集的加权精度

计算测试集的加权召回率

计算测试集的加权 F1

 

# 输出结果

输出测试集的准确度

输出测试集的精度

输出测试集的召回率

输出测试集的 F1

 

结束

   2. 算法主要代码

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

'''

Created on 2024125

 

@author: 席酒

'''

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, make_scorer

 

# 加载 iris 数据集

iris = load_iris()

X = iris.data # 特征

y = iris.target # 标签

 

# 留出法,留出 1/3 的样本作为测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)

 

# 创建 SVM 分类器

svm_classifier = SVC(kernel='linear', random_state=42)

 

# 训练模型

svm_classifier.fit(X_train, y_train)

 

# 定义评分指标

scoring = {

'accuracy': 'accuracy',

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

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

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

}

 

# 进行五折交叉验证

scores = cross_val_score(svm_classifier, X_train, y_train, cv=5, scoring='accuracy')

print("交叉验证准确度:", scores.mean())

 

# 预测测试集

y_pred = svm_classifier.predict(X_test)

 

# 计算性能指标

accuracy = accuracy_score(y_test, y_pred)

precision = precision_score(y_test, y_pred, average='weighted')

recall = recall_score(y_test, y_pred, average='weighted')

f1 = f1_score(y_test, y_pred, average='weighted')

 

# 输出结果

print("测试集准确度:", accuracy)

print("测试集精度:", precision)

print("测试集召回率:", recall)

print("测试集 F1 :", f1)

 

 

 

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

 

 

 

四、实验结果分析

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

 

 

 

2. 对比分析

交叉验证的准确度为 0.97,表明在训练集上进行五折交叉验证时,模型在不同的子集上表现良好,平均准确度为 97%。这意味着模型在训练数据上具有很好的泛化能力。测试集的准确度为 1.0,表示模型在未见过的数据上表现完美,所有测试样本都被正确分类。这通常是一个积极的结果,但也可能表明模型可能存在过拟合的风险,尤其是在数据集较小的情况下。精度为 1.0,意味着所有被模型预测为正类的样本都是正确的。这表明模型在正类样本的预测上没有错误。

 召回率为 1.0,表示模型能够识别出所有实际为正类的样本,没有漏掉任何一个。这是一个理想的结果,表明模型在捕捉正类样本方面非常有效。F1 值为 1.0,综合考虑了精度和召回率,表明模型在这两个指标上都表现得非常好。F1 值为 1.0 是完美的,意味着模型在正类样本的预测上没有任何错误。

posted @     阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示