MATLAB快速实现机器学习

基本概念

定义
机器学习正是这样一门学科,它致力于研究如何通过计算的手段,利用经验来改善系统自身的性能.在计算机系统中,“经验”通常以“数据”形式存在,因此,机器学习所研究的主要内容,是关于在计算机上从数据中产生“模型”(model)的算法,即“学习算法”(learning algorithm).有了学习算法,我们把经验数据提供给它,它就能基于这些数据产生模型;在面对新的情况时(例如看到一个没剖开的西瓜),模型会给我们提供相应的判断(例如好瓜)。[1]

undefined

机器学习的划分

种类
机 器 学 习 一 般 包 括** 监 督 学 习** ( supervised learning )、 **无 监 督 学 习**(unsupervised learning)、**强化学习**(reinforcement learning)。有时还包括半监督学习(semi-supervised learning)、**主动学习**(active learning)。

监督学习

定义
监督学习是指从标注数据中学习预测模型的机器学习问题。标注数据表示输入输出的对应关系,预测模型对给定的输入产生相应的输出。监督学习的本质是学习输入到输出的映射的统计规律。即:我们的数据既有输入变量又有输出变量(既有特征 feature 又有标签label),我们要找到输入变量和输出变量之间的关系。

undefined

监督学习根据输出变量 Y 的数据类型不同,又可以分成两种类型:

  • 当输出变量 Y 取有限个离散值时,称为分类问题
    举例:

    1. 判断西瓜的好坏(好瓜/坏瓜)
    2. 判断肿瘤的性质(良性/恶性)
    3. 根据鸢尾花的花萼长度、花萼宽度、花瓣长度和花瓣宽度这四个指标来判断它的种类(山鸢尾/杂色鸢尾/维吉尼亚鸢尾)

在分类问题中,当 Y 只取两类时,我们称为二分类问题,当分类的类别为多个时,称为多分类问题。

  • 输出变量 Y 为连续型变量,称为回归问题。(此回归非彼回归)
    举例:

    1. 给定房屋的一些信息(户型、是否靠近地铁等),预测房价
    2. 给定土地的施肥量,预测农作物的产量

无监督学习

定义
无监督学习是指从无标注数据中学习预测模型的机器学习问题。无标注数据是自然得到的数据,预测模型表示数据的类别、转换或概率。无监督学习的本质是学习数据中的统计规律或潜在结构。即:我们的数据全部都是输入变量,没有输出变量。我们希望得到数据之间隐藏着的结构和规律。

无监督学习最常见的两种用法:聚类和降维。

  • 聚类的例子:银行收集了客户的许多个人信息,根据这些个人信息可以将客户划分到不同的用户群体(例如:贵宾客户、重点客户、普通客户、可能流失的客户等),银行可以为不同的用户群体制定出相应的个性化营销方案。
  • 降维的例子:输入变量的维度太大(指标个数太多了),我们需要通过降维的方法来构造出少数几个指标,这几个指标能保留原来这些输入变量的绝大部分信息。
注意
有很多同学区分不开聚类和分类的概念,事实上你只要知道监督学习和无监督学习的核心区别就行了(有无输出变量 Y)。在分类中,类别是已知的;而在聚类中,类别是不知道的,我们是通过数据的特征属性将数据划分到某几类中,这几个类代表的含义需要我们自己根据聚类的结果来定义。

强化学习

强化学习定义
强化学习(reinforcement learning)是指智能系统在与环境的连续互动中学习最优行为策略的机器学习问题。假设智能系统与环境的互动基于马尔可夫决策过程(Markov decision process),智能系统能观测到的是与环境互动得到的数据序列。强化学习的本质是学习最优的序贯决策。
例子
以 flappy bird 这款游戏为例,电脑怎么知道下一步小鸟要采取怎样的行动呢?通过不断与环境的交互和试错的过程,最终完成特定目的或使得整体行动收益最大化。(做对了给奖励,做错了给惩罚)。

模型评估指标

注意
以下只介绍监督学习的内容。

