9.24

(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注
意同分布取样);
(2)使用训练集训练支持向量机—SMO 分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选
择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的
部分。
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# 加载iris数据集
iris = 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, stratify=y)

# 训练支持向量机(SVM)模型,这里使用线性核函数的SVC模拟SMO算法(SVC默认使用的是LibSVM库,其内部实现了类似SMO的优化算法)
svm = SVC(kernel='linear')
svm.fit(X_train, y_train)

# 五折交叉验证评估模型性能
kf = KFold(n_splits=5, shuffle=True, random_state=42)
cv_scores = cross_val_score(svm, X_train, y_train, cv=kf, scoring='accuracy')
precision_scores = cross_val_score(svm, X_train, y_train, cv=kf, scoring='precision_macro')
recall_scores = cross_val_score(svm, X_train, y_train, cv=kf, scoring='recall_macro')
f1_scores = cross_val_score(svm, X_train, y_train, cv=kf, scoring='f1_macro')

print("五折交叉验证准确度:", cv_scores.mean())
print("五折交叉验证精度:", precision_scores.mean())
print("五折交叉验证召回率:", recall_scores.mean())
print("五折交叉验证F1值:", f1_scores.mean())

# 使用测试集测试模型性能
y_pred = svm.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)

# 测试结果分析
# 可以比较五折交叉验证和测试集的评估指标
# 如果两者的准确度、精度、召回率和F1值都较高且接近,说明模型具有较好的泛化能力和稳定性
# 例如,如果五折交叉验证的平均准确度为0.95,测试集准确度为0.92,说明模型在新数据上的表现与在训练数据多次划分评估的结果相近,模型较可靠
# 还可以进一步分析模型在不同类别样本上的表现,比如计算每个类别的精度、召回率等指标,查看是否存在类别不平衡问题导致某些类别预测效果不佳
# 若发现某个类别召回率较低,可以深入研究数据特征和模型决策边界,考虑改进方法,如调整SVM的参数(如C值、核函数参数等)、对数据进行预处理(如特征缩放、类别平衡处理)等,以提升模型性能,并在实验报告中详细记录这些分析和改进思路
  1. 在上述代码中:

    1. 首先利用load_iris函数从sklearn库中加载iris数据集,并通过train_test_split函数以留出法划分出1/3的样本作为测试集,同时确保训练集和测试集的数据分布相似(通过stratify=y参数实现)。
    2. 接着使用训练集对支持向量机(通过SVC类并指定kernel='linear'来模拟基于线性核的SMO算法训练模型,SVCsklearn中默认使用了优化算法,其原理与SMO类似)进行训练。
    3. 然后使用KFold进行五折交叉验证,分别计算模型的准确度、精度、召回率和F1值,并输出这些指标的平均值,以此来评估模型在训练集上的性能表现,从而为模型的选择和优化提供参考依据。
    4. 最后使用测试集对训练好的模型进行性能测试,并输出相应的评估指标值。在测试结果分析部分,可以对比五折交叉验证和测试集的评估指标,判断模型的泛化能力和稳定性;还可以进一步深入分析模型在不同类别样本上的表现情况
posted @ 2024-12-31 15:13  酥饼馅红豆沙  阅读(11)  评论(0)    收藏  举报