当前位置:网站首页 > 技术博客 > 正文

交叉验证原理




交叉验证是一种在机器学习中广泛应用的评估技术,主要用于评估模型的泛化能力和性能。 交叉验证(Cross-validation)是一种将数据集分割成多个小部分,然后多次对模型进行训练和验证的过程。通过多次进行这个过程,可以评估模型的泛化性能和稳定性。

注:上面所说的"模型的泛化能力"、"模型的稳定性"可能对一些读者来说比较难理解。

(1)"模型的泛化能力":机器学习的“泛化”能力是指机器学习算法对"新鲜样本"的适应能力。这种能力使得机器学习模型在面对新数据时,能够更好地适应并做出准确的预测。

(2)"模型的稳定性":是指模型对于输入数据的变化的响应程度。如果模型对于不同的输入数据变化能够产生相对一致的输出结果,那么这个模型就被认为是稳定的。

如果对"泛化"和"稳定性"这两个概念还不太了解,也没有关系,其实不影响对下面内容的阅读和理解

下面介绍2种常见的交叉验证方法:

(1)留出交叉验证(Leave-one-out cross-validation): 每次选择一个样本作为测试集,剩下的样本作为训练集,然后进行模型训练和测试。在所有样本都被选作测试集之后,可以计算出模型的平均性能指标。

(2)k折交叉验证(k-fold cross-validation): 将数据集分成k个子集,每次选择k-1个子集作为训练集,剩下的一个子集作为验证集。这种方法的好处是可以在较短的时间内完成验证,适用于大规模数据集。

下面将以一个简单的例子讲解上面这三种交叉验证的方法。

我们的数据来源于英雄联盟S12。result指的是比赛的胜负,FAC1指的是队伍在比赛中的技战术指标。我们要用这6个FAC1来预测比赛的胜负result。

样本一共有10个,样本的序号我们设为0-1-2-3-4-5-6-7-8-9

3.1 进行留出交叉验证法

用上面的10个样本数据做机器学习的模型。在这种情况下,要进行10次的模型训练和测试。 下面的数字代表的样本序号(0-9)。

第01次: 训练集为0-1-2-3-4-5-6-7-8 测试集为9

第02次: 训练集为1-2-3-4-5-6-7-8-9 测试集为0

第03次: 训练集为2-3-4-5-6-7-8-9-0 测试集为1

第04次: 训练集为3-4-5-6-7-8-9-0-1 测试集为2

第05次: 训练集为4-5-6-7-8-9-0-1-2 测试集为3

第06次: 训练集为5-6-7-8-9-0-1-2-3 测试集为4

第07次: 训练集为6-7-8-9-0-1-2-3-4 测试集为5

第08次: 训练集为7-8-9-0-1-2-3-4-5 测试集为6

第09次: 训练集为8-9-0-1-2-3-4-5-6 测试集为7

第10次: 训练集为9-0-1-2-3-4-5-6-7 测试集为8

3.2 k折交叉验证法(shuffle=False)

用上面的10个样本数据做机器学习的模型。在这种情况下,要进行k次的模型训练和测试。而k是我们自己设定的,在这里我们设定为5(即下面代码的n_splits=5)。

kf = KFold(n_splits=5, shuffle=False) -- 这是一段进行k折交叉验证中的python代码

shuffle=False即"数据分成5份"时是不是随机分的,而是按照原有的样本序号分的; "shuffle"的英文意思是"洗牌; 洗(牌); 拖着脚走; 坐立不安; 把(纸张等)变换位置,打乱次序"

k折交叉验证法(shuffle=False)实现的效果如下:

第01次: 训练集为0-1-2-3-4-5-6-7 测试集为8-9

第02次: 训练集为2-3-4-5-6-7-8-9 测试集为0-1

第03次: 训练集为4-5-6-7-8-9-0-1 测试集为2-3

第04次: 训练集为6-7-8-9-0-1-2-3 测试集为4-5

