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。这表明模型在测试集上的表现优于交叉验证的平均表现。

posted @ 2024-11-01 17:42  Hbro  阅读(20)  评论(0)    收藏  举报