实践中学到的最重要的机器学习经验!

文 | 微调
源 | 知乎问答

今天我们讨论一个很有实际意义的问题:你在实践中学到的最重要的机器学习经验是什么?以下回答来自知乎优秀答主微调。

1.永远保持怀疑

机器学习是最容易得到错误结论的一种解决方案。和编程、做表格、或者纯粹的数学建模不同,机器学习是由数据驱动,并有很强的黑箱性。因此很多时候容易得出似是而非的结论。举个最简单的例子:伪相关/虚假相关(spurious correlation),两个变量很容易看起来有很强的相关(参看图1和2),然而这仅仅是偶然。因此当机器学习模型很轻松就达到很好的效果时,比如百分之百的正确率,你要警惕。除了过拟合以外,你很有可能包含了某个不该使用的强特征,甚至把标签y也当做特征使用了。

▲图1. 奶酪消耗量与被死于床单(交缠)之间的关联性 [1]
▲图2. 非商业性空间飞船发射数量与社会学博士毕业数量之间的关系 [1]

2.寻找“最小预测单元”,避免追求通过一个模型预测多个目标

最清晰易懂,且容易证明正误的模型就是目标明确的模型。我们得知业务需求以后,尽量把预测范围控制好,不要被同时实现多个目标所诱惑。

举例,如果客户的需要是预测明天的天气,那就做一个纯粹的天气预测模型,不要瞻前顾后的想要同时预测湿度、温度等相关但不是根本的问题。你想要通过单个模型得到的结论越多,往往建模和调参就越复杂。从单一问题入手,再逐步扩展,甚至将知识迁移,都是可以的。

3.简单有效的模型最好,不要完全弃用“人为规则”

首先不要为了使用模型而创造问题:机器学习的目标是解决问题。因此,从简单到复杂模型的“进化”才是比较合理的方案。比如如果能用监督,就监督学习。退而求其次才选择半监督或者无监督。

另一个经验是,如果一个问题有现成的规则,不要完全弃用,也不要追求用机器学习模型彻底替代规则。可以从半自动模型到自动模型进行“升级“,这可以理解为迭代过程。比如在机器学习模型不成熟、数据量不够的时候,仅当模型评分高且符合人为规则时才使用其预测结果,置信度低的预测结果依然使用规则预测或者人为验证。等到数据量和数据质量上去了,再逐步替换或者舍弃人为规则。

升级进化是锦上添花,不是雪中送炭。在商业上,我们告诉客户这叫做“混合系统”Hybrid System,但机器学习上这个叫“主动学习”(active learning)。

4.考虑的数据的依赖性(dependency)

数据往往有时序或者空间上的相关性。如果不考虑时空依赖性,问题往往会得到简化,但可能有严重偏差。如果需要考虑时间与空间上的依赖性,优先从简单的角度入手。

举个简单的例子,图2和图3中的数据如果不考虑时空依赖性,都会导致错误的理解。解决机器学习问题,如果在不确定数据的结构关系时,有限假设不存在依赖。如果效果不好,再换用更复杂的,可以处理依赖性的模型。

▲图3. O点在单独来看的情况下是正常点,但考虑到临近点后就是异常点 [2]
▲图4. 红色部分单独来看不是异常,但考虑到临近点的时间关系后就是异常点 [3]

5.从回归到分类、从全部数据到部分数据、从连续到离散

5.1. 在特定情况下,因为条件限制,我们的回归模型效果不好或者要求的精度比较低,可以把回归问题转化为分类问题。

▲图5. 将预测涨跌幅度转化为单纯预测“涨”和“跌”

5.2. 同理,如果数据的质量不连贯,我们可以大胆的抛弃掉一部分数据。比如下图中所描述的情况,抛弃掉一部分数据可以增强中间区段的模型拟合能力。当然,由精简数据后得到的模型不该被用于预测抛弃数据段。

▲图6. 去掉一部分数据后,模型拟合程度可能会大幅度提高 [4]

5.3. 如果需要,对于特征也可以做离散化。连续变量:变量在特定区间内有无限个可能取值,如股票的价格。离散变量:变量在特定区间内的可选取值有限,比如{红、蓝、黄}三种颜色。从数学角度看,连续变量往往可以被离散化,从而转为离散变量。这种转化可以依赖于固定区间,或者固定密度,甚至是变化的条件。将连续变量离散化适合广义线性模型,如逻辑回归,而不适合树模型或者神经网络。连续特征离散化的优点:

  • 降低噪音对模型的干扰,提高鲁棒性。假设一个特征的正常范围是[0,1],那么明显异常的值,如100,不会造成大的扰动

  • 在特征离散化以后,模型过拟合的风险一定程度上也得到了降低

  • 一般经过转化后,编码可以使用独热编码(one-hot encoding),得到一个稀疏的表示,方便进行矩阵计算

此处的重点是:部分价值 >>毫无价值。将预测范围缩小后,预测效果往往能有大幅度的提高。将数据分割后单独处理,预测效果往往也有提升。而数据离散化可以有效的提高某些模型的能力。

6. 数据比模型更重要,但数据不是越多越好

机器学习模型的表现高度依赖于数据量 [6],选择对的模型至少其次,巧妇难为无米之炊。数据重要性 >> 模型重要性

但数据不是越多越好,随机数据中也可能因为巧合而存在某种关联。就像上文中提到的虚假相关的例子。Freedman在1989年做过的模拟实验 [5]中发现,即使数据全是由噪音构成,在适当的处理后,也能发现数据中显著的相关性:

  • 6个特征显著

  • 对回归的做F-test的P值远小于0.05,即回归存在统计学意义

以此为例,统计学检验显著不代表模型真的有意义。一般来说,需要先确认数据的来源性,其次要确认显著的特征是否正常,最后需要反复试验来验证。最重要的是,要依据人为经验选取可能有关的数据,这建立在对问题的深入理解上。

7. 模型选择、评估与调试

模型选择是建立在对于问题的理解上,一般是启发式(heuristic),也就是基于经验所确定的。

  • 优先选取符合问题假设的模型。如朴素贝叶斯假设特征间的独立同分布,而逻辑回归就没有这么强的假设

  • 优先选取简单模型,循序渐进

  • 优先选取对于数据预处理要求低的模型,如可以处理缺失值,不需要进行数值化转化的模型。比如xgboost或者lightbgm等

  • 用迭代的思路选择模型,先选择大方向,再微调。在模型选择时可以使用工具包的默认值,确定了大概模型后再进行参数调整

同时,评估模型时,每次仅选择一个标准,比如召回率、ROC或者准确度,同时优化多个目标是很复杂的:

  1. 可以用可视化来直观对比算法间的优劣

  2. 控制模型中的随机性,保证评估有意义,如选用固定的参数(如 random_state=42)

  3. 用相同的数据集来训练、测试不同的模型

  4. 善用交叉验证,尤其当数据集较小的时候

  5. 如果有必要,也可以使用统计学检验

除此之外,还需要考虑到运算开销的问题。训练不同的模型运算开销差别很大,要根据资源和时间决定。在资源有限的前提下,可以选择模型表现相对较差但运算开销小的方法。

8. 总结出一套适合自己的“套路”

开始一个机器学习项目以前,值得思考几个“小问题”:

  1. 确定要预测的目标,找到项目痛点,不追求同时预测多个目标

  2. 确定解决问题的框架,优先使用监督学习,用无监督发掘新思路

  3. 结合已有的规则,尝试融合机器学习模型和人为规则

  4. 如果可能,优先尝试分类任务,也可以尝试将回归转为分类

  5. 从易到难,确定尝试哪些机器学习模型

  6. 要解决的问题是否对于“时空”存在依赖性,如果可以回避依赖性,可以先试试简单模型

  7. 如果发现使用全部数据效果不好,可以尝试抛弃部分数据或分段处理

在做数据工程时,应该考虑到的一些问题:

  1. 数据并非越多越好,多余的无关特征会因为伪相关、巧合而影响模型

  2. 对数据做相关性分析的时候,善用可视化可以一目了然的发现问题

  3. 对于高度相关的特征,移除或者合并前要三思,可能并不会提高模型能力

  4. 如果选用了线性模型,可能需要对特征进行离散化

  5. 对于大部分模型来说,归一化或者标准化是必不可少的步骤,至少“无害”

  6. 如果问题较为复杂,尽量选择非线性的鲁棒性强的模型:

