×

零起点Python机器学习快速入门-7-4-SVM 交叉验证算法

hqy hqy 发表于2025-04-27 20:38:05 浏览8 评论0百度已收录

抢沙发发表评论

1. 什么是 SVM 交叉验证算法

SVM(支持向量机)是一种强大的有监督学习算法,可用于分类和回归任务。而交叉验证是一种评估模型性能的统计方法,将 SVM 与交叉验证结合,能够更准确地评估 SVM 模型在不同数据集划分下的性能,减少因数据划分不同而导致的评估误差,同时还可以用于选择合适的模型超参数。

2. 交叉验证的常见方法

2.1 简单交叉验证

原理:将原始数据集随机划分为训练集和测试集,通常按照一定比例,如 70% 的数据作为训练集,30% 作为测试集。使用训练集训练 SVM 模型,然后在测试集上评估模型的性能。

代码主要实现了使用 SVM 算法对鸢尾花数据集进行分类预测,并通过交叉验证进行超参数调优的功能。

数据加载:从指定路径读取鸢尾花数据集的训练集和测试集的特征与标签数据,并将测试集特征数据复制到 df9 中。

建模:调用 mx_svm_cross 函数,通过网格搜索和交叉验证对 SVM 模型进行超参数调优,找到最优的 C 和 gamma 参数,然后使用这些参数训练 SVM 模型。

预测:使用训练好的 SVM 模型对测试集数据进行预测,将预测结果添加到 df9 中,并对预测结果进行处理。

结果保存:将包含预测结果和真实标签的 df9 保存为 CSV 文件。

模型评估:调用 ai_acc_xed 函数计算模型的准确率并打印输出。

通过上述步骤,代码完成了一个完整的基于 SVM 的机器学习分类任务,并利用交叉验证优化了模型性能。

