11/1
实验四:SMO 算法实现与测试
一、实验目的
深入理解支持向量机(SVM)的算法原理,能够使用 Python 语言实现支持向量机的训 练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);
(2)使用训练集训练支持向量机—SMO 分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的 部分
三、算法步骤、代码、及结果
1. 算法伪代码
1. 加载iris数据集
2. 将数据集分为特征集X和目标集y
3. 使用留出法将数据集分为训练集和测试集,测试集占1/3
4. 初始化SVM分类器,设置核函数为线性,惩罚参数C为1.0,随机种子为42
5. 使用训练集训练SVM分类器
6. 使用五折交叉验证评估模型的准确度
7. 重新训练SVM分类器
8. 预测训练集结果,计算准确度、精度、召回率和F1值
9. 打印训练集的性能指标
10. 使用测试集测试模型性能,预测测试集结果
11. 计算测试集的准确度、精度、召回率和F1值
12. 打印测试集的性能指标
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score, precision_score, recall_score,
f1_score
# 加载iris数据集
iris = 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)
# 初始化SVM分类器,使用SMO算法
svm_clf = SVC(kernel='linear', C=1.0, random_state=42)
# 训练模型
svm_clf.fit(X_train, y_train)
# 使用五折交叉验证评估模型
scores = cross_val_score(svm_clf, X_train, y_train, cv=5, scoring='accuracy')
# 训练最终模型
svm_clf.fit(X_train, y_train)
# 计算性能指标
y_pred = svm_clf.predict(X_train)
accuracy = accuracy_score(y_train, y_pred)
precision = precision_score(y_train, y_pred, average='macro')
recall = recall_score(y_train, y_pred, average='macro')
f1 = f1_score(y_train, y_pred, average='macro')
print(f"Accuracy: {accuracy:.2f}")
print(f"Precision: {precision:.2f}")
print(f"Recall: {recall:.2f}")
print(f"F1 Score: {f1:.2f}")
# 使用测试集测试模型性能
y_pred_test = svm_clf.predict(X_test)
test_accuracy = accuracy_score(y_test, y_pred_test)
test_precision = precision_score(y_test, y_pred_test, average='macro')
test_recall = recall_score(y_test, y_pred_test, average='macro')
test_f1 = f1_score(y_test, y_pred_test, average='macro')
print(f"Test Accuracy: {test_accuracy:.2f}")
print(f"Test Precision: {test_precision:.2f}")
print(f"Test Recall: {test_recall:.2f}")
print(f"Test F1 Score: {test_f1:.2f}")
参数说明:
1.SVC(kernel='rbf', C=1.0, random_state=None)
- 功能:初始化支持向量机分类器。
- 参数:
- o kernel:核函数类型,可以是'linear', 'poly', 'rbf', 'sigmoid'等,默认为'rbf'。
- o C:正则化参数,较大的值会尝试正确分类所有训练样本,可能导致过拟合,默认为1.0。
- o random_state:随机数种子,用于初始化内核中心点,默认为None。
- 返回值:返回SVC对象。
2. cross_val_score(estimator, X, y, cv=5, scoring=None)
- 功能:使用交叉验证评估模型性能。
- 参数:
- o estimator:估计器(模型)。
- o X:特征数据。
- o y:目标值。
- o cv:交叉验证的折数,默认为5。
- o scoring:评分方法,默认为None,需要指定评分方法,如'accuracy'。
- 返回值:返回一个数组,包含每次交叉验证的分数。
3. accuracy_score(y_true, y_pred)
- 功能:计算准确度。
- 参数:
- o y_true:真实目标值。
- o y_pred:预测目标值。
- 返回值:返回准确度分数。
4. precision_score(y_true, y_pred, average='binary')
- 功能:计算精度。
- 参数:
- o y_true:真实目标值。
- o y_pred:预测目标值。
- o average:计算多个类别的平均方式,可以是'binary', 'micro', 'macro', 'weighted'等,默认为'binary'。
- 返回值:返回精度分数。
5. recall_score(y_true, y_pred, average='binary')
- 功能:计算召回率。
- 参数:
- o y_true:真实目标值。
- o y_pred:预测目标值。
- o average:计算多个类别的平均方式,默认为'binary'。
- 返回值:返回召回率分数。
6. f1_score(y_true, y_pred, average='binary')
- 功能:计算F1值。
- 参数:
- o y_true:真实目标值。
- o y_pred:预测目标值。
- o average:计算多个类别的平均方式,默认为'binary'。
- 返回值:返回F1值分数。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
Test Accuracy: 1.00
Test Precision: 1.00
Test Recall: 1.00
Test F1 Score: 1.00
2. 对比分析
测试集的分数与训练集的分数非常接近,表明模型在不同的数据集上都能保持稳定的表现。五折交叉验证的准确度为0.97,而测试集的准确度达到了1.0。这表明模型在测试集上的表现优于交叉验证的平均表现。

浙公网安备 33010602011771号