回归问题的评估指标

  以预测房价为例,假设我们有$n$个样本(即$n$个房屋的信息和价格数据),这$n$个房屋的真实价格用向量$y=\left[ y_1,y_2,\cdots ,y_n \right]$表示,我们建立的机器学习模型得到的这$n$个房屋价格的估计值(预测值)是向量$y=\left[ \hat{y}_1,\hat{y}_2,\cdots ,\hat{y}_n \right]$。

  • $SSE$误差(或残差)平方和(Sum of Squares due to Error)
    $$
    SSE=\sum_{i=1}^n{\left( y_i-\hat{y}_i \right) ^2}
    $$

    范围$\left[ 0,+\infty \right)$,当预测值与真实值完全吻合时等于$0$。误差越大,该值越大。它的量纲是原来数据量纲的平方。

  • $MSE$均方误差(Mean Square Error),就是$SSE$除了一个样本数$n$。
    $$
    MSE=\frac{1}{n}\sum_{i=1}^n{\left( y_i-\hat{y}_i \right) ^2}
    $$

  • $RMSE$均方根误差(Root Mean Square Error),其实就是$MSE$加了个根号
    $$
    RMSE=\sqrt{\frac{1}{n}\sum_{i=1}^n{\left( y_i-\hat{y}_i \right) ^2}}
    $$

    它的量纲和原来数据的量纲相同,这个用的较多

  • $MAE$平均绝对误差(Mean Absolute Error)
    $$
    MAE=\frac{1}{n}\sum_{i=1}^n{\left| y_i-\hat{y}_i \right|}
    $$

  • $MAPE$平均绝对百分比误差(Mean Absolute Percentage Error)
    $$
    MAPE=\frac{1}{n}\sum_{i=1}^n{\left| \frac{y_i-\hat{y}_i}{y_i} \right|}
    $$

  • $SMAPE$对称平均绝对百分比误差(Symmetric Mean Absolute Percentage Error)
    $$
    SMAPE=\frac{100\%}{n}\sum_{i=1}^n{\frac{\left| y_i-\hat{y}_i \right|}{\left( \left| y_i \right|+\left| \hat{y}_i \right| \right) /2}}
    $$

分类问题的评估指标

  假设现在我们要预测西瓜的好坏。下表是我们最后得到的预测结果

真实的结果 预测的结果
坏瓜 好瓜
坏瓜 好瓜
坏瓜 坏瓜
坏瓜 好瓜
好瓜 好瓜
好瓜 好瓜
好瓜 好瓜
好瓜 好瓜
好瓜 坏瓜
好瓜 好瓜

  可以看到,真实的结果中有4个坏瓜,有3个被错误的预测成了好瓜;真实的结果中有6个好瓜,有1个错误的被预测成了坏瓜。
  我们可以用下面这个表格来可视化这个预测的结果,这个表格又被称为混淆矩阵(Confusion Matrix)。

undefined

  根据上面这个混淆矩阵,我们可以计算出很多衡量分类结果好坏的指标。
  在此之前,我们需要定义分类结果中的正类(positive)和负类(negative),这里的正类和负类实际上借用了医学中的阳性(positive)和阴性(negative)的概念,医学中一般阴性代表正常,而阳性则代表患有疾病。在机器学习中,我们通常将更关注的事件定义为正类事件。(生活中我们通常会更关注那些结果不好的情况的出现)[2]
  例如上面的西瓜分类的例子中,如果我们更关注坏瓜,就定义坏瓜为正类,好瓜为负类。(有些地方也用 0 和 1 表示分类结果,一般正类记为 1,负类记为 0)。
以下几个例子怎样定义正负类比较合适。

  • 判断肿瘤是良性还是恶性。(恶性)

  • 银行发放贷款前,会对申请人进行审核,判断是否可能会违约。(违约)

  • 买股票前,我们预测股票未来会上涨还是下跌。(下跌)

我们要将混淆矩阵中的四个数值分别定义成四个指标

指标 含义
True Positive(TP) 将正类预测为正类的数量
False Negative(FN) 将正类预测为负类的数量
False Positive(FP) 将负类预测为正类的数量
True Negative(TN) 将负类预测为负类的数量

分类准确率(Accuracy)

实际上就是正确分类的样本数与总样本数的比例$Accuracy=\frac{TP+TN}{TP+FN+FP+TN}=0.6$

  准确率有一定的局限性,假设我们分类的目标是识别好人和坏人,好人有 95 个,
