一份机器学习模型离线评估方法的详细手册

简介:
首先需要知道的是,机器学习想要能够解决业务中的问题,简单可以分为两个阶段:离线和线上(离线指的是模型未部署到生产环境之前,线上是指模型部署到生产环境之后)。在离线阶段,首先需要先训练一个模型,然后对训练好的模型进行离线评估来了解下模型的性能情况。

我们知道,模型训练的时候使用的数据集是训练集,模型在测试集上的误差近似为泛化误差,而我们更关注的就是泛化误差,所以在离线阶段我们需要解决一个问题,那就是如何将一个数据集 D 划分成训练集 S 和测试集 T ?实际上,离线评估的时候有多种方法可以实现上面的要求,这里介绍一些常用的方法。

留出法

留出法(hold-out)是指将数据集 D 划分成两份互斥的数据集,一份作为训练集 S,一份作为测试集 T,在 S 上训练模型,在 T 上评估模型效果。

留出法的优点是简单好实现,但是也会有一些明显的缺点。比如说划分后的训练集和测试集的大小会严重影响模型最终的评估结果。如果说训练集 S 比较大,测试集 T 比较小,那么评估结果的不够稳定准确,可信度较低;如果说训练集 S 比较小,测试集 T 比较大,那么得到的模型很可能与全量数据集 D 得到的模型有很大的差别,这就降低了评估结果的真实性。通常的做法是,将全量数据集的 2/3~4/5的样本作为训练集,剩余样本作为测试集。

除了划分得到的训练集 S 和测试集 T 的数据量会影响评估结果外,它们的数据分布也会影响评估结果,尽量保证训练集 S 和测试集 T 的数据分布一致,避免由于数据划分引入额外的偏差而对最终结果产生影响。举个具体的例子来说明,有一个包含了 1500 条正样本和 1500 条负样本的数据集,现在使用二分类模型来进行自动分类,假设将 1/3 的数据作为测试集,应该使得测试集正负样本均在 500 条左右;如果测试集由 50 条正样本和 950 条负样本组成,那么评估结果将会因为样本分布差异而导致很大的偏差。

因此,考虑到单次留出法的结果往往不够稳定可靠,我们一般会进行多次留出法实验,每次随机划分,最终将多次得到的实验结论进行平均。

但是在实际工作中,如果不分场景,任何时候都是用随机划分数据集可能会导致一些其他的问题,比如说数据泄露(穿越问题)等。

交叉验证法

交叉验证法(cross validation)先将数据集 D 划分成 k 分互斥的数据子集,即

7162733d960367fa78cd30f6ac809bf6f3cc6c25
,一般每个数据子集的个数基本相近、数据分布基本一致。然后每次用一份数据子集作为测试集,其余的 k-1 份数据子集作为训练集,迭代 k 轮得到 k 个模型,最后将将 k 次的评估结果汇总求平均值得到最终的评估结果。上面说的有点抽象,来看一个 k 为 10 的时候的交叉验证示意图。

5674bfc3d37673ca1dfd2ad5e783e64af2ecb163

很明显,交叉验证评估结果的稳定性和保真性在很大程度上取决于 k 值的大小,所以交叉验证也叫做k 折交叉验证(k-fold cross validation)。k 常用的取值有 5、10 和 20。

假定数据集 D 中包含了 m 个样本,若令 k=m,则得到了交叉验证法中的一个特例:留一法(leave-one-out,简称 LOO)。留一法的优缺点都很明显。训练 m 个模型,每个模型基本上用到了全部的数据,得到的模型与全部数据集 D 得到的模型更接近,并且不再受随机样本划分方式的影响。但是当样本太多时,即 m 很大时,计算成本非常高。

知道了留一法之后,我们再来看下一个新的评估方法:留P法(leave-p-out,简称LPO)。留P法是每次留下 p 个样本作为测试集,而从 m 个元素中选择 p 个元素有中可能,因此它的计算开销远远高于留一法。