在模型选择与评估时,考虑到一些问题:

  1. 根据要解决的问题和对数据的理解,大致决定出模型的搜索范围,如尝试SVM,逻辑回归,随机森林,xgboost。如资源允许,可扩大模型候选名单

  2. 根据要解决的问题和对数据的理解,决定模型的评估标准。虽然我们建议选择单一的评估标准进行对比,但推荐计算所有可能的评估标准

  3. 根据具体问题中的数据量大小,以及模型稳定性,决定是否使用交叉验证

  4. 结合参数搜索、交叉验证方法,通过选定的评估标准从候选模型中找到表现最好的模型

  5. 对上一步中的所选模型进行微调

  6. 迭代以上步骤直到找到最优的模型

还有很多摔过的坑,吃过的苦,有限于篇幅就不展开了。如果只允许我说一条我学到的最重要的经验,那一定是:保持独立思考的能力,不要别人说什么/书上说什么/论文里写什么,你就相信什么。毕竟在机器学习的世界里,我们每个人都是“民科”:)

来源:知乎问答https://www.zhihu.com/question/46301335/answer/317361262

后台回复关键词【入群

加入卖萌屋NLP/IR/Rec与求职讨论群

后台回复关键词【顶会

获取ACL、CIKM等各大顶会论文集!

 

[1]http://tylervigen.com/spurious-correlations

[2]Mira, A., Bhattacharyya, D.K. and Saharia, S., 2012. RODHA: robust outlier detection using hybrid approach. American Journal of Intelligent Systems, 2(5), pp.129-140.

[3]http://researchmining.blogspot.ca/2012/10/types-of-outliers.html

