-
2020-01-06 15:18:40
交叉验证的目的
只是评估给定算法在特定数据集上训练后的泛化性能好坏
交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合。
还可以从有限的数据中获取尽可能多的有效信息。https://www.jianshu.com/p/d08843423099
更多相关内容 -
交叉验证的重要性:此示例说明省略交叉验证可能会由于过度拟合而导致具有误导性的高拟合优度-matlab开发
2021-05-29 14:01:58随机泊松分布矩阵 x 和向量 y 用泊松广义线性模型 [1] 拟合,估计拟合优度有两种情况: 1 没有交叉验证会导致高伪 R2 (pR2) 值2 交叉验证可提供正确的低 pR2 值 误导性的高 pR2 值和没有交叉验证的良好拟合是由于... -
理解K折交叉验证
2020-02-25 22:21:56k 折交叉验证 第一步,不重复抽样将原始数据随机分为 k 份。 第二步,每一次挑选其中 1 份作为测试集,剩余 k-1 份作为训练集用于模型训练。 第三步,重复第二步 k 次,这样每个子集都有一次机会作为测试集,其余...k 折交叉验证
第一步,不重复抽样将原始数据随机分为 k 份。
第二步,每一次挑选其中 1 份作为测试集,剩余 k-1 份作为训练集用于模型训练。
第三步,重复第二步 k 次,这样每个子集都有一次机会作为测试集,其余机会作为训练集。
在每个训练集上训练后得到一个模型,
用这个模型在相应的测试集上测试,计算并保存模型的评估指标,
第四步,计算 k 组测试结果的平均值作为模型精度的估计,并作为当前 k 折交叉验证下模型的性能指标。K折交叉验证的优点:
1.如果单纯的将数据集划分为一个训练集和一个测试集,则会导致测试集无法参与到模型的训练
2.k 折交叉验证通过对 k 个不同分组训练的结果进行平均来减少方差,因此模型的性能对数据的划分就不那么敏感。 -
K折交叉验证
2021-10-23 15:51:42用鸢尾花数据来展示k折验证效果 # 导入鸢尾花数据集 from sklearn.datasets import load_iris from sklearn.model_selection import cross_val_score # 导入用于分类的svc分类器 from sklearn.svm import SVC iris ...首先要讲的就是k折交叉验证的目的(即为什么要用k折交叉验证?)
根本原因:数据有限,单一的把数据都用来做训练模型,容易导致过拟合。(反过来,如果数据足够多,完全可以不使用交叉验证。)较小的k值会导致可用于建模的数据量太小,所以小数据集的交叉验证结果需要格外注意,建议选择较大的k值。k一般取2-10,在样本数量不是很多的情况下,想要检验拟合一个完美的模型,最常见的方法就是K折交叉检验。附代码
用鸢尾花数据来展示k折验证效果
# 导入鸢尾花数据集 from sklearn.datasets import load_iris from sklearn.model_selection import cross_val_score # 导入用于分类的svc分类器 from sklearn.svm import SVC iris = load_iris() x, y = iris.data, iris.target svc = SVC(kernel='linear') # cv 为迭代次数, 这里设置为5 scores = cross_val_score(svc, x, y, cv=5) # 5次,每次的结果 print("交叉验证得分: %.4f %.4f %.4f %.4f %.4f" % (scores[0], scores[1], scores[2], scores[3], scores[4])) # 用得分均值作为最终得分 print("res: %.4f" % (scores.mean()))
-
1.K-Fold 交叉验证概念
在机器学习建模过程中,通行的做法通常是将数据分为训练集和测试集。测试集是与训练独立的数据,完全不参与训练,用于最终模型的评估。在训练过程中,经常会出现过拟合的问题,就是模型可以很好的匹配训练数据,却不能很好在预测训练集外的数据。如果此时就使用测试数据来调整模型参数,就相当于在训练时已知部分测试数据的信息,会影响最终评估结果的准确性。通常的做法是在训练数据再中分出一部分做为验证(Validation)数据,用来评估模型的训练效果。
验证数据取自训练数据,但不参与训练,这样可以相对客观的评估模型对于训练集之外数据的匹配程度。模型在验证数据中的评估常用的是交叉验证,又称循环验证。它将原始数据分成K组(K-Fold),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型。这K个模型分别在验证集中评估结果,最后的误差MSE(Mean Squared Error)加和平均就得到交叉验证误差。交叉验证有效利用了有限的数据,并且评估结果能够尽可能接近模型在测试集上的表现,可以做为模型优化的指标使用。 -
2.举例说明
下面举一个具体的例子来说明K-Fold的过程,比如如下的数据
[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
分为K=3组后
Fold1: [0.5, 0.2]
Fold2: [0.1, 0.3]
Fold3: [0.4, 0.6]
交叉验证的时会使用如下三个模型,分别进行训练和测试,每个测试集误差MSE加和平均就得到了交叉验证的总评分
Model1: Trained on Fold1 + Fold2, Tested on Fold3
Model2: Trained on Fold2 + Fold3, Tested on Fold1
Model3: Trained on Fold1 + Fold3, Tested on Fold2 -
3.应用讲解
– 1、 将全部训练集S分成k个不相交的子集,假设S中的训练样例个数为m,那么每一个子集有m/k个训练样例,相应的子集称作{clip_image024}。
– 2、 每次从模型集合M中拿出来一个clip_image010[3],然后在训练子集中选择出k-1个 -
{clip_image026}(也就是每次只留下一个clip_image028),使用这k-1个子集训练clip_image010[4]后,得到假设函数clip_image030。最后使用剩下的一份clip_image028[1]作测试,得到经验错误clip_image032。
– 3、 由于我们每次留下一个clip_image028[2](j从1到k),因此会得到k个经验错误,那么对于一个clip_image010[5],它的经验错误是这k个经验错误的平均。
– 4、 选出平均经验错误率最小的clip_image010[6],然后使用全部的S再做一次训练,得到最后的clip_image012[4]。 -
核心内容:
通过上述1,2,3步进行模型性能的测试,取平均值作为某个模型的性能指标
根据性能指标来挑选出最优模型,再进行上述第4步重新进行训练,获得最终模型
- 疑问解答:
1.为什么不直接拆分训练集与数据集,来验证模型性能,反而采用多次划分的形式,岂不是太麻烦了?
我们为了防止在训练过程中,出现过拟合的问题,通行的做法通常是将数据分为训练集和测试集。测试集是与训练独立的数据,完全不参与训练,用于最终模型的评估。这样的直接划分会导致一个问题就是测试集不会参与训练,这样在小的数据集上会浪费掉这部分数据,无法使模型达到最优(数据决定了程性能上限,模型与算法会逼近这个上限)。但是我们又不能划分测试集,因为需要验证网络泛化性能。采用K-Fold 多次划分的形式就可以利用全部数据集。最后采用平均的方法合理表示模型性能。
2.为什么还要进行所有数据集重新训练,是否太浪费时间?
我们通过K-Fold 多次划分的形式进行训练是为了获取某个模型的性能指标,单一K-Fold训练的模型无法表示总体性能,但是我们可以通过K-Fold训练的训练记录下来较为优异的超参数,然后再以最优模型最优参数进行重新训练,将会取得更优结果。
3.何时使用K-Fold
我认为,数据总量较小时,其他方法无法继续提升性能,可以尝试K-Fold。其他情况就不太建议了,例如数据量很大,就没必要更多训练数据,同时训练成本也要扩大K倍(主要指的训练时间)。
-
-
Keras入门(八)K折交叉验证
2021-01-24 20:43:19在文章Keras入门(一)搭建深度神经网络(DNN)解决多分类问题中,笔者介绍了如何搭建DNN模型来解决IRIS数据集的多分类问题。 本文将在此基础上介绍... 用交叉验证的目的是为了得到可靠稳定的模型。K折交在文章Keras入门(一)搭建深度神经网络(DNN)解决多分类问题中,笔者介绍了如何搭建DNN模型来解决IRIS数据集的多分类问题。
本文将在此基础上介绍如何在Keras中实现K折交叉验证。什么是K折交叉验证?
K折交叉验证是机器学习中的一个专业术语,它指的是将原始数据随机分成K份,每次选择K-1份作为训练集,剩余的1份作为测试集。交叉验证重复K次,取K次准确率的平均值作为最终模型的评价指标。一般取K=10,即10折交叉验证,如下图所示:
用交叉验证的目的是为了得到可靠稳定的模型。K折交叉验证能够有效提高模型的学习能力,类似于增加了训练样本数量,使得学习的模型更加稳健,鲁棒性更强。选择合适的K值能够有效避免过拟合。Keras实现K折交叉验证
我们仍采用文章Keras入门(一)搭建深度神经网络(DNN)解决多分类问题中的模型,如下:
同时,我们对IRIS数据集采用10折交叉验证,完整的实现代码如下:# -*- coding: utf-8 -*- # model_train.py # Python 3.6.8, TensorFlow 2.3.0, Keras 2.4.3 # 导入模块 import keras as K import pandas as pd from sklearn.model_selection import KFold # 读取CSV数据集 # 该函数的传入参数为csv_file_path: csv文件路径 def load_data(sv_file_path): iris = pd.read_csv(sv_file_path) target_var = 'class' # 目标变量 # 数据集的特征 features = list(iris.columns) features.remove(target_var) # 目标变量的类别 Class = iris[target_var].unique() # 目标变量的类别字典 Class_dict = dict(zip(Class, range(len(Class)))) # 增加一列target, 将目标变量转化为类别变量 iris['target'] = iris[target_var].apply(lambda x: Class_dict[x]) return features, 'target', iris # 创建模型 def create_model(): init = K.initializers.glorot_uniform(seed=1) simple_adam = K.optimizers.Adam() model = K.models.Sequential() model.add(K.layers.Dense(units=5, input_dim=4, kernel_initializer=init, activation='relu')) model.add(K.layers.Dense(units=6, kernel_initializer=init, activation='relu')) model.add(K.layers.Dense(units=3, kernel_initializer=init, activation='softmax')) model.compile(loss='sparse_categorical_crossentropy', optimizer=simple_adam, metrics=['accuracy']) return model def main(): # 1. 读取CSV数据集 print("Loading Iris data into memory") n_split = 10 features, target, data = load_data("./iris_data.csv") x = data[features] y = data[target] avg_accuracy = 0 avg_loss = 0 for train_index, test_index in KFold(n_split).split(x): print("test index: ", test_index) x_train, x_test = x.iloc[train_index], x.iloc[test_index] y_train, y_test = y.iloc[train_index], y.iloc[test_index] print("create model and train model") model = create_model() model.fit(x_train, y_train, batch_size=1, epochs=80, verbose=0) print('Model evaluation: ', model.evaluate(x_test, y_test)) avg_accuracy += model.evaluate(x_test, y_test)[1] avg_loss += model.evaluate(x_test, y_test)[0] print("K fold average accuracy: {}".format(avg_accuracy / n_split)) print("K fold average accuracy: {}".format(avg_loss / n_split)) main()
模型的输出结果如下:
Iteration loss accuracy 1 0.00056 1.0 2 0.00021 1.0 3 0.00022 1.0 4 0.00608 1.0 5 0.21925 0.8667 6 0.52390 0.8667 7 0.00998 1.0 8 0.04431 1.0 9 0.14590 1.0 10 0.21286 0.8667 avg 0.11633 0.9600 10折交叉验证的平均loss为0.11633,平均准确率为96.00%。
总结
本文代码已存放至Github,网址为:https://github.com/percent4/Keras-K-fold-test 。
感谢大家的阅读~
2020.1.24于上海浦东 -
交叉验证法(cross-validaiton)的目的到底是什么?对于5折交叉验证,应该选择哪个模型作为最终模型呢?
2020-11-04 11:15:39疑问:对于交叉验证法,如5折交叉验证,那么将会生成5个模型,到底应该选择哪个模型作为最终的模型呢? 解答:通过阅读博文,发现交叉验证法是用来评估模型性能的,并不参与最后预测模型的生成。 知识点总结: 一... -
关于交叉验证的一些说明
2021-12-25 12:32:401.交叉验证的分类 保留交叉验证:也称简单交叉验证。随机将样本集分为训练集和验证集,比例通常是8:2,或者7:3,在训练集上训练得到模型,在验证集上对模型进行评估。上面步骤可以重复多次,最后选出一个误差最小的... -
为什么要用交叉验证
2017-06-21 12:09:31什么是交叉验证法? 为什么用交叉验证法? 主要有哪些方法?优缺点? 各方法应用举例? 什么是交叉验证法?它的基本思想就是将原始数据(dataset)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价... -
详细介绍机器学习中的7种交叉验证方法
2022-02-14 00:17:17来源:机器学习社区、数据派THU 本文约3400字,建议阅读10分钟 本文与你分享7种最常用的交叉验证技术及其优缺点,提供了每种技术的代码片段。在任何有监督机器学习项目的模型构建阶段,我们... -
k-折交叉验证
2019-06-18 20:52:58一、k折交叉验证的目的(为什么要用k折交叉验证?) 1.根本原因:数据有限,单一的把数据都用来做训练模型,容易导致过拟合。(反过来,如果数据足够多,完全可以不使用交叉验证。)较小的k值会导致可用于建模的数据... -
机器学习为什么需要交叉验证?怎么使用k-fold cross validation(k-折叠交叉验证)
2018-07-01 22:32:36介绍这个非常重要的概念,希望在训练算法时能...交叉验证的基本思想:把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对模型... -
机器学习 交叉验证的作用
2019-05-07 19:39:42交叉验证(Cross validation),交叉验证用于防止模型过于复杂而引起的过拟合.有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此... -
交叉验证
2018-11-21 20:58:37交叉验证目的:防范过拟合 我们把数据集分成训练集、验证集和测试集; 训练集用来估算模型参数,验证集用来选择超参数,测试集用来评估模型效果。 交叉验证是在机器学习建立模型和验证模型参数时常用的办法。... -
机器学习——基于python的鸢尾花SVM练习(包含超参数批量筛选、交叉验证)
2022-04-01 16:55:43基于python的鸢尾花SVM练习,包含超参数的批量筛选,重复交叉验证。 -
模型评估—交叉验证
2021-02-16 13:06:213. sklearn的交叉验证 3.1. 计算交叉验证的指标 3.1.1. cross_validate 函数和多度量评估 3.1.2. 通过交叉验证获取预测 3.2. 交叉验证迭代器 3.3. 交叉验证迭代器–循环遍历数据 3.3.1. K 折 3.1.3.2. 重复 K... -
10折交叉验证深入理解
2018-12-25 15:22:08交叉验证(Cross Validation),有的时候也称作循环估计(Rotation Estimation),是一种统计学上将数据样本切割成较小子集的实用方法,该理论是由Seymour Geisser提出的。 在给定的建模样本中,拿出大部分样本进行... -
什么是交叉验证?什么是网格搜索?
2021-02-05 12:06:46交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证。... -
k折交叉验证的keras和sklearn版本通吃
2019-12-02 10:40:081. 什么是交叉验证 交叉验证(Cross-validation)主要用于建模应用中,例如PCR 、PLS 回归建模中。在给定的建模样本中,拿出大部分样本进行建模型,留小部分样本用刚建立的模型进行预报,并求这小部分样本的预报误差,... -
通过交叉验证消除特征工程递归特征
2020-10-13 20:21:05Number of feature vs cross-validations score — output of above code :Image by author 功能数量与交叉验证得分的比较—以上代码的输出:作者提供的图像 Key Takeaways and Conclusion 重要要点和结论 ... -
机器学习---之交叉验证的用处与优点
2018-01-16 16:17:44交叉验证主要可以用来评估模型的性能,比如说有一个模型,有一个数据集,如果不使用交叉验证,那就是直接将数据放到网络当中去训练,训练结束后,用新的数据来进行测试,来看看这个模型是否好,但是这个模型对这个新... -
k折交叉验证
2014-12-18 13:03:35k折交叉验证 -
深度盘点:8000字详细介绍 Python 中的 7 种交叉验证方法
2021-11-21 18:45:30在任何有监督机器学习项目的模型构建阶段,我们训练模型的目的是从标记的示例中学习所有权重和偏差的最佳值。 如果我们使用相同的标记示例来测试我们的模型,那么这将是一个方法论错误,因为一个只会重复刚刚看到的... -
【机器学习】交叉验证防止过拟合(含义+代码+演示)
2019-08-20 15:24:07交叉验证其实就是为了检查模型的泛化行和稳定性,让模型的输出更加可靠。 因为当我们只将训练数据划分一次时,有可能划分的不好,所以模型的结果会有偏差,不可靠。所以,我们可以使用交叉验证。经常使用的是k-... -
机器篇——决策树(六) 细说 评估指标的交叉验证
2020-01-04 14:49:07返回主目录 返回决策树目录 上一章:机器篇——决策树(五) 下一章:机器篇——集成学习(一) ... 交叉验证(cross validation, cv) 主要用于模型训练或建模应用中,如分类预测、PCR、PLS 回归建模等。在给定的... -
数据不平衡处理,交叉验证,召回率
2019-08-02 17:28:30 下采样就是减少数据极多的样本数据,以达到平衡数据的效果(减少y=0的样本数,使y=0的数量和y=1的数量平衡起来) 使用python实现下采样的代码 #下采样 def down(data): #分离特值X和结果y X... -
交叉验证(CrossValidation)方法思想简介
2018-01-22 11:41:07以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),...