机器学习之逻辑回归(3)-交叉验证

什么是交叉验证法?

交叉验证用于防止模型过于复杂而引起的过拟合.有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证是一种评估统计分析、机器学习算法对独立于训练数据的数据集的泛化能力(generalize)。

交叉验证一般要尽量满足:

1)训练集的比例要足够多,一般大于一半

2)训练集和测试集要均匀抽样

为什么用交叉验证法?

交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合。

还可以从有限的数据中获取尽可能多的有效信息。

机器学习之逻辑回归(3)-交叉验证

交叉验证的主要方法

1. 留出法 (holdout cross validation)

在机器学习任务中,拿到数据后,在数据处理之后,我们会将原始数据集分为两部分:训练集、测试集。

训练集用于训练模型,测试集对于模型来说是未知数据,用于评估模型的泛化能力。

这个方法操作简单,只需随机把原始数据分为两组数据即可。这是目前最常见也是最常用的方式

不过如果只做一次分割,它对训练集、测试集的样本数比例,还有分割后数据的分布是否和原始数据集的分布相同等因素比较敏感,不同的划分会得到不同的最优模型,而且分成两个集合后,用于训练的数据更少了。

用 train_test_split 来随机划分数据集,其中 20% 用于测试集,80% 为训练集。

机器学习之逻辑回归(3)-交叉验证

如果不设置test_size,则默认3:1分成训练集和测试集

2. k 折交叉验证(k-fold cross validation)

k 折交叉验证通过对 k 个不同分组训练的结果进行平均来减少方差,因此模型的性能对数据的划分就不那么敏感。

第一步,不重复抽样将原始数据随机分为 k 份。

第二步,每一次挑选其中 1 份作为测试集,剩余 k-1 份作为训练集用于模型训练。

第三步,重复第二步 k 次,这样每个子集都有一次机会作为测试集,其余机会作为训练集。

在每个训练集上训练后得到一个模型,

用这个模型在相应的测试集上测试,计算并保存模型的评估指标,

第四步,计算 k 组测试结果的平均值作为模型精度的估计,并作为当前 k 折交叉验证下模型的性能指标。

数据量小的时候,k 可以设大一点,这样训练集占整体比例就比较大,不过同时训练的模型个数也增多,数据量大的时候,k 可以设小一点。

当 k=m 即样本总数时,每次的测试集都只有一个样本,要进行 m 次训练和预测。

这个方法用于训练的数据只比整体数据集少了一个样本,因此最接近原始样本的分布。

但是训练复杂度增加了,因为模型的数量与原始数据样本数量相同。

一般在数据缺乏时使用。

此外:

多次 k 折交叉验证再求均值,例如:10 次 10 折交叉验证,以求更精确一点。

划分时有多种方法,例如对非平衡数据可以用分层采样,就是在每一份子集中都保持和原始数据集相同的类别比例。

模型训练过程的所有步骤,包括模型选择,特征选择等都是在单个折叠 fold 中独立执行的。

最简单的方法是直接调用 cross_val_score,这里用了 5 折交叉验证:

机器学习之逻辑回归(3)-交叉验证

使用交叉验证得到精准率,召回率,和综合评价指标,代码如下:

机器学习之逻辑回归(3)-交叉验证


分享到:


相關文章: