社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

机器学习中的8种常见疏忽以及对应的认知偏差

混沌巡洋舰 • 6 年前 • 680 次点击  

随着机器学习工具的“傻瓜化”,越来越多的人在标准数据集上训练出了效果还不错的分类器,但这并不意味着到了真实的应用场景下,可以从头到尾做完一个项目,真实的环境中会出现数据太小,数据的特征不明晰,以及大量的缺失值等很多在标准数据集下预先不到的问题。针对具体的项目,需要了解行业的背景知识,和本领域的专家当面聊,从而有针对性的做出调整。但总有一些共通的要避免的坑,而这些坑则和我们个人的认知偏差也是有对应关系的。(本文主要针对监督学习)


1 采样偏差

要做训练,先要有训练数据。而数据集的选择中,如果取样有偏,那就会导致你训练出的模型到了真实的环境中无法泛化。比如你的观测仪器会不会本身没有校准,你判定是否为合适样本的规则是否会带来某类数据无法被采用。你可以通过检查你数据的分布,是否符合预期即实际情况,来判定是否采样有偏。但做项目之前,首先要对什么是理想的数据集要有一个清晰准确全面的定义,不然即使你以为你是随机的选取数据,你也无法避免采样偏差。


采样偏差来自于我们大脑与生俱来的选择性偏差(Selection Bias),比如你会表现的比实际情况展示的更加乐观,你会忽略那些和你观点不一致的证据等。在日常生活中,你无法预先设定什么是理想的数据集,因此要维护Ta发声的权利。


2引入无关的特征

特征并非是越多越好,在训练数据不足的时候,引入过多无关的特征,只会导致模型过拟合。你可以根据实际问题,选择你认为相关的特征;也可以使用特征选择,选取那些对模型预测贡献度大的特征;还可以使用PCA进行数据降维,使用降维后的数据做为特征。在日常生活中,当你过分关注细节,而缺少大局观时,你就被无关的特征干扰了;自闭症可以看成是一种极端情况,大脑选取了过多的细节,最终导致其无法做出有用的预测。而面对决策时的拖延和犹豫不决,也是大脑中了收集更多无关特征的毒。而特征选择中的方法,也可以借用到生活中,比如你选择是否接受一个工作时,可以列出这项工作的优缺点,再进行比较,但在此之前,你需要先筛选一下你列出的优缺点是否对你的成长与幸福有关系,然后去掉那些关系不大的项。


3 数据泄漏

如果你在预测是时候,选取的特征包含了待预测标签的变种,例如你的目的是预测一个人是否感冒,然后你选取的特征中包含Ta是否正在吃感冒药,那你的预测模型结果会出乎意料的好,但这样的模型在实际中是没用的。在特征选择时,要避免那些能够直接导出待预测标签的特征。现实生活中的数据泄露对应的是因果倒置。


4 错误的补全缺少的数据项

当数据项存在缺失时,常见的方式是用平均值去补齐,或者填入某一个和已有数据相近的随机值。但如果出现数据项缺失的原因并非是随机出现的,这样做就会带来问题。例如如果在数据的持续记录过程中,有些参与者会退出实验(比如医疗数据中患者死亡),从而造成数据项的缺失。这时就不应该使用缺失值补齐或数据插值。而应该选取那些能够包容缺失值的算法。或者将对包含缺失的及不包含缺失的数据分别训练一个分类器。日常生活中,当我们面对缺失的数据时,想当然的补上一个我们最常看见的值,这样大多数还不如补上平均值。


5 忽略对数据进行正则化

有些模型,例如KNN或支持向量机,对于极端的数据点十分敏感,如果使用原始数据来处理,那么模型关注的就只是那些包含极端大值的特征,但这些特征并不是对预测最有效的,在真实情况下,极端的值不一定会出现,从而影响模型的泛化能力。为此要将数据进行正则化,使其具有相同的方差和均值。日常生活里,我们也容易被极端值迷惑,比如飞机明明是最安全的交通方式,但由于飞机失事后的影响很大,导致人们高估的飞行的危险,因此你要做的是将全部数据拿出来,统一来看,而不是只关注一个数据点。


6 忽略离群点

在清洗数据时,你会发现有极少数数据点很反常,这时你会想将这些离群点拿掉,应该不会有多少影响。这时你要注意的是分析数据点离群的原因,是由于测量仪器的bug,导致了出现了明显不可能出现的情况,还是这些数据就可能会有一些离群点。如果是前者,那离群点应该去掉,但如果是后者,那在训练数据集中去掉离群点,训练出的模型到了包含离群点的真实数据中,还是会难以泛化的。不同的模型对于离群点的容忍程度也是不同的,adaBoost会对离群点给予超高的权重,而决策树对是否包含离群点则不那么在乎,因此当你无法确定为何会出现离群点时,要选择那些对离群点更容忍的分类器。日常生活中,我们总会遇到那些特立独群的人,听到那些离经叛道的观点,这时我们该不该选择性的忽略,需要你来判断这个离群点到底是因何而生,完全的包容或排斥非主流的观点,都不是应选择的道路,你要做的除了甄别异想天开的背后是否有证据支持,还要让自己的价值观不那么容易被极端观点说左右。


7 忽略特征间的多重共线性

如果训练数据中的特征存在多重共线性,例如特征A和特征B与C相关,特征B又与特征C,D和E相关,那么一个值的细微变化,就会导致众多特征的变化,从而使得训练数据中的由测量不准确带来误差被指数级的放大,从而使得模型变得对误差敏感,从而影响泛化能力。为此要检查训练数据的特征间是否俩俩存在着相关性,如果存在严重的多重共线性,要去除那些冗余的特征,或者将相关的特征组合起来,作为一个特征来分类。日常生活中的多重共线性是人群中的人云亦云,你以为你是听从多数的意见,但如果你听到的信息追诉起来是来自一个人,那这个信息就不应该被当成是群体智慧。


8 选择了错误的评价指标

对于分类器,评价的指标有很多,常见的例如查全(recall),查准(precision)已经ROC,F1等。但对于具体的应用场景,应该选择不同的评价指标,有时假阳性是不可容忍的,有时则是一定要保证假阴性足够的低。如果你没有选择适合应用场景的评价指标,训练好的模型也会由于缺少优化目标,而无法实用化。而日常生活中,在不同的阶段,就该有不同的奋斗目标,不然你将无法确定自己是否成功。


总结一下,本文总结了8种监督学习者的常见疏忽及解决方法,针对每种,引申了其在日常生活中对应的认知偏差,供读者自查自勉。这8种疏忽分别是:

1 采样偏差

2引入无关的特征

3 数据泄漏

4 错误的补全缺少的数据项

5 忽略对数据进行正则化

6 忽略离群点

7 忽略特征间的多重共线性

8 选择了错误的评价指标


更多阅读

机器学习高维数据分析中那些一定可以避开的坑!


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/R4lCgiTS99
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/28535
 
680 次点击