机器学习B:实验四:SMO 算法实现与测试
一、实验目的
深入理解支持向量机(SVM)的算法原理,能够使用 Python 语言实现支持向量机的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注
意同分布取样);
(2)使用训练集训练支持向量机—SMO 分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选
择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的
部分。
三、算法步骤、代码、及结果
1. 算法伪代码
加载数据集:从 scikit-learn 库中加载 iris 数据集。
数据划分:使用留出法将数据集分为训练集和测试集,比例为 2:1。
模型训练:使用 SMO 算法训练支持向量机模型。
交叉验证:使用五折交叉验证评估模型性能。
模型测试:使用测试集测试模型性能。
结果分析:分析测试结果并撰写实验报告。
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 accuracy_score, precision_score, recall_score, f1_score
# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 数据划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42)
# 模型训练
# 使用 SMO 算法训练支持向量机模型
model = SVC(kernel='linear', C=1.0, random_state=42)
model.fit(X_train, y_train)
# 交叉验证
scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
print("五折交叉验证准确率:", scores.mean())
# 模型测试
y_pred = model.predict(X_test)
# 性能评估
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
print("准确率:", accuracy)
print("精度(查准率):", precision)
print("召回率(查全率):", recall)
print("F1值:", f1)
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
五折交叉验证准确率:
五折交叉验证的平均准确率提供了模型在不同训练集和验证集划分下的性能指标。这个指标有助于评估模型的稳定性和泛化能力。如果交叉验证的准确率较高,说明模型在不同的数据划分下都能保持较好的性能。
测试集性能:
测试集上的准确率、精度、召回率和F1值是评估模型最终性能的关键指标。这些指标应该与交叉验证的结果进行对比,以检查模型是否在未见数据上也能保持一致的性能。
准确率对比:
如果测试集上的准确率与交叉验证的平均准确率相近,说明模型具有良好的泛化能力。如果测试集准确率显著低于交叉验证准确率,可能表明模型过拟合。
精度、召回率和F1值对比:
精度(查准率)衡量的是模型预测为正类的样本中实际为正类的比例,召回率(查全率)衡量的是所有正类样本中被模型正确预测的比例。F1值是精度和召回率的调和平均,提供了一个综合的指标。
对比交叉验证和测试集上的这些指标,可以帮助我们理解模型在不同数据集上的表现是否一致。如果测试集上的指标显著低于交叉验证,可能需要进一步调整模型参数或考虑数据预处理和特征工程。
参数C的影响:
参数C控制着模型对误分类的惩罚。在您的代码中,C值设置为1.0。您可以尝试不同的C值(例如0.1, 10, 100)来观察模型性能的变化。通常,较小的C值会导致模型更加平滑,可能降低召回率但提高精度;较大的C值会使模型更加复杂,可能提高召回率但降低精度。