[4]支持向量机-从入门到放弃(https://zhuanlan.zhihu.com/p/30596284)

[5]Freedman, L.S. and Pee, D., 1989. Return to a note on screening regression equations. The American Statistician, 43(4), pp.279-282.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android官方开发文档Training系列课程中文版:管理Activity的生命周期之暂停和恢复Activity

原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/pausing.html 在APP的正常使用过程中,在前台工作的Activity有时可能会被其他的可视化组件挡住,而引起Activity进入Paused状态。举个例子,当一个半透明的Activit…

Leaf:美团分布式ID生成服务开源

Leaf是美团基础研发平台推出的一个分布式ID生成服务,名字取自德国哲学家、数学家莱布尼茨的一句话:“There are no two identical leaves in the world.”Leaf具备高可靠、低延迟、全局唯一等特点。目前已经广泛应用于美团金融、美团外卖、美团酒旅等多个…

LeetCode 658. 找到 K 个最接近的元素(二分查找)

1. 题目 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。 示例 1:输入: [1,2,3,4,…

负数的开方到底等于多少?

文:杨树森知乎编:小鹿鹿lulu负数的开方到底等于多少?举个栗子拿出小本本, 一通变换,得到:Really? 且看下面详解乘方来源于乘法,我们可以归纳地定义,设 是一个域,, 则上述的域 可以是有理数域 , 实数域, 或复数域 前两…

综述 | 知识图谱实体链接:一份“由浅入深”的综述

本文转载自公众号:PaperWeekly。 作者丨Nicolas单位丨追一科技 AI Lab 研究员研究方向丨信息抽取、机器阅读理解本文介绍实体链接(Entity Linking)这一技术方向&#xff0…

Android官方开发文档Training系列课程中文版:管理Activity的生命周期之停止和重启Activity

原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/stopping.html#Start 在activity的生命周期内,适当的停止和重新启动activity是一个非常重要的过程,它可以确保用户能感觉到APP一直是存活状态,并且不会丢失他们…

selenium.common.exceptions.WebDriverException: Message: ‘chromedriver’解决

selenium.common.exceptions.WebDriverException: Message: chromedriver’解决: https://blog.csdn.net/weixin_44318830/article/details/103339273 今天在做selenium测试的时候,可能是很久没用了,直接报了这个异常! 相信很多第一次学习selenium的同学们也对这个异…

活动 Web 页面人机识别验证的探索与实践

在电商行业,线上的营销活动特别多。在移动互联网时代,一般为了活动的快速上线和内容的即时更新,大部分的业务场景仍然通过 Web 页面来承载。但由于 Web 页面天生“环境透明”,相较于移动客户端页面在安全性上存在更大的挑战。本文…

利用python提取网站曲线图数据

文章目录数据1数据2数据1 数据目标:曲线图 F12,如图位置输入JSON.stringify(dataSeries.dataPoints) copy,粘贴到data.txt 数据是一个列表,里面是多个字典 编写程序如下: import json as js datafile data1.txt…

论文浅尝 | HEAD-QA: 一个面向复杂推理的医疗保健数据集

论文笔记整理:谭亦鸣,东南大学博士生,研究方向为知识库问答。来源:ACL2019本文构建了一个面向复杂推理任务的多选问答数据集 HEAD-QA,该数据集中的问题来自一个西班牙的医疗保健专业测试,对于具备该方向专业…

Poor Man's BERT: 更小更快的Transformer模型

文 | sliderSun源 | 知乎NLP模型的大小不断增加,随之而来的是可用性降低,TinyBERT,MobileBERT,和DistilBERT都提出了一个独特的知识蒸馏框架,其共同目标是在保持性能的同时减小模型大小。尽管所有这些方法都以各自的方…

LeetCode 429. N叉树的层序遍历(queue)

1. 题目 返回其层序遍历:[[1],[3,2,4],[5,6] ]2. 解题 queue队列解题 /* // Definition for a Node. class Node { public:int val;vector<Node*> children;Node() {}Node(int _val, vector<Node*> _children) {val _val;children _children;} }; */ class Solu…

Android官方开发文档Training系列课程中文版:管理Activity的生命周期之Activity的重建

原文地址&#xff1a;http://android.xsoftlab.net/training/basics/activity-lifecycle/recreating.html#RestoreState 有这么几个关于activity通过正常渠道销毁的场景&#xff0c;比如用户按下了返回按钮&#xff0c;又或者是在activity中调用了终止信号finish。系统可能也会…

Java动态追踪技术探究

引子 在遥远的希艾斯星球爪哇国塞沃城中&#xff0c;两名年轻的程序员正在为一件事情苦恼&#xff0c;程序出问题了&#xff0c;一时看不出问题出在哪里&#xff0c;于是有了以下对话&#xff1a; “Debug一下吧。” “线上机器&#xff0c;没开Debug端口。” “看日志&#xf…

论文浅尝 | 从树结构的长短期记忆网络改进语义表示

论文笔记整理&#xff1a;窦春柳&#xff0c;天津大学硕士&#xff0c;方向&#xff1a;自然语言处理链接&#xff1a;https://arxiv.org/pdf/1503.00075.pdf动机由于长短期记忆网络&#xff08;LSTM&#xff09;这种具有复杂单元的循环神经网络具有良好的表示序列信息的能力&a…

详解NLP技术中的:预训练模型、图神经网络、模型压缩、知识图谱

NLP近几年非常火&#xff0c;且发展特别快。像BERT、GPT-3、图神经网络、知识图谱等技术应运而生。我们正处在信息爆炸的时代、面对每天铺天盖地的网络资源和论文、很多时候我们面临的问题并不是缺资源&#xff0c;而是找准资源并高效学习。但很多时候你会发现&#xff0c;花费…

根因分析初探:一种报警聚类算法在业务系统的落地实施

背景 众所周知&#xff0c;日志是记录应用程序运行状态的一种重要工具&#xff0c;在业务服务中&#xff0c;日志更是十分重要。通常情况下&#xff0c;日志主要是记录关键执行点、程序执行错误时的现场信息等。系统出现故障时&#xff0c;运维人员一般先查看错误日志&#xff…

论文浅尝 | BAG:面向多跳推理问答得双向 Attention 实体图卷积网络

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生&#xff0c;研究兴趣&#xff1a;知识图谱问答来源&#xff1a;NAACL 2019链接&#xff1a;https://www.aclweb.org/anthology/N19-1032/实现多跳推理问答需要模型能够充分理解文本和 query 之间的关系&#xff0c;本…

Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之构建灵活的UI

原文地址&#xff1a;http://android.xsoftlab.net/training/basics/fragments/fragment-ui.html 当设计应用程序时需要支持尺寸较大的宽屏设备时&#xff0c;可以基于可用的屏幕空间在不同的布局中配置并重新使用fragment来提升用户体验。 举个例子&#xff0c;手持设备在同…

LeetCode 669. 修剪二叉搜索树

1. 题目 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点&#xff0c;所以结果应当返回修剪好的二叉搜索树的新的根节点。 来源&#xff1a;力扣&#xff08…