第05次: 训练集为8-9-0-1-2-3-4-5 测试集为6-7

注:上面的数字代表的样本序号(0-9)。

3.3 k折交叉验证法(shuffle=True)

用上面的10个样本数据做机器学习的模型。在这种情况下,要进行k次的模型训练和测试。而k是我们自己设定的,在这里我们设定为5(即下面代码的n_splits=5)。

kf = KFold(n_splits=5, shuffle=True) -- 这是一段进行k折交叉验证中的python代码

shuffle=True即"数据分成5份"时是随机分的; "shuffle"的英文意思是"洗牌; 洗(牌); 拖着脚走; 坐立不安; 把(纸张等)变换位置,打乱次序"

k折交叉验证法(shuffle=True)实现的效果如下:

第01次: 训练集为0-1-3-4-5-6-7-8 测试集为2-9

第02次: 训练集为1-2-3-5-6-7-8-9 测试集为0-4

第03次: 训练集为0-1-2-4-6-7-8-9 测试集为3-5

第04次: 训练集为0-2-3-4-5-7-8-9 测试集为1-6

第05次: 训练集为0-1-2-3-4-5-6-9 测试集为7-8

注:上面的数字代表的样本序号(0-9)。

01 导入库

>引入库函数

 
   

>导入进行模型训练与测试前的进行数据处理的库

 
   

>导入逻辑回归模型的库(linear_model字面理解是线性模型的意思)

 
   

>导入“集成学习”的库(集成学习(ensemble learning),并不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器(基学习器,Base learner)来完成学习任务。)

 
   

>导入含机器学习评价函数的库

 
   

>导入含混淆矩阵的库

 
   

>导入机器学习的评价指标准确率、精确率、召回率、F1值

 
   

>导入做ROC曲线的库

 
   

>导入作图的库

 
   

02 获取数据源并整理数据

(数据集可在此获取:机器学习交叉验证教程 - 飞桨AI Studio星河社区 (baidu.com)

 
   

运行结果: 

>查看前几行数据

 
   

 数据解释:result是胜负结果;FAC1_1等是通过主成分分析后得到的技战术指标

 >使用loc函数进行数据获取

 
   

运行结果: 

>使用iloc函数进行数据获取

03 对数据集进行7次“训练”和“测试”

> 使用KFold设定交叉验证的参数

(n_splits=7即把数据分成7份,也是要进行7次的"训练"和"测试";   shuffle=True即"数据分成7份"时是随机分的;random=40,按正常的理解,应该是"random_state=40指定随机数生成器的种子")

 
   

>创建一个全是1的7×5的矩阵

 
   

>用i来表明是第几次的交叉验证;从0开始计数

 
   

>使用kf.split( )这个函数进行数据的划分

(在每一次循环的"train_index"、"test_index"都是不一样的 ; "train_index"指的是第i次训练和测试时的训练集数据的行索引; "train_index"指的是第i次训练和测试时的测试集数据的行索引)

 
   

运行结果:

- 第1次:

- 第2次:

- 第3次:

- 第4次:

- 第5次:

- 第6次:

- 第7次

 


以上就是今天为大家整理的机器学习的代码教程(详解版)啦,希望对你有所帮助

欢迎转载、收藏、如果有所收获可以点赞支持一下~

版权声明


相关文章:

  • 超像素分割的技术难点2025-06-17 11:30:01
  • 程序员接私活收费标准2025-06-17 11:30:01
  • jupyter怎么安装tensorflow2025-06-17 11:30:01
  • java项目实例讲解2025-06-17 11:30:01
  • 批处理文件命令大全2025-06-17 11:30:01
  • cmd切换java版本2025-06-17 11:30:01
  • ldap服务端口2025-06-17 11:30:01
  • 基于蒙特卡洛搜索树的黑白棋2025-06-17 11:30:01
  • 串口调试助手v2.2怎么用2025-06-17 11:30:01
  • sql游标语法2025-06-17 11:30:01