完成机器学习实验四,以下为实验内容:
实验四:SMO 算法实现与测试
一、实验目的
深入理解支持向量机(SVM)的算法原理,能够使用 Python 语言实现支持向量机的训 练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);
(2)使用训练集训练支持向量机—SMO 分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的 部分。
三、算法步骤、代码、及结果
1. 算法伪代码
1. 导入必要的库
- 导入数据集加载库
- 导入数据划分库
- 导入支持向量机分类器库
- 导入分类报告生成库
- 导入精确度、召回率和F1分数计算库
- 导入NumPy库
2. 加载iris数据集
- 使用datasets.load_iris()函数加载iris数据集,获取特征集X和标签集y
3. 数据划分
- 使用train_test_split函数将特征集X和标签集y划分为训练集和测试集
- 设置测试集大小为1/3,随机种子为42
4. 初始化支持向量机分类器
- 创建SVC实例svm_model,设置核函数为'linear',惩罚参数C为1.0
5. 训练模型
- 使用训练集X_train和y_train训练svm_model模型
6. 交叉验证评估模型性能
- 使用cross_val_score函数对训练集进行5折交叉验证,并计算准确率
- 打印每一折的准确率分数和平均准确率
7. 测试训练集性能
- 使用训练好的模型svm_model对训练集X_train进行预测,得到预测结果y_train_pred
- 使用classification_report函数生成训练集的性能报告,并打印
8. 测试测试集性能
- 使用训练好的模型svm_model对测试集X_test进行预测,得到预测结果y_test_pred
- 使用classification_report函数生成测试集的性能报告,并打印
9. 计算并打印精确度、召回率和F1分数
- 使用precision_score函数计算训练集的精确度,并打印
- 使用recall_score函数计算训练集的召回率,并打印
- 使用f1_score函数计算训练集的F1分数,并打印
- 重复上述步骤计算并打印测试集的精确度、召回率和F1分数
10. 结束
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
# 导入必要的库
from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.svm import SVC
from sklearn.metrics import classification_report
from sklearn.metrics import precision_score, recall_score, f1_score
import numpy as np
# 加载 iris 数据集并留出测试集
iris = datasets.load_iris()
X, y = iris.data, iris.target
# 使用留出法留出 1/3 的样本作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42)
# 使用训练集训练支持向量机—SMO 分类算法
svm_model = SVC(kernel='linear', C=1.0)
svm_model.fit(X_train, y_train)
# 使用五折交叉验证对模型性能进行评估
scores = cross_val_score(svm_model, X_train, y_train, cv=5, scoring='accuracy')
print(f"训练准确率分数为每一折:{scores}")
print(f"平均训练准确率:{np.mean(scores)}")
# 使用训练集测试模型的性能
y_train_pred = svm_model.predict(X_train)
print("训练集结果:")
print(classification_report(y_train, y_train_pred, labels=np.unique(y_train), target_names=iris.target_names))
# 使用测试集测试模型的性能
y_test_pred = svm_model.predict(X_test)
print("\n测试集结果:")
print(classification_report(y_test, y_test_pred, labels=np.unique(y_test), target_names=iris.target_names))
# 计算并打印精确度、召回率和F1分数
print("\n精确度、召回率和F1分数:")
print(f"训练集:")
print(f"精确度(查准率): {precision_score(y_train, y_train_pred, average='weighted', labels=np.unique(y_train))}")
print(f"召回率(查全率): {recall_score(y_train, y_train_pred, average='weighted', labels=np.unique(y_train))}")
print(f"F1分数: {f1_score(y_train, y_train_pred, average='weighted', labels=np.unique(y_train))}")
print(f"\n测试集:")
print(f"精确度(查准率): {precision_score(y_test, y_test_pred, average='weighted', labels=np.unique(y_test))}")
print(f"召回率(查全率): {recall_score(y_test, y_test_pred, average='weighted', labels=np.unique(y_test))}")
print(f"F1分数: {f1_score(y_test, y_test_pred, average='weighted', labels=np.unique(y_test))}")
1. datasets.load_iris()
说明:加载鸢尾花(iris)数据集。
参数:无。
返回值:返回一个包含鸢尾花数据集的特征集(X)和标签集(y)的对象。
默认值:无参数。
2. train_test_split(X, y, test_size=1/3, random_state=42)
说明:将数据集X和y划分为训练集和测试集。
参数:
X:特征集。
y:标签集。
test_size:测试集的比例,默认为0.25(即25%)。
random_state:随机数生成器的种子,默认为None。设置相同的种子可以确保每次划分的结果相同。
返回值:返回训练集的特征集(X_train)、测试集的特征集(X_test)、训练集的标签集(y_train)和测试集的标签集(y_test)。
3. SVC(kernel='linear', C=1.0)
说明:创建支持向量机(SVM)分类器实例。
参数:
kernel:核函数,默认为'rbf'。其他选项包括'linear'、'poly'、'sigmoid'等。
C:惩罚参数C,控制误差项的强度,默认为1.0。较小的值表示更严格的限制。
返回值:返回一个SVC实例。
4. fit(X_train, y_train)
说明:训练模型。
参数:
X_train:训练集的特征集。
y_train:训练集的标签集。
返回值:返回训练好的模型。
5. cross_val_score(svm_model, X_train, y_train, cv=5, scoring='accuracy')
说明:进行交叉验证,并计算指定的评分指标。
参数:
svm_model:评估的模型。
X_train:训练集的特征集。
y_train:训练集的标签集。
cv:交叉验证的折数,默认为5。
scoring:评分指标,默认为‘accuracy’。其他选项包括‘precision’、‘recall’、‘f1’等。
返回值:返回一个数组,包含每次交叉验证的评分。
6. predict(X_train) 和 predict(X_test)
说明:对训练集和测试集进行预测。
参数:
X_train:训练集的特征集。
X_test:测试集的特征集。
返回值:返回预测的标签集。
7. classification_report(y_true, y_pred, labels=np.unique(y_train), target_names=iris.target_names)
说明:生成性能报告,包括精确度、召回率、F1分数等。
参数:
y_true:真实的标签集。
y_pred:预测的标签集。
labels:标签列表,如果为None,则使用y_true中的所有唯一标签,默认为None。
target_names:标签名称列表,用于报告中标签的显示。
返回值:返回一个字符串,包含性能报告。
8. precision_score(y_true, y_pred, average='weighted', labels=np.unique(y_train))
说明:计算精确度。
参数:
y_true:真实的标签集。
y_pred:预测的标签集。
average:计算平均值的方法,默认为'binary'。其他选项包括'micro'、'macro'、'weighted'、None等。
labels:标签列表,如果为None,则使用y_true中的所有唯一标签,默认为None。
返回值:返回精确度的值。
9. recall_score(y_true, y_pred, average='weighted', labels=np.unique(y_train))
说明:计算召回率。
参数:同precision_score。
返回值:返回召回率的值。
10. f1_score(y_true, y_pred, average='weighted', labels=np.unique(y_train))
说明:计算F1分数。
参数:同precision_score。
返回值:返回F1分数的值。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
训练集性能:
准确率:0.97(97%)
精确度(查准率):0.9703
召回率(查全率):0.97
F1分数:0.97
测试集性能:
准确率:1.00(100%)
精确度(查准率):1.0
召回率(查全率):1.0
F1分数:1.0
对比分析:
准确率对比:
训练集准确率为97%,而测试集准确率达到了100%。测试集的准确率略高于训练集,这表明模型在未见过的测试数据上表现非常好,甚至超过了在训练数据上的表现。
精确度对比:
训练集精确度为97.03%,测试集精确度为100%。测试集的精确度更高,表明模型在测试集上几乎没有做出错误的正类预测。
召回率对比:
训练集召回率为97%,测试集召回率为100%。测试集的召回率更高,表明模型在测试集上能够成功识别所有的正类样本。
F1分数对比:
训练集F1分数为97%,测试集F1分数为100%。测试集的F1分数更高,综合反映了测试集上精确度和召回率的优异表现。
总结:
模型在测试集上的表现非常出色,所有关键性能指标(准确率、精确度、召回率、F1分数)都达到了100%,这在实际应用中是非常罕见的,可能表明模型对iris数据集的分类非常准确。
训练集的性能略低于测试集,但差距不大,且训练集的性能已经非常高。这可能表明模型在训练数据上已经学到了足够的特征来准确分类测试数据。
由于测试集的性能指标均为100%,因此不存在过拟合的问题。模型在训练集和测试集上都显示出了很好的泛化能力。
标签:F1,score,训练,日报,12.24,train,测试,test From: https://www.cnblogs.com/lijianlongCode13/p/18671506