由于存在不平衡分类问题(分类问题中样本里包含的标签的数量失衡,比如二分类中样本量包含的正负样本比例为10:1),基于此,存在一种叫做分层 k 折交叉验证法(stratified-k-fold)。这种方法对每个类别进行 k 折划分,使得每份数据子集中各类别的数据分布与完整数据集分布相一致。比如二分类中进行分层5折交叉验证,正样本有 300 条,负样本有 30 条,将数据划分成 5 分,并且每份数据中有 60 条正样本,6 条负样本。

自助法

自助法(bootstrapping)以自主采样(bootstrap sampling)为基础,使用有放回的重复采样的方式进行训练集、测试集的构建。比如为了构建 m 条样本的训练集,每次从数据集 D 中采样放入训练集,然后有放回重新采样,重复 m 次得到 m 条样本的训练集,然后将将没有出现过的样本作为测试集。

很明显,有一些样本在会被重复采样,多次出现在训练集中,而另外一些样本在训练集从未出现。我们可以计算样本从未在训练集中出现的概率。在每次采样

时,每条样本经过 m 次始终没有被采到的概率是


dcafa5df2cf9ec347a1c093b6a5c9e6447f18652

,当 m 无穷大时,取极限可得到。

051145d12f4c7beac18f129187770d693c052125

这也就意味着,当数据量很大时,大约有 36.8% 的样本不会出现在训练集中,也就是这些样本都会作为测试集。

留出法和交叉验证法在训练模型时用的数据都只是整个数据集 D 的一个自己,得到的模型会因为训练集大小不一致导致一定的偏差。而自助法能够更好地解决这个问题。但自助法改变了初始数据集的分布,会引入估计偏差,所以在数据量足够时,一般采用留出法和交叉验证法。

练习题

看完这篇文章,我们来做几道练习题来检验下学习成果:

  1. 试证明自助法中对 m 个样本进行 m 次自助采样,当 m 趋于无穷大时,为什么有 36.8% 的样本从未被选择过?


