11.7

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

一、实验目的

 

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

 

二、实验内容

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

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

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

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

 

 

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

   1. 算法伪代码

1. 导入必要的库(如 pandasnumpysklearn)  

2. 加载 Iris 数据集  

3. 随机打乱数据  

4. 将数据集分为训练集(2/3)和测试集(1/3)  

   a. X_train, y_train = 训练集特征, 训练集标签  

   b. X_test, y_test = 测试集特征, 测试集标签  

5. 初始化支持向量机分类器  

   a. model = SVC(kernel='linear')  # 选择线性核  

6. 训练模型  

   a. model.fit(X_train, y_train)  

7. 使用五折交叉验证评估模型  

   a. scores = cross_val_score(model, X_train, y_train, cv=5)  

   b. 计算并输出平均准确度、精度、召回率和 F1 值  

8. 在测试集上评估模型性能  

   a. y_pred = model.predict(X_test)  

   b. 计算测试集的准确度、精度、召回率和 F1 值  

9. 输出测试结果并进行分析

 

   2. 算法主要代码

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

import numpy as np
from sklearn import datasets
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, classification_report
from sklearn.preprocessing import StandardScaler

# 1. 加载 iris 数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 2. 划分数据集,留出 1/3 的样本作为测试集(确保数据分布一致)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y)

# 3. 特征缩放
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 4. 使用 SVM 训练模型
svm_model = SVC(kernel='rbf')  # 这里使用 RBF
svm_model.fit(X_train_scaled, y_train)

# 5. 五折交叉验证评估模型性能
accuracy = cross_val_score(svm_model, X_train_scaled, y_train, cv=5, scoring='accuracy')
precision = cross_val_score(svm_model, X_train_scaled, y_train, cv=5, scoring='precision_weighted')
recall = cross_val_score(svm_model, X_train_scaled, y_train, cv=5, scoring='recall_weighted')
f1 = cross_val_score(svm_model, X_train_scaled, y_train, cv=5, scoring='f1_weighted')

# 打印评估结果
print(f"Cross-Validation Accuracy: {np.mean(accuracy):.2f} ± {np.std(accuracy):.2f}")
print(f"Cross-Validation Precision: {np.mean(precision):.2f} ± {np.std(precision):.2f}")
print(f"Cross-Validation Recall: {np.mean(recall):.2f} ± {np.std(recall):.2f}")
print(f"Cross-Validation F1 Score: {np.mean(f1):.2f} ± {np.std(f1):.2f}")

# 6. 使用测试集测试模型性能
y_pred = svm_model.predict(X_test_scaled)

# 计算测试集准确度
test_accuracy = accuracy_score(y_test, y_pred)

# 生成分类报告
class_report = classification_report(y_test, y_pred)

# 打印测试结果
print(f"Test Accuracy: {test_accuracy:.2f}")
print("Classification Report:\n", class_report)

 

调用库方法

 

1. load_iris

加载 Iris 数据集。

from sklearn.datasets import load_iris  

 

参数:

return_X_y: 如果为 True,返回特征和目标。如果为 False,返回一个包含数据的对象(默认值为 False

返回值:

返回一个包含特征和目标的对象,通常通过 iris.data iris.target 获取。

 

2. train_test_split

将数据随机划分为训练集和测试集。

from sklearn.model_selection import train_test_split  

 

参数:

test_size: 测试集占比(0-1之间的小数,或具体数目)。

random_state: 随机种子(确保划分可重现)。

stratify: 按类别比例划分(确保训练集和测试集类别分布一致)。

 

返回值:

返回划分后的训练数据和测试数据。

 

3. fit

用法: clf.fit(X_train, y_train)

作用: 训练模型。

 

4. cross_val_score

 

用法: cross_val_score(estimator, X, y, cv, scoring)

 

参数:

estimator: 需要评估的模型。

X: 特征数据。

y: 类别标签。

cv: 交叉验证的折数。

scoring: 评估指标(如准确率、精确率)。

 

5. SVC

支持向量机分类器。

from sklearn.svm import SVC

 

参数:

C: 正则化参数,默认为 1.0。较小的值将小心拟合,较大的值会促进对训练集的更好拟合。

kernel: 核函数类型,支持 'linear', 'poly', 'rbf', 'sigmoid' 等。默认为 'rbf'

degree: 多项式核函数的度数(只影响 poly 核)。默认为 3

gamma: 核系数,默认为 'scale'

max_iter: 最大迭代次数,默认为 -1(不限制)。

 

返回值:

返回一个 SVC 对象,用于拟合训练数据及进行预测。

 

6. accuracy_score

计算模型在给定数据上的准确度。

from sklearn.metrics import accuracy_score  

 

参数:

y_true: 真实标签。

y_pred: 预测标签。

 

返回值:

返回预测准确率(在 0 1 之间的小数)。

 

7. classification_report

生成分类绩效的详细报告。

from sklearn.metrics import classification_report  

 

参数:

y_true: 真实标签。

y_pred: 预测标签。

target_names: 可选,类标签名称的列表,以便于输出可读性。

 

返回值:

返回一个字符串,包含每个类的精确率、召回率和 F1 值。

 

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

 

 

四、实验结果分析

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

 

 

2. 对比分析

型在训练和测试过程中表现出色,具备较高的准确性、精确率、召回率和F1分数。在实际应用中,模型能够很好地处理多类别问题,尤其是对于0类表现近乎完美。对于类别12,尽管有所差异,但总体表现依旧令人满意

 

五、心得体会

 

通过本次实验,我深入理解了支持向量机(SVM)和序列最小优化(SMO)算法的原理。SVM 是一种强大的分类算法,特别适用于高维数据的分类问题。而 SMO 算法则是 SVM 的一种高效实现,它通过迭代优化来找到最优的支持向量和决策边界。

在实验过程中,我遇到了一些挑战。首先,由于 scikit-learn 默认使用的是 LIBSVM 库而不是 SMO 算法,我需要寻找一个使用 SMO 算法的第三方库。这增加了实验的复杂度,但也让我有机会接触到不同的 SVM 实现。

其次,在五折交叉验证和测试集测试过程中,我需要注意到多分类问题中精度、召回率和 F1 值的平均方法。scikit-learn 提供了多种平均方法,如微平均(micro-average)和宏平均(macro-average)等,而在多分类问题中,我们通常使用加权平均(weighted-average)来更公平地评估每个类别的性能。

总的来说,这次实验不仅提高了我的编程能力,还加深了我对 SVM SMO 算法的理解。通过实践,我更加深入地理解了 SVM 的工作原理和性能评估方法,为未来的机器学习研究和应用打下了坚实的基础。

 

posted @ 2024-12-21 16:17  The-rich  阅读(73)  评论(0)    收藏  举报