坏人只有 5 个(样本不平衡)。如果我们设计的模型是将所有的人全部都识别成好人,
那么分类准确率为 95%,但是这个模型并没啥用,因为一个坏人都没别识别出来。

查全率或召回率(Recall,记为 R)

  在实际为正类的样本中,预测正确的比例,西瓜例子中$R=\frac{TP}{TP+FN}=0.25$而上面这个识别坏人的例子中,坏人为正类,此时查全率$R$为0。

查准率或精确率(Precision,记为 P)

  在预测为正类的样本中,预测正确的比例,西瓜例子中$P=\frac{TP}{TP+FP}=0.5$

注意
通常来说,查全率和查准率是负相关关系的。

$F_1$分数($F_1 Score$)

$F_1$分数是查全率和查准率的调和平均数。$\frac{2}{F_1}=\frac{1}{R}+\frac{1}{P}$,化简可得$F_1=2\times \frac{P\times R}{P+R}$如果带入查全率$R=\frac{TP}{TP+FN}$和查准率$P=\frac{TP}{TP+FP}$可得:$F_1=\frac{2TP}{2TP+FP+FN}$事实上$F1$分数是$F{\beta}$分数在$\beta$等于1时的特例$F_{\beta}=\left( 1+\beta ^2 \right) \times \frac{P\times R}{\beta ^2\times P+R}\left( \beta \geqslant 0 \right)\beta$大于1时,查全率的权重高于精确率; $\beta$小于1时精确率的权重高于查全率。

注意:$F1$和$F{\beta}$的范围都是位于[0,1]之间,越接近1表示分类效果越好。

ROC 曲线和 AUC

  ROC曲线全称为受试者工作特征曲线(receiver operating characteristic curve),它是根据一系列不同的分类阈值,以真正类率(True Postive Rate, TPR)为纵坐标,假正类率(False Positive Rate, FPR)为横坐标绘制的曲线。其中,真正类率 TPR 就是我们前面介绍的查全率 R,它在 ROC 曲线中又可以被称为灵敏度(sensitivity);假正类率(FPR)的计算公式是 FPR= FP / (FP + TN),它表示将负类错误的识别为正类的样本占所有负类样本的比例,一般我们记 1-FPR 为特异性(specificity)。

  • 将不同的模型的 ROC 曲线绘制在同一张图内,最靠近左上角的那条曲线代表的模型的分类效果最好。

  • 实际任务中,情况很复杂,如果两条 ROC 曲线发生了交叉,则很难一般性地断言谁优谁劣。因此我们引入 AUC,AUC(Area Under Curve)被定义为 ROC 曲线与下方的坐标轴围成的面积,AUC 的范围位于[0,1]之间,AUC 越大则模型的分类效果越好,如果 AUC 小于等于 0.5,则该模型是不能用的。通常 AUC 大于 0.85 的模型就表现可以了。

模型的泛化能力

  模型的泛化能力(generalization ability)是指由该模型对未知数据的预测能力。  还是举西瓜分类的例子,我们利用 100 个西瓜的数据建立了一个模型,不妨称其为“西瓜分类器”,它能帮助我们区分好瓜和坏瓜。
  那么我们怎样去评价这个“西瓜分类器”好不好用呢?
  有同学会想,前面我们学了那么多用来评价分类结果好坏的评估指标,比如分类准确率、F1 分数、AUC 等。如果这些指标都很大的话不就说明我们的模型很好吗?
  事实上这是不够的,我们更加关心的是这个“西瓜分类器”在面对一组新的数据的时候,它的分类能力还是不是足够好。
  打个比方,准备期末考试的时候,大家都做课后作业题复习,可能你每道课后题都会做,但上了考场还是啥都不会。
  回到我们西瓜分类的例子上,怎么去衡量这个“西瓜分类器”的泛化能力是否强呢?我们可以再去买 20 个西瓜,把这些西瓜的特征数据(输入数据 X)输入到我们的“西瓜分类器”中,然后看它的预测结果(输出结果为 Y);另一方面,我们可以人工去判断这 20 个西瓜是好瓜还是坏瓜,这样就可以得到真实的结果。接下来只需要将预测结果和真实结果进行对比,看看“西瓜分类器”的分类准确率是不是很高。如果“西瓜分类器”表现的很好,那就说它的泛化能力很强;如果“西瓜分类器”表现的很糟糕,那么它的泛化能力就很弱,这时候你就要怀疑我们的“西瓜分类器”的模型是否存在问题。