原文发布时间为:2018-10-31
本文作者: AI派
本文来自云栖社区合作伙伴“ AI派”,了解相关信息可以关注“ AI派”。
相关文章
|
3天前
|
机器学习/深度学习 数据采集 自然语言处理
构建高效机器学习模型的策略与实践
【4月更文挑战第30天】 在数据驱动的时代,机器学习(ML)作为一项核心技术,其应用范围和影响力日益扩大。然而,构建一个既高效又准确的机器学习模型并非易事。本文将探讨一系列实用的策略和技术,用于优化机器学习的工作流程,包括数据预处理、特征工程、模型选择、超参数调优以及模型评估等方面。通过这些策略,读者可以提升模型的性能,确保在实际应用中达到预期的准确度和效率。
|
1天前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型的最佳实践
【5月更文挑战第2天】 在数据驱动的时代,机器学习已成为智能系统不可或缺的组成部分。本文将深入探讨构建高效机器学习模型的策略,包括数据预处理、特征工程、模型选择、调参技巧以及模型评估方法。我们将通过实际案例分析,揭示如何避免常见陷阱,并利用最佳实践提高模型的性能和泛化能力。文章旨在为从业者提供一套实用的技术指南,帮助他们在面对复杂数据时能够做出明智的决策,并最终实现机器学习项目的高效落地。
|
2天前
|
机器学习/深度学习 运维 持续交付
构建高效自动化运维体系:Ansible与Docker的完美结合构建高效机器学习模型的五大技巧
【4月更文挑战第30天】 在当今快速发展的云计算和微服务架构时代,自动化运维已成为维持系统稳定性和提高效率的关键。本文将探讨如何通过结合Ansible和Docker技术构建一个高效的自动化运维体系。文章不仅介绍了Ansible与Docker的基本原理和优势,还详细阐述了如何整合这两种技术以简化部署流程、加强版本控制,并提高整体运维效率。通过案例分析,我们将展示这一组合在实际环境中的应用效果,以及它如何帮助企业实现持续集成和持续部署(CI/CD)的目标。 【4月更文挑战第30天】 在数据驱动的时代,构建一个高效的机器学习模型是获取洞察力和预测未来趋势的关键步骤。本文将分享五种实用的技巧,帮助数
|
2天前
|
机器学习/深度学习 算法 数据挖掘
构建高效机器学习模型的五大技巧
【4月更文挑战第30天】 在数据科学领域,构建一个高效的机器学习模型是实现精准预测与分析的核心。本文将深入探讨提升模型效能的五个关键技巧:特征工程、模型选择、超参数调优、正则化技术以及交叉验证。通过这些方法的综合应用,读者可以显著提高其机器学习项目的准确率和泛化能力。
|
2天前
|
机器学习/深度学习 数据采集 前端开发
【Python机器学习专栏】模型泛化能力与交叉验证
【4月更文挑战第30天】本文探讨了机器学习中模型泛化能力的重要性,它是衡量模型对未知数据预测能力的关键。过拟合和欠拟合影响泛化能力,而交叉验证是评估和提升泛化能力的有效工具。通过K折交叉验证等方法,可以发现并优化模型,如调整参数、选择合适模型、数据预处理、特征选择和集成学习。Python中可利用scikit-learn的cross_val_score函数进行交叉验证。
|
2天前
|
机器学习/深度学习 数据可视化 前端开发
【Python机器学习专栏】机器学习模型评估的实用方法
【4月更文挑战第30天】本文介绍了机器学习模型评估的关键方法,包括评估指标(如准确率、精确率、召回率、F1分数、MSE、RMSE、MAE及ROC曲线)和交叉验证技术(如K折交叉验证、留一交叉验证、自助法)。混淆矩阵提供了一种可视化分类模型性能的方式,而Python的scikit-learn库则方便实现这些评估。选择适合的指标和验证方法能有效优化模型性能。
|
2天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】机器学习中的模型融合技术
【4月更文挑战第30天】模型融合,即集成学习,通过结合多个模型提升预测性能。常见方法包括:Bagging(如Random Forest)、Boosting(如AdaBoost、XGBoost)和Stacking。Python中可使用`scikit-learn`实现,例如BaggingClassifier示例。模型融合是机器学习中的强大工具,能提高整体性能并适应复杂问题。
|
2天前
|
机器学习/深度学习 Python
【Python 机器学习专栏】模型选择中的交叉验证与网格搜索
【4月更文挑战第30天】交叉验证和网格搜索是机器学习中优化模型的关键技术。交叉验证通过划分数据集进行多次评估,如K折和留一法,确保模型性能的稳定性。网格搜索遍历预定义参数组合,寻找最佳参数设置。两者结合能全面评估模型并避免过拟合。Python中可使用`sklearn`库实现这一过程,但需注意计算成本、过拟合风险及数据适应性。理解并熟练应用这些方法能提升模型性能和泛化能力。
|
2天前
|
机器学习/深度学习 数据可视化 TensorFlow
【Python 机器学习专栏】使用 TensorFlow 构建深度学习模型
【4月更文挑战第30天】本文介绍了如何使用 TensorFlow 构建深度学习模型。TensorFlow 是谷歌的开源深度学习框架,具备强大计算能力和灵活编程接口。构建模型涉及数据准备、模型定义、选择损失函数和优化器、训练、评估及模型保存部署。文中以全连接神经网络为例,展示了从数据预处理到模型训练和评估的完整流程。此外,还提到了 TensorFlow 的自动微分、模型可视化和分布式训练等高级特性。通过本文,读者可掌握 TensorFlow 基本用法,为构建高效深度学习模型打下基础。
|
2天前
|
机器学习/深度学习 算法 数据挖掘
【Python 机器学习专栏】Python 中的线性回归模型详解
【4月更文挑战第30天】本文介绍了Python中的线性回归模型,包括基本原理、实现步骤和应用。线性回归假设因变量与自变量间存在线性关系,通过建立数学模型进行预测。实现过程涉及数据准备、模型构建、参数估计、评估和预测。常用的Python库有Scikit-learn和Statsmodels。线性回归简单易懂,广泛应用,但对异常值敏感且假设线性关系。其扩展形式如多元线性、多项式回归和正则化方法能适应不同场景。理解并运用线性回归有助于数据分析和预测。