社区所有版块导航
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学习  »  机器学习算法

一文讲解各种机器学习算法选型思路

happy科研 • 3 年前 • 342 次点击  

前言


这是知乎上一个问题:k近邻、贝叶斯、决策树、svm、逻辑斯蒂回归和最大熵模型、隐马尔科夫、条件随机场、adaboost、em 这些在一般工作中分别用到的频率多大?一般用途是什么?需要注意什么?


这个问题有1.3万关注50个回答,我知乎账号解封还有几个小时,先写在公众号上,正好前面写过两个问题,很多思路都是一致的,今天当个缝合怪,这个系列就完整了。


可能是全网写特征工程最通透的...

为什么GBDT可以超越深度学习


引入


时间来到了2021年,神经网络从没人考虑,到现在已经开始独领风骚,各个领域,各个场景,NN都变得不可或缺。


我们把这一些算法分分类,大体可以分为有监督和无监督。大部分回答也是集中在有监督的选型上,无监督确实在实际工作应用中,因为各种问题没有像有监督那样好施展拳脚。


我们抛开他们复杂的外衣,抽丝剥茧,找到他们应用的关键差异吧。没有最牛的算法,只有最合适的场景。


我还是出那道最经典的题目吧。


题目:请使用一个逻辑回归的模型,建模一个身材分类器,身材分偏胖和偏瘦两种,输入的特征有身高和体重。


数据集大概长这样:


我们从逻辑回归开始讲起,顺便引入一个贯穿全文非常关键的概念,非线性。


LR


逻辑回归解决的方法就是我拍两个系数加权,使用 sigmoid(ax+by+c)就搞定了。LR建模的过程,就是学习到a b c 三个参数的过程


LR在早期工业界,有着举足轻重的地位,你可能听说过凤巢上亿特征解决个性化广告的传说。


那大概是LR这辈子的高光时刻吧。他就是搞了上亿个这样的参数,然后算了个加权求和,通过sigmoid转化为概率。看起来这个模型,有多少人力,就有多少智能,非常接近人工智能的本质了,我只要能把特征搞出来,权重算出来,那问题不就迎刃而解了吗?


事实上,我们很难单纯地从身高和体重决策出一个人的身材,你说姚明体重280斤,他真的一定就胖吗??别忘了他身高有226公分的。


这组数据可能超出了你的认知,只看数据不看照片,一下子不好说他是胖还是瘦。(其实挺胖的哈哈)


嗯,这个你看到那组数据,不好一下子说出来的感觉,就是机器学习里面非常关键的概念,“非线性”。


这个问题不是那么好“线性“解决的,线性解决的意思就是我拍两个系数加权在原始特征x和y上,使用 sigmoid(ax+by+c)就搞定了。


解决的方法有两个:


1.升级模型,把线性的逻辑回归加上kernel来增加非线性的能力。我们使用这个模型  sigmoid(ax+by+kx*y^(-2)+c),这个模型通过多项式核方法的升级,解决了低维空间线性模型不太好解决的问题。


2.特征工程,掏出体检报告上的BMI指数,BMI=体重/(身高^2)。这样,通过BMI指数,就能非常显然地帮助我们,刻画一个人身材如何。甚至,你可以抛弃原始的体重和身高数据。


类似的问题还有朴素贝叶斯和SVM。


贝叶斯


大家接触朴素贝叶斯估计都是从文本分类的任务开始的。教科书上非常常讲的垃圾邮件分类例子。


朴素贝叶斯作为经典的统计机器学习方法,根正苗红的贝叶斯原理的应用,是最最直观,最最朴素和最最快的算法。


还是用我上面讲的例子,朴素贝叶斯解决这个问题怎么做的呢?


我只需要算一个这样的贝叶斯公式就好了

p(类别|特征) = p(特征|类别)*p(类别)/p(特征)

特征就是身高、体重,类别就是身材。


最后三项,对应着用身高体重身材的等维度的统计概率,都是可以在数据集中统计出来的,贝叶斯模型训练的过程,就是算这些各种形式概率表达式的过程。这样,我就把预测变成了查表连乘的过程,查表是计算机中最快的操作,意味着他也是推断最快的模型。


朴素贝叶斯假设各特征之间的条件独立性,即

p(身高、体重|身材) = p(身高|身材)*p(体重|身材)

也由于他的过度简化,导致它几乎只在特定场景应用了,比如特别简单的文本分类就比较适合朴素贝叶斯。


SVM



支持向量机也是线性的模型。

SVM应该是学术界非常喜欢的模型,他有着分类器最美好的愿望,在特征空间里画一个平面,把样本点划分开,这个模型算是把可视化角度可解释性拉满了。


往往事与愿违,很多并不是线性可分的,你没办法简单的画一个超平面。你需要画一个很曲折的东西,才能把他们分好。


回到刚才的身材分类器的例子上,如果你没有BMI指数,和有BMI指数,SVM的超平面截然不同。

有BMI指数的话,我在一维度坐标轴上画一个点就能解决。