留出法

  前面我们为了衡量“西瓜分类器”的泛化能力,我们又买了 20 个西瓜用于测试。但大多少时候我们获取新的测试样本的成本较高,例如银行判断申请贷款的客户是否会违约时,需要等到客户还钱的时候才知道结果。因此,我们需要想一个办法,只使用已有的样本数据来对模型的泛化能力进行一个评价。
  实际上这个办法很容易想到:还是假设我们现在有 100 个西瓜的数据,这些西瓜的特征数据 X 以及是否为好瓜 Y 我们是知道的。
  我们只拿出 80 个西瓜来训练我们的“西瓜分类器”,剩下的 20 个西瓜我们假装不知道它们是好瓜还是坏瓜。接下来,我们把这 20 个西瓜的 X 输入到我们的“西瓜分类器”中,来得到预测结果,并和这 20 个西瓜的真实类别进行对比来计算分类准确率,这个结果就能反映模型的泛化能力的好坏。我们将这里的 80 个西瓜称为训练集(train set),它们用来训练我们的模型,得到我们模型中的待估参数;剩下的 20 个西瓜我们不参与模型的训练过程,只用来最后对模型的好坏进行测试,因此被称为测试集(test set)。我们将上面这种对泛化能力进行评估的方法称为留出法(Hold-Out)。有以下几点要说明:

  1. 假设我们总共的样本量为 N,我们要将其划分为训练集和测试集,这两个集合的划分比例通常设置为:6:4、7:3 或 8:2。

  2. 训练集和测试集的划分既要随机,又要尽可能保持数据分布的一致性(在分类问题中就是类别比例的相似),例如原来 100 个瓜中有 60 个好瓜,40个坏瓜,那么你按照 8:2 的比例生成训练集和测试集时,尽量保证测试集中的 20 个样本内有 12 个好瓜和 8 个坏瓜。在分类任务中,保留类别比例的采样方法称为分层采样(stratified sampling)。

交叉验证

  在留出法中,用于评价模型泛化能力的测试集只是所有样本的一部分,而且这个结果不是很稳定,对模型的泛化能力的评价依赖于哪些样本点落入训练集,哪些样本点在测试集。
  下面我们介绍一种用的更多的方法:k 折交叉验证(K-fold cross-validation)。我们先将数据集 D 随机的划分为 k 个大小相似的互斥子集。每一次用 k-1 个子集的并集作为训练集,剩下的一个子集作为测试集;这样就可以获得 k 组训练/测试集,从而可进行 k 次训练和测试,最终返回的是这 k 次测试的平均结果,通常 k 取 10,此时称为 10 折交叉验证。

假设总共的样本量为 N,如果我们取 k=N 会发生什么情况?

  这种情况是交叉验证法的一个特例: 留一法(Leave-One-Out,简称 LOO),即把数据集分成了 N 份,每次用 N-1 个数据来训练模型,剩下的 1 个数据来进行测试。显然,留一法不受随机样本划分方式的影响,因为 N 个样本只有唯一的方式划分为 N 个子集——每个子集包含一个样本;留一法使用的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用整个数据集训练出的模型很相似。因此,留一法的评估结果往往被认为比较准确。然而,留一法也有其缺陷:在数据集比较大时,训练 N 个模型的计算开销可能是难以忍受的(例如数据集包含 1 百万个样本,则需训练 1 百万个模型),而这还是在未考虑算法调参的情况下。另外,留一法的估计结果也未必永远比其他评估方法准确;“没有免费的午餐”定理对实验评估方法同样适用。

选择最好的模型

  对于同一个问题,我们可以建立不同的模型去解决。例如前面介绍的西瓜分类问题中,我们可以使用决策树、K 最近邻(KNN)、支持向量机(SVM)等常用的机器学习模型。那么,我们应该怎样衡量一个模型的好坏呢?
  我们前面介绍了留出法和交叉验证法,这里面都需要将数据分成训练集和测试集。因此,我们可以在同一个训练集下,分别对这些模型进行训练,然后将这些模型分别在测试集上进行预测,并比较不同模型的泛化能力,我们选择泛化能力最好的模型。(该模型在测试集上的表现最好,例如误差最小,具体的评价指标在前面有介绍)
  另外,大多数的模型中都需要设定一些参数(parameter),参数不同得到的结果可能有很明显的差异。因此,除了要对模型进行选择外,还需要对模型中的参数进行设定,这就是机器学习中常说的“参数调节”或简称“调参”(parameter tuning)。通常调参依赖于经验,我们后面会介绍网格搜索的方法,来自动搜索使模型效果最好的参数。

