import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split, StratifiedKFold
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 加载iris数据集
iris = datasets.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=0.33, random_state=42)
# 初始化SVM分类器,使用线性核函数,默认参数,内部实现SMO算法
svm_clf = SVC(kernel='linear', C=1.0, gamma='scale', decision_function_shape='ovo')
# 训练模型
svm_clf.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = svm_clf.predict(X_test)
# 计算并打印测试集上的性能指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='weighted')
recall = recall_score(y_test, y_pred, average='weighted')
f1 = f1_score(y_test, y_pred, average='weighted')
print(f"测试集准确率: {accuracy:.2f}")
print(f"测试集精确率: {precision:.2f}")
print(f"测试集召回率: {recall:.2f}")
print(f"测试集F1得分: {f1:.2f}")
# 五折交叉验证评估模型性能
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
cv_accuracies = []
cv_precisions = []
cv_recalls = []
cv_f1s = []
for train_index, val_index in skf.split(X_train, y_train):
X_fold_train, X_fold_val = X_train[train_index], X_train[val_index]
y_fold_train, y_fold_val = y_train[train_index], y_train[val_index]
svm_clf.fit(X_fold_train, y_fold_train)
y_fold_pred = svm_clf.predict(X_fold_val)
cv_accuracy = accuracy_score(y_fold_val, y_fold_pred)
cv_precision = precision_score(y_fold_val, y_fold_pred, average='weighted')
cv_recall = recall_score(y_fold_val, y_fold_pred, average='weighted')
cv_f1 = f1_score(y_fold_val, y_fold_pred, average='weighted')
cv_accuracies.append(cv_accuracy)
cv_precisions.append(cv_precision)
cv_recalls.append(cv_recall)
cv_f1s.append(cv_f1)
print(f"五折交叉验证准确率: {cv_accuracies}")
print(f"五折交叉验证平均准确率: {np.mean(cv_accuracies):.2f}")
print(f"五折交叉验证精确率: {cv_precisions}")
print(f"五折交叉验证平均精确率: {np.mean(cv_precisions):.2f}")
print(f"五折交叉验证召回率: {cv_recalls}")
print(f"五折交叉验证平均召回率: {np.mean(cv_recalls):.2f}")
print(f"五折交叉验证F1得分: {cv_f1s}")
print(f"五折交叉验证平均F1得分: {np.mean(cv_f1s):.2f}")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通