# 导入操作系统相关模块,os 用于文件和目录操作,sys 可访问 Python 解释器相关变量和函数,re 用于正则表达式处理 import os,sys,re # 导入 arrow 用于日期和时间处理,bs4 是 BeautifulSoup 库,用于解析 HTML 和 XML 文档 import arrow,bs4 # 导入 pandas 库用于数据处理和分析,通常使用别名 pd import pandas as pd # 导入 requests 库,用于发送 HTTP 请求以获取网页内容 import requests # 从 bs4 库中导入 BeautifulSoup 类,专门用于解析 HTML 和 XML 文档 from bs4 import BeautifulSoup # 导入 sklearn 机器学习库,它提供了各种机器学习算法和工具 import sklearn # 从 sklearn 中导入 datasets 模块,可加载常用数据集,linear_model 模块用于线性模型 from sklearn import datasets, linear_model # 从 sklearn 的 model_selection 模块导入 train_test_split 函数,用于将数据集划分为训练集和测试集 from sklearn.model_selection import train_test_split # 从 sklearn 的 linear_model 模块导入 LinearRegression 类,用于线性回归分析 from sklearn.linear_model import LinearRegression # 从 sklearn 中导入 metrics 模块,用于评估模型的性能 from sklearn import metrics # 从 sklearn 的 model_selection 模块导入 cross_val_predict 函数,用于交叉验证预测 from sklearn.model_selection import cross_val_predict # 导入自定义模块 zsys,可能包含系统相关工具函数 import zsys # 导入自定义模块 ztools 并使用别名 zt,可能包含通用工具函数 import ztools as zt # 导入自定义模块 ztools_str 并使用别名 zstr,可能包含字符串处理工具函数 import ztools_str as zstr # 导入自定义模块 ztools_web 并使用别名 zweb,可能包含网络相关工具函数 import ztools_web as zweb # 导入自定义模块 ztools_data 并使用别名 zdat,可能包含数据处理工具函数 import ztools_data as zdat # 导入自定义模块 ztop_ai 并使用别名 zai,可能包含人工智能相关工具函数 import ztop_ai as zai # 导入自定义模块 zpd_talib 并使用别名 zta,可能包含 pandas 和 talib 相关工具函数 import zpd_talib as zta # 导入自定义模块 tfb_sys 并使用别名 tfsys,可能包含与 tfb 系统相关的工具函数 import tfb_sys as tfsys # 导入自定义模块 tfb_tools 并使用别名 tft,可能包含 tfb 工具函数 import tfb_tools as tft # 导入自定义模块 tfb_strategy 并使用别名 tfsty,可能包含 tfb 策略相关的函数 import tfb_strategy as tfsty # 导入自定义模块 tfb_backtest 并使用别名 tfbt,可能包含 tfb 回测相关的函数 import tfb_backtest as tfbt #----------------------- #1 # 定义文件路径前缀,用于后续读取数据集文件 fs0=dat/iris_ # 打印提示信息和文件路径前缀 print(\n1# init,fs0,,fs0) # 从指定路径读取训练集的特征数据,不将第一列作为索引 x_train=pd.read_csv(fs0+xtrain.csv,index_col=False); # 从指定路径读取训练集的标签数据,不将第一列作为索引 y_train=pd.read_csv(fs0+ytrain.csv,index_col=False); # 从指定路径读取测试集的特征数据,不将第一列作为索引 x_test=pd.read_csv(fs0+xtest.csv,index_col=False) # 从指定路径读取测试集的标签数据,不将第一列作为索引 y_test=pd.read_csv(fs0+ytest.csv,index_col=False) # 复制测试集的特征数据到新的 DataFrame df9 中 df9=x_test.copy() #2 # 打印提示信息,表示开始建模 print(\n2# 建模) # 调用自定义模块 zai 中的 mx_svm_cross 函数,传入训练集的特征和标签数据,训练一个 SVM 模型并进行交叉验证调参 mx =zai.mx_svm_cross(x_train.values,y_train.values) #3 # 打印提示信息,表示开始进行预测 print(\n3# 预测) # 使用训练好的 SVM 模型对测试集的特征数据进行预测,得到预测结果 y_pred = mx.predict(x_test.values) # 将预测结果添加到 df9 的 y_predsr 列中 df9[y_predsr]=y_pred # 将测试集的真实标签和预测结果分别添加到 df9 的 y_test 和 y_pred 列中 df9[y_test],df9[y_pred]=y_test,y_pred # 对预测结果进行四舍五入并转换为整数类型,更新 y_pred 列 df9[y_pred]=round(df9[y_predsr]).astype(int) #4 # 将包含预测结果和真实标签的 df9 保存为 CSV 文件,不保存索引 df9.to_csv(tmp/iris_9.csv,index=False) # 打印提示信息 print(\n4# df9) # 打印 df9 的最后几行数据 print(df9.tail()) #5 # 调用自定义模块 zai 中的 ai_acc_xed 函数,传入 df9、误差阈值 1 和是否调试的标志 False,计算模型的准确率 dacc=zai.ai_acc_xed(df9,1,False) # 打印模型的准确率,保留两位小数 print(\n5# mx:mx_sum,kok:{0:.2f}%.format(dacc)) #----------------------- # 打印完成提示信息 print(\nok!) # SVM- cross向量机交叉算法,函数名,SVC def mx_svm_cross(train_x, train_y): """ 该函数用于创建并训练一个经过交叉验证调参的 SVM 分类器模型 :param train_x: 训练集的特征数据 :param train_y: 训练集的标签数据 :return: 训练好的 SVM 模型 """ # 创建一个 SVC 分类器,使用径向基核函数(rbf),并开启概率估计 mx = SVC(kernel=rbf, probability=True) # 定义超参数搜索空间,C 是惩罚参数,gamma 是径向基核函数的参数 param_grid = {C: [1e-3, 1e-2, 1e-1, 1, 10, 100, 1000], gamma: [0.001, 0.0001]} # 创建网格搜索对象,使用 SVM 模型 mx,超参数搜索空间 param_grid,设置 n_jobs = 1 表示使用单线程,verbose=1 表示输出搜索过程信息 grid_search = GridSearchCV(mx, param_grid, n_jobs = 1, verbose=1) # 使用训练集数据进行网格搜索和交叉验证,寻找最优超参数 grid_search.fit(train_x, train_y) # 获取最优模型的超参数 best_parameters = grid_search.best_estimator_.get_params() # 可以通过以下代码打印每个超参数及其值(这里注释掉了) #for para, val in best_parameters.items(): # print( para, val) # 使用最优超参数重新创建 SVM 模型 mx = SVC(kernel=rbf, C=best_parameters[C], gamma=best_parameters[gamma], probability=True) # 使用训练集数据训练最终的 SVM 模型 mx.fit(train_x, train_y) # 返回训练好的模型 return mxrunfile(D:/zwPython/zwrk/4_零起点Python机器学习快速入门/zai304_mx_svmcr.py, wdir=D:/zwPython/zwrk/4_零起点Python机器学习快速入门) Reloaded modules: zsys, cpuinfo, ztools, ztools_str, ztools_web, ztools_data, ztop_ai, zpd_talib, tfb_sys, tfb_tools, tfb_strategy, tfb_backtest 1# init,fs0, dat/iris_ 2# 建模 Fitting 5 folds for each of 14 candidates, totalling 70 fits 3# 预测 4# df9 x1 x2 x3 x4 y_predsr y_test y_pred 33 6.4 2.8 5.6 2.1 1 1 1 34 5.8 2.8 5.1 2.4 1 1 1 35 5.3 3.7 1.5 0.2 2 2 2 36 5.5 2.3 4.0 1.3 3 3 3 37 5.2 3.4 1.4 0.2 2 2 2 5# mx:mx_sum,kok:97.37% ok!