注意
给定包含 N 个样本的数据集 D,在选择模型的过程中,因为需要留出测试集的数据进行评估测试,所以我们只使用了训练集的数据来训练模型,这会导致测试集的信息在训练模型的过程中没有被利用到。因此,在模型选择和参数都调整完成后,我们应该使用完整的数据集 D 来重新训练模型。这个模型在训练过程中使用了所有 N 个样本,这才是我们最终需要的模型。

欠拟合和过拟合

  过拟合(overfitting)指的是模型在训练集上表现的很好,但是在测试集上表现的并不理想,也就是说模型对未知样本的预测表现一般,泛化能力较差。
  如果模型不仅在训练数据集上的预测结果不好,而且在测试数据集上的表现也不理想,也就是说两者的表现都很糟糕,那么我们有理由怀疑模型发生了欠拟合(underfitting)现象。

训练集上的表现 测试集上的表现 可能的原因
不好 过拟合
好的拟合(适度拟合)
不好 不好 欠拟合
  • 可能产生过拟合的常见原因
      1. 模型中参数设置的过多导致模型过于复杂
      2. 训练集的样本量不够
      3. 输入了某些完全错误的的特征举个极端的例子:样本的编号。现在有 100 个西瓜,编号 1-60 的是好瓜,编号 61-100 的是坏瓜,如果你把编号作为了输入变量放入了我们的模型,那么有可能模型会将编号作为一个最重要的识别变量来对西瓜进行分类,模型会认为只要编号小于等于 60 的都是好瓜,此时在训练集上的误差一定为 0。。。。。。如果这时候你拿来编号大于 100 的需要判断好坏的瓜,模型都会认为是坏瓜!

  • 解决过拟合的方法
      1. 通过前面介绍的交叉验证的方法来选择合适的模型,并对参数进行调节。
      2. 扩大样本数量、训练更多的数据
      3. 对模型中的参数增加正则化(即增加惩罚项,参数越多惩罚越大)

欠拟合则和过拟合刚好相反,我们可以增加模型的参数、或者选择更加复杂的模型;也可以从数据中挖掘更多的特征来增加输入的变量,还可以使用一些集成算法(如装袋法(Bagging),提升法(Boosting))

注意
有可能模型的输入和输出一点关系都没有,举个极端的例子,你买的西瓜好坏和你的个人特征没任何关系,例如你的性别身高体重等。
拓展
事实上,针对不同的机器学习算法,通常有特定的应对思路,例如在树模型中,我们可以控制树的深度来防止过拟合、神经网络在训练过程中使用 dropout 的策略来缩减参数量避免过拟合。

操作

$MATLAB$工具箱

操作步骤

  1. 调整本地的数据的形式为标准形式

  2. 在 matlab 中导入数据

  3. 选择模型进行训练,比较不同模型的好坏

  4. 使用网格搜索进一步调整参数(进阶:需要写代码)

  5. 使用所有数据进行训练,得到最终模型

  6. 进行预测

操作视频

其他有用的机器学习函数

Neighborhood Component Analysis (NCA)
ReliefF or RReliefF algorithm
minimum redundancy maximum relevance (MRMR) algorithm


参考

  1. ^https://www.bilibili.com/video/BV1v64y1B7vJ?p=1
  2. ^这种划分正类和负类的标准也不是绝对的,如果你更关注好瓜,那么你也可以把好瓜定义成正类;另外有时候我们很难去区分结果的好坏,例如我们要对猫和狗的图片进行分类,这时候正类和负类无论怎么定义都行。
文章作者: Mr.Zhang
文章标题: MATLAB快速实现机器学习
文章链接: https://www.codewing.cn/index.php/177/matlab-machine-learning/
版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议。转载请注明来自Ying's Blog!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