【机器学习算法】10种常见机器学习算法
【机器学习算法】10种常见机器学习算法
一般来说,机器学习主要有三种算法:
1. 监督式学习 — 训练要指定输出标签
监督式学习算法包括一个目标变量(因变量)和用来预测目标变量的预测变量(自变量)。通过这些变量我们可以搭建一个模型,从而对于一个已知的预测变量值,我们可以得到对应的目标变量值。重复训练这个模型,直到它能在训练数据集上达到预定的准确度。
监督式学习是一种机器学习的方法,其中模型从标记的训练数据中学习输入和输出之间的映射关系。在监督式学习中,训练数据包括输入数据和对应的输出标签,模型通过学习这些数据来预测新的、之前未见过的数据。
属于监督式学习的算法有:支持向量机(SVM),回归模型,决策树,随机森林,K邻近算法,逻辑回归等。这种方法通常用于分类和回归问题。
2. 无监督式学习 — 数据不标记
与监督式学习不同的是,无监督学习中我们没有需要预测或估计的目标变量。无监督式学习是用来对总体对象进行分类的。它在根据某一指标将客户分类上有广泛应用。
无监督式学习是一种机器学习的方法,其中模型从未标记的数据中学习模式和结构,而无需指定输出标签。在无监督式学习中,算法试图发现数据中的隐藏结构或模式,以便对数据进行分类、聚类或降维等操作。
属于无监督式学习的算法有:关联规则,K-means聚类算法,主成分分析(PCA)等。这种方法通常用于发现数据中的潜在模式和关系,而无需预先标记的输出。
3. 强化学习 — 智能体与环境互动
这个算法可以训练程序做出某一决定。程序在某一情况下尝试所有的可能行动,记录不同行动的结果并试着找出最好的一次尝试来做决定。
强化学习是一种机器学习方法,其目标是让智能体在与环境互动的过程中学习如何做出决策,以使得长期收益最大化。在强化学习中,智能体通过尝试不同的行为,并观察环境对其行为的反馈来学习。这种学习方式类似于试错的过程,通过与环境的交互,智能体逐渐学会采取哪些行动以获得最大的奖励。
强化学习通常涉及定义一个奖励信号,以便智能体可以根据其行为的好坏进行学习。常见的强化学习算法包括马尔可夫决策过程、Q学习、深度强化学习(DRL)等。强化学习在许多领域都有应用,如机器人控制、游戏策略、金融交易等。
常见的机器学习算法
以下是最常用的机器学习算法,大部分数据问题都可以通过它们解决:
1.线性回归 (Linear Regression)
定义:y=ax+b
线性回归是利用连续性变量来估计实际数值(例如房价,呼叫次数和总销售额等)。我们通过线性回归算法找出自变量和因变量间的最佳线性关系,图形上可以确定一条最佳直线。这条最佳直线就是回归线。这个回归关系可以用Y=aX+b 表示。
我们可以假想一个场景来理解线性回归。比如你让一个五年级的孩子在不问同学具体体重多少的情况下,把班上的同学按照体重从轻到重排队。这个孩子会怎么做呢?他有可能会通过观察大家的身高和体格来排队。这就是线性回归!这个孩子其实是认为身高和体格与人的体重有某种相关。而这个关系就像是前一段的Y和X的关系。
在Y=aX+b这个公式里:
1 |
|
求a和b:最小二乘法
a和b可以通过最小化因变量误差的平方和得到(最小二乘法)。
我们可以使用最小二乘法来估计参数 a 和 b。具体步骤如下:
- 计算每个样本点到直线的垂直距离,即残差,表示为 e
i= yi- (axi+ b),其中 (xi, yi) 为第 i 个样本点的坐标。- 我们的目标是最小化所有残差的平方和,即最小化 S = Σ(e
i^2^),其中 i 从 1 到 n,n 为样本点数。- 为了找到最小化 S 的参数 a 和 b,我们对 S 分别关于 a 和 b 求导,然后令导数等于 0,从而得到关于 a 和 b 的方程组。
- 解这个方程组,即可得到最优的参数估计值 a 和 b,使得线性回归模型 y = ax + b 最优地拟合了观测数据。
这样得到的参数估计值 a 和 b,就是使得模型与观测数据拟合最好的直线的斜率和截距。
示例
下图中我们得到的线性回归方程是 y=0.2811X+13.9。通过这个方程,我们可以根据一个人的身高得到他的体重信息。
根据自变量个数分为:一元 / 多元
线性回归主要有两种:一元线性回归和多元线性回归。
一元线性回归只有一个自变量,而多元线性回归有多个自变量。
拟合多元线性回归的时候,可以利用多项式回归(Polynomial Regression)或**曲线回归 (Curvilinear Regression)**。
- 多项式回归:多项式回归是一种线性回归的扩展,通过引入自变量的高次项来拟合非线性关系。例如,对于一个简单的二次多项式回归模型 y = a0 + a1x + a2x^2^,这样的模型可以拟合出曲线关系。通过选择合适的多项式次数,可以更好地拟合数据,并捕捉到数据中的非线性关系。
- 曲线回归:曲线回归是一种更加灵活的回归方法,可以拟合各种形状的曲线,而不局限于多项式的形式。曲线回归可以采用不同的函数形式,比如指数函数、对数函数、幂函数等,来拟合数据中的非线性关系。通过选择适当的函数形式,曲线回归可以更好地拟合具有复杂形态的数据。
python代码
1 |
|
2.逻辑回归 (Logistic Regression)
定义:是分类算法!预测概率值!
别被它的名字迷惑了,逻辑回归其实是一个分类算法而不是回归算法。通常是利用已知的自变量来预测一个离散型因变量的值(像二进制值0/1,是/否,真/假)。简单来说,它就是通过拟合一个逻辑函数(logit fuction)来预测一个事件发生的概率。所以它预测的是一个概率值,自然,它的输出值应该在0到1之间,表示样本属于某一类的概率。通常情况下,我们可以将输出值大于等于0.5的样本预测为正类(1),将输出值小于0.5的样本预测为负类(0)。
示例
同样,我们可以用一个例子来理解这个算法。
假设你的一个朋友让你回答一道题。可能的结果只有两种:你答对了或没有答对。为了研究你最擅长的题目领域,你做了各种领域的题目。那么这个研究的结果可能是这样的:如果是一道十年级的三角函数题,你有70%的可能性能解出它。但如果是一道五年级的历史题,你会的概率可能只有30%。逻辑回归就是给你这样的概率结果。
回到数学上,事件结果的胜算对数(log odds)可以用预测变量的线性组合来描述:
1 |
|
在这里,p 是我们感兴趣的事件出现的概率。它通过筛选出特定参数值使得观察到的样本值出现的概率最大化,来估计参数,而不是像普通回归那样最小化误差的平方和。logistic回归主要关注的是事件发生的概率,通过最大化观测样本的概率来确定参数,以便更好地预测事件的发生与否,而不是直接预测具体数值。这种方法对于处理二元分类问题非常有效。
python代码
1 |
|
优化
延伸:
以下是一些可以尝试的优化模型的方法:
加入交互项(interaction)
通过添加特征之间的交互项,可以捕获特征之间的复杂关系,从而提高模型的表现。例如,如果有两个特征 x1 和 x2,可以添加一个新的特征 x1*x2 作为交互项。
减少特征变量
通过特征选择技术,可以剔除对模型预测贡献较小的特征,从而简化模型并提高泛化能力。常用的特征选择方法包括方差选择、单变量特征选择、递归特征消除等。
正则化(regularization)
正则化通过在损失函数中加入惩罚项,可以有效控制模型的复杂度,防止过拟合。常见的正则化方法包括 L1 正则化(Lasso)和 L2 正则化(Ridge)。
使用非线性模型
对于非线性关系较为复杂的数据,可以尝试使用非线性模型,如支持向量机(SVM)、决策树、随机森林、神经网络等,以更好地拟合数据的非线性结构。
3.决策树 (Decision Tree)
定义
这是经常使用到的算法。它属于监督式学习,常用来解决分类问题。令人惊讶的是,它既可以运用于类别变量(categorical variables)也可以作用于连续变量。在决策树中,每个内部节点表示一个特征或属性上的测试,每个分支代表一个测试输出,每个叶节点代表一个类别标签(或者在回归任务中代表一个数值)。通过沿着从根节点到叶节点的路径进行测试,最终可以得出针对给定输入实例的预测结果。
常见的决策树算法包括:ID3、C4.5、CART(Classification And Regression Trees)等。在构建决策树时,算法会根据各种特征的信息增益(或其他指标)来选择合适的特征,并递归地划分数据集,直到达到停止条件为止(如节点包含的样本属于同一类别)。
示例
从上图中我们可以看出,总体人群最终在玩与否的事件上被分成了四个群组。而分组是依据一些特征变量实现的。用来分组的具体指标有很多,比如基尼系数(Gini)、信息增益(Information Gain)、卡方检验(Chi-square)、熵(Entropy)等。
基尼系数衡量了数据集的不纯度,信息增益衡量了使用某个特征进行分类后带来的纯度提升,卡方检验用于检测特征与类别之间的关联程度,熵衡量了信息的混乱程度。通过这些指标,决策树算法可以选择最优的特征来进行分裂,从而构建出有效的决策树模型。
理解决策树原理的最好的办法就是玩Jezzball游戏。这是微软的一款经典游戏(见下图)。这个游戏的最终任务是在一个有移动墙壁的房间里,通过建造墙壁来尽可能地将房间分成尽量大的,没有小球的空间。
每一次你用建墙来分割房间,其实就是在将一个总体分成两部分。决策树也是用类似方法将总体分成尽量多的不同组别。
python代码
1 |
|
4.支持向量机(SVM)
定义
这是一个分类算法。在这个算法中我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。
支持向量机(Support Vector Machine,SVM)是一种用于分类和回归分析的监督学习模型。其主要思想是找到一个最优的超平面来对数据进行分类或回归,使得两个类别之间的间隔最大化。
示例
现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。
在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。
我们可以把这个算法想成n维空间里的JezzBall游戏,不过有一些变动:
你可以以任何角度画分割线/分割面(经典游戏中只有垂直和水平方向)。
现在这个游戏的目的是把不同颜色的小球分到不同空间里。
小球是不动的。
python代码
1 |
|
5.朴素贝叶斯 (Naive Bayes)
定义
这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。
朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。
数学理论
贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。
在贝叶斯理论中,P(c) 代表的是先验概率,表示在考虑任何新证据之前对事件 c 发生的信念。换句话说,它是基于以往经验和先前已知信息得出的事件 c 的概率。
P(x) 则代表边缘似然度(marginal likelihood),也称为证据(evidence),表示在所有可能的类别下观察到数据 x 的概率。这通常是一个归一化因子,用于确保后验概率的总和为1。
P(x|c) 是条件概率,表示在给定类别 c 下观察到数据 x 的概率。它衡量了特征 x 对于类别 c 的贡献程度。
有了这些概率,我们可以使用贝叶斯公式计算后验概率 P(c|x),即在观察到数据 x 后,关于类别 c 的新信念。具体来说,后验概率告诉了我们在观察到数据 x 之后,事件 c 发生的概率。
P(c|x)是已知特征x而分类为c的后验概率。
P(c)是种类c的先验概率。
P(x|c)是种类c具有特征x的可能性。
P(x)是特征x的先验概率。
算法如下:
示例
例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:
步骤1:根据已知数据做频率表
步骤2:计算各个情况的概率制作概率表。
比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.
步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。
提问: 天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?
我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。
这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。
那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。
当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。
python代码
1 |
|
6.K邻近算法(KNN)
定义
这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。
距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。
示例
KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。
在用KNN前你需要考虑到:
(1) KNN的计算成本很高
(2) 所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。
(3) 在进行KNN前预处理数据,例如去除异常值,噪音等。
python代码
1 |
|
7.K-均值算法(K-means)
定义
这是一种解决聚类问题的非监督式学习算法。这个方法简单地利用了一定数量的集群(假设K个集群)对给定数据进行分类。同一集群内的数据点是同类的,不同集群的数据点不同类。
具体来说,K均值算法的工作流程如下:
- 随机选择 K 个数据点作为初始的聚类中心。
- 将数据集中的每个数据点分配到距离其最近的聚类中心所在的组。
- 计算每个组的新中心,即取该组内所有数据点的平均值作为新的聚类中心。
- 重复步骤2和3,直到聚类中心不再发生变化或者达到预定的迭代次数。
K均值算法适用于特征空间中的实例点,且需要事先确定要分成的簇数 K。这个算法简单易懂,计算效率高,因此被广泛应用于图像分割、文档分类、市场分析等领域。但是,K均值算法也有一些局限性,比如对初始聚类中心的选择敏感,对异常值敏感等。
示例
还记得你是怎样从墨水渍中辨认形状的么?K均值算法的过程类似,你也要通过观察集群形状和分布来判断集群数量!
K均值算法如何划分集群:
从每个集群中选取K个数据点作为质心(centroids)。
将每一个数据点与距离自己最近的质心划分在同一集群,即生成K个新集群。
找出新集群的质心,这样就有了新的质心。
重复2和3,直到结果收敛,即不再有新的质心出现。
确定K值
如果我们在每个集群中计算集群中所有点到质心的距离平方和,再将不同集群的距离平方和相加,我们就得到了这个集群方案的总平方和。
我们知道,随着集群数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的集群数。
python代码
1 |
|
8.随机森林 (Random Forest)
定义
随机森林是对决策树集合的特有名称。随机森林里我们有多个决策树(所以叫“森林”)。为了给一个新的观察值分类,根据它的特征,每一个决策树都会给出一个分类。随机森林算法选出投票最多的分类作为分类结果。
“随机”体现在两个地方:
- 数据的随机性:每棵树只看一部分数据来学习,而不是全部数据。
- 特征的随机性:每棵树只看数据中的一部分特征来学习,而不是全部特征。
怎么生成随机数?
如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成培养决策树的训练集。
如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。
每个决策树都最大程度上进行分割,没有剪枝。
python代码
1 |
|
9.降低维度算法(Dimensionality Reduction Algorithms)
定义
降低维度是指通过保留数据集中最重要的信息来减少特征或变量的数量,从而简化模型并提高计算效率。
在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。
例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。
作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。
python代码
1 |
|
10.Gradient Boost和Adaboost算法
定义
GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。
- AdaBoost(Adaptive Boosting):
- AdaBoost 通过反复训练弱分类器(通常是决策树桩)来提升整体模型性能。
- 在每一轮训练中,它会调整样本的权重,使得之前被错误分类的样本在后续训练中获得更高的权重,以便下一轮能够更关注错分的样本。
- 最终的分类器是将所有弱分类器加权组合而成的强分类器。
- Gradient Boosting:
- Gradient Boosting 通过迭代地训练决策树(或其他基本模型),每次训练的目标是减小上一轮的残差(预测值与实际值的差)。
- 在每一轮迭代中,通过梯度下降的方式优化损失函数,使得模型在训练集上拟合得更好。
- 最终的模型是将所有基本模型的预测结果加和而得到的。
主要区别
主要区别:
AdaBoost 的核心思想是调整样本的权重来重点关注错分的样本,而 Gradient Boosting 通过迭代优化残差来不断改进模型。
AdaBoost 每一轮训练都会调整样本的权重,可能会造成过拟合;而 Gradient Boosting 则通过加入正则化项来控制模型的复杂度,更容易防止过拟合。
python代码
1 |
|