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

时间:2022-03-29 13:50:26

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

前言

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

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

引入

时间来到了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.数据量带来的边际增益不大,容易触及天花板。
NN 1.全自动化的特征工程
2.模型容量大,可以利用数据量的优势
1.异常值敏感,依赖手动处理
2.不可解释,改进迭代的措施和结果的路径太远。3.过强的非线性中隐含过拟合和噪音。

横向对比

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

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

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

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

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

原文链接:https://mp.weixin.qq.com/s/HwsvxJSKaRuEFxnq6E9cnQ