要是没有BMI指数的话。你也只能像LR那样,通过核方法来解决了。在方式一我们使用了核方法给这些模型升维,方式二使用了特征方法。


要知道天下没有免费的午餐,在你使用核方法升维的时候,实际很难精炼出恰好是x*y^(-2)这样的多项式表达,你肯定是一股脑地把x*y,x^2*y, x*y^2 这些项都扔进去了。

决策树



这么暴力的操作,有两个问题,一是共线性,二是噪声。


第一、共线性的意思是几个项表达的含义是趋同的,保持了很强的线性关系,对于逻辑回归是致命的问题,因为他带来了权重的不稳定,要知道逻辑回归权重可是暗示了特征重要性的。还会破坏朴素贝叶斯的基本假设。这些都是有副作用的。


(要是你对这段话,不好理解的话,仔细学习下逻辑回归模型和共线性的理论,此处不单独展开)


第二、噪声让你的分类器学习到了一些不好的东西,对你的决策没有产生泛化的贡献,反而带跑偏你的模型,学习到了一些不是知识的边边角角。


而有一些模型,他们天然可以解决这些问题。

典型的就像决策树和神经网络。


决策树的优点


1.天然的鲁棒性,能自动从异常点,缺失值学到信息。不需要归一化。直接上手一把梭哈。


2.树可以半自动化地完成一些特征非线性表达的工作,而且基于贪心切分+采样等抗过拟合手段,能比较好的挖掘数据的非线性。


3.树的可解释性很好,能生产特征重要性,帮助你理解数据,改善特征工程。一个经典的套路是思考topN特征背后的逻辑,并围绕他们进行特征工程。


神经网络


NN模型也有一些天然的优点:


1.全自动化的特征工程和登峰造极的非线性表达能力,在数据表征范式统一,语义含义统一的稠密数据上(典型文本图像)上,NN一个打十个。另外,典型的像ID序列这种,人很难做出花来。也就是Bag of words或者借用embedding表达一下,还有一半是NN的功劳。


2.NN模型容量极大,在数据量的加持上,放大了1的优势。


但是看起来树模型的优点在其他模型也有,他们跟SVM和LR这些模型比又有啥区别呢?


1.第一,这些模型获取非线性的方式太粗暴了,有种大炮打蚊子的感觉。依靠kernel强行把VC维提高,带来的噪声特别多,有用信息很少。第二,kernal是有先验的,很容易被人设的参数带跑偏。这在实际业务数据中是非常致命的。


2.理论上LR+完美的特征工程可以很强,但是太难了,又不是人人都是特征工程大师。早期凤巢亿级特征跑LR效果特别好逐渐成为传说。


给你们整个表吧


优势劣势
LR等

速度极快,可解释性普遍很高。

无非线性,依赖kernel,

人工特征工程。

决策树1.鲁棒,异常点,缺失值都是可以学习的信息
2.适中的非线性能力,在一定范围内是优势3.可解释性很好,可以帮你优化特征工程
1.非线性表达能力有限,很难在文本图像上有用。
2.数据量带来的边际增益不大,容易触及天花板。
NN1.全自动化的特征工程
2.模型容量大,可以利用数据量的优势
1.异常值敏感,依赖手动处理
2.不可解释,改进迭代的措施和结果的路径太远。3.过强的非线性中隐含过拟合和噪音。



横向对比


我把之前用过的图再改进一下。

这个图表达意思是,y轴是人的认知可解程度,对应着就是特征工程的难度和可行性。x轴是数据的非线性


经常调侃的人工智能,就是有多少人工,就有多少智能,就是线性模型因人工特征工程发挥的空间。随着数据非线性的提高,特征工程难度的增大,LR线性模型的用武之地就越来越小。反而逐渐决策树,神经网络等非线性模型开始大展身手。


回到问题,这些模型使用的频率,大概也和各自的图中面积差不多一致了。神经网络在工业界,已经占据了半边天,决策树占据了剩下的绝大部分,还有一点点场景,因为特殊性,仍旧用着LR等模型。



历史精彩文章:

【段子】让算法工程师崩溃的瞬间

【段子】如何激怒一位算法工程师

【段子】让算法工程师破防的瞬间



【技术】扎实入门机器学习的路子

【技术】可能是全网写特征工程最通透的...

【技术】一文串起从NLP到CV 预训练技术和范式演进

【技术】 工业界文本分类避坑指南

【技术】Kaggle进阶:显著提分trick之指标优化

【技术】从一道数学题面试题到GBDT原理的推导

【技术】所有数据集上给神经网络刷分的通用方法



【闲谈】工作后顶会重要吗?投入精力,结果...

【闲谈】回看互联网十年校招薪资变化,我发现...

【经验】面试官带你破解算法岗诸神黄昏,神挡杀神!

【经验】在读和转行进大厂做算法工程师的捷径

【闲谈】 从Zillow用AI指导买房投资血亏说起

【闲谈】如何看顶会论文上关于泄露的乌龙

【经验】 算法工程师的术与道:从特征工程谈数据敏感性




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/125775
 
342 次点击