11.23

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}")
posted @   liuxuechao  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示