机器学习的定义
-
机器学习是一门从数据中研究算法的科学学科。
-
机器学习直白来讲, 就是根据已有的数据,进行算法选择,并基于算法和数据 构建模型,最终对未来进行预测。
-
机器学习就是一个模拟人决策过程的一种程序结构。
机器学习/人工智能的理性认识
机器学习
-
基本概念
-
输入: x ∈ X x \in X x∈X (属性值) X X X中样本的属性所张成的空间称为属性/样本空间(attribute/sample space)
假设特征空间X中的样本具有n个属性, 这里的n也被称之为维数(dimensionality)
由于空间中的每个点(样本)对应一个坐标向量,因此我们也把特征空间中的每个样本称为一个"特征向量"(feature vector).
-
输出: y ∈ Y ( y \in Y( y∈Y( 目标值 ) ) )
y对应的某个样本x的标签, 而Y是所有样本标签的集合, 称为标记空间(label space)或输出空间
-
获得一个目标函数(target function):
f : X → Y ( f: X \rightarrow Y( f:X→Y( 理想的公式 ) ) ) -
输入数据: D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ ⋯ , ( x n , y n ) } D=\left\{\left(x_1, y_1\right),\left(x_2, y_2\right), \cdots \cdots,\left(x_n, y_n\right)\right\} D={(x1,y1),(x2,y2),⋯⋯,(xn,yn)} ( 历史数据信息 ; 这里 D 表示包含 n 个样本及标签的数据集 ) ) (历史数据信息; 这里D表示包含n个样本及标签的数据集)) (历史数据信息;这里D表示包含n个样本及标签的数据集))
-
最终具有最优性能的假设公式:
g : X → Y ( g: X \rightarrow Y( g:X→Y( 学习得到的最终公式 ) ) )
-
-
目标函数f未知(无法得到)
-
假设函数g类似函数f,但是可能和函数f不同
-
机器学习中是无法找到一个完美的函数f的, 而我们要做的就是选择一个最优的假设
其实机器学习的本质目的就是为了获得一个假设函数g, 使其非常接近目标函数f的效果
机器学习中的概念
-
拟合:拟合的过程其实就是从数据中学得模型的过程, 它也被称之为"学习"或"训练", 这个过程通过执行某个学习算法来完成, 同时构建的算法模型需符合给定数据的特征
-
x i : x x_i: \mathrm{x} xi:x 特征向量的第 i \mathrm{i} i 维度的值
-
x ( i ) : x^{(i)}: x(i): 表示第 i \mathrm{i} i 个样本的 x \mathrm{x} x 向量
-
鲁棒性【Robust的音译】:指的系统的是健壮性、稳健性、强健性; 指一个计算机系统在执行过程中处理错误,以及算法在遭遇输入、运算等异常时继续正常运行的能力, 当存在异常数据的时候,算法也会拟合数据。
-
过拟合:过拟合是机器学习中的常见问题,过拟合指的是模型在训练数据上表现良好,但无法概括未见过的新数据或测试数据, 即“泛化”能力差。
-
欠拟合: 数据模型无法准确地捕捉输入和输出变量之间的关系,因此对训练集和不可见的数据都会产生很高的错误率。
对于某给定的任务T,在合理的性能度量方案P的前提下,某计算机程序可以自主学习任务T的经验E;随着提供合适、优质、大量的经验E,该程序对于任务T的性能逐步提高。 (美国卡内基梅隆大学(Carnegie Mellon University)机器学习研究领域的著名教授Tom Mitchell对机器学习的经典定义)
- 其中重要的机器学习对象:
- 任务Task T,一个或多个、经验Experience E、度量性能Performance P
- 随着任务的不断执行,经验的累积会带来计算机性能的提升。
- 算法(T):根据业务需要和数据特征选择的相关算法, 本质上是一个数学公式
- 模型(E): 基于算法和数据构建出来的模型
- 评估/测试§:对模型进行评估的策略
- 其中重要的机器学习对象:
机器学习概念性定义
机器学习是人工智能的一个分支。我们使用计算机设计一个系统, 使它能够根据提供的训练数据按照一定的方式来学习;随着训练次数的增加,该系统可以在性能上不断学习和改进;通过参数优化的学习模型,能够用于预测相关问题的输出。
机器学习、数据分析、数据挖掘区别与联系
- 数据分析:数据分析是指用适当的统计分析方法对收集的大量数据进行分析, 并提取有用的信息,以及形成结论,从而对数据进行详细的研究和概括过程。 在实际工作中,数据分析可帮助人们做出判断;数据分析一般而言可以分为 统计分析、探索性数据分析和验证性数据分析三大类。
- 数据挖掘:一般指从大量的数据中通过算法搜索隐藏于其中的信息的过程。 通常通过统计、检索、机器学习、模式匹配等诸多方法来实现这个过程。
- 机器学习:是数据分析和数据挖掘的一种比较常用、比较好的手段。
机器学习的本质
- 机器学习的本质目的是从数据中获得一个假设的函数g**,使其非常接近目标函数f的效果。**
机器学习的分类①
-
有监督学习:用已知某种或某些特性的样本作为训练集,以建立一个数学模型,再用已建立的模型来预测未知样本,此种方法被称为有监督学习,是最常用的一种机器学习方法。是从标签化训练数据集中推 断出模型的机器学习任务。
-
无监督学习:与监督学习相比,无监督学习的训练集中没有人为的标注的结果,在非监督的学习过程中,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构。
-
半监督学习:考虑如何利用少量的标注样本和大量的未标注样本进行训练和分类的问题,是有监督学习和无监督学习的结合
有监督学习(分类类型的算法)
-
判别式模型(Discriminative Model):直接对条件概率p(y|x)进行建模,常见判别模型有:Logistic回归、决策树、支持向量机SVM、k近邻、神经网络等;
-
生成式模型(Generative Model):对联合分布概率p(x,y)进行建模,常见生成式模型有:隐马尔可夫模型HMM、朴素贝叶斯模型、高斯混合模型GMM、LDA等;
-
生成式模型更普适;判别式模型更直接,目标性更强
-
生成式模型关注数据是如何产生的,寻找的是数据分布模型;判别式模型关注的数据的差异性,寻找的是分类面
-
由生成式模型可以产生判别式模型,但是由判别式模式没法形成生成式模型
无监督学习
- 无监督学习试图学习或者提取数据背后的数据特征,或者从数据中抽取出重 要的特征信息,常见的算法有聚类、降维、文本处理(特征抽取)等。
- 无监督学习一般是作为有监督学习的前期数据处理,功能是从原始数据中抽 取出必要的标签信息。
半监督学习(SSL)
- 主要考虑如何利用少量的标注样本和大量的未标注样本进行训练和分类的问题。 半监督学习对于减少标注代价,提高学习机器性能具有非常重大的实际意义。
- SSL的成立依赖于模型假设,主要分为三大类:平滑假设、聚类假设、流行假设; 其中流行假设更具有普片性。
- SSL类型的算法主要分为四大类:半监督分类、半监督回归、半监督聚类、半监督降维。
- 缺点:抗干扰能力弱,仅适合于实验室环境,其现实意义还没有体现出来;未 来的发展主要是聚焦于新模型假设的产生。
机器学习的分类②
-
分类
通过分类模型,将样本数据集中的样本映射到某个给定的类别中。在模型构建之前,类别信息已经确定了。 -
聚类
通过聚类模型,将样本数据集中的样本分为几个类别,属于同一类别的样本相似性比较大。 -
回归
反映了样本数据集中样本的属性值的特性,通过函数表达样本映射的关系来发现属性值之间的依赖关系。 -
关联规则
获取隐藏在数据项之间的关联或相互关系,即可以根据一个数据项的出现推导出其他数据项的出现频率。
机器学习开发流程
- 数据收集
- 数据预处理
- 特征提取
- 模型构建
- 模型测试评估
- 投入使用(模型部署与整合)
- 迭代优化
我们通常把数据预处理和特征提取一起来做, 当作一步。
迭代优化才能保证我们的模型适应后续的场景
机器学习、人工智能和深度学习的关系
-
深度学习是机器学习的子类;深度学习是基于传统的神经网络算法发展到多隐层的一种算法体现。
-
机器学习是人工智能的一个子类
数据的收集与存储
数据来源:
- 用户访问行为数据
- 业务数据
- 外部第三方数据
数据存储:
- 需要存储的数据:原始数据、预处理后数据、模型结果
- 存储设施:磁盘、MySQL、HDFS、HBase、Solr、Elasticsearch、Kafka、Redis等
数据收集方式:
- Flume & Kafka
切记, 我们收集到的数据必须要进行脱敏处理, 因为涉及到个人隐私。
数据的清洗与转换
-
实际生产环境中机器学习比较耗时的一部分
-
大部分的机器学习模型所处理的都是特征,特征通常是输入变量所对应的可用于模型的数值表示
-
大部分情况下 ,收集得到的数据需要经过预处理后才能够为算法所使用,预处理的操作主要包括以下几个部分:
-
数据过滤:
- 处理数据缺失
- 处理可能的异常、错误或者异常值
- 合并多个数据源数据
- 数据汇总
对模型进行正则化、标准化, 以保证同一模型的不同输入变量的取值范围相同, 这一步骤也被称为–去量纲化
- 对数据进行初步的预处理,需要将其转换为一种适合机器学习模型的表示形式,对许多模型类型来说,这种表示就是包含数值数据的向量或者矩阵
- 将类别数据编码成为对应的数值表示(一般使用1-of-k\哑编码方法)
- 从文本数据中提取有用的数据(一般使用词袋法或者TF-IDF)
- 处理图像或者音频数据(像素、声波、音频、振幅等<傅里叶变换>)
- 对特征进行正则化、标准化,以保证同一模型的不同输入变量的取值范围相同
- 数值数据转换为类别数据以减少变量的值,比如年龄分段
- 对数值数据进行转换,比如对数转换
- 对现有变量进行组合或转换以生成新特征(基于对数据以及对业务的理解),比如平均数 (做虚拟变量),需要不断尝试才可以确定具体使用什么虚拟变量。
处理数据缺失的几种方式
对于某一个维度的特征, 如果它对应的是连续型的随机变量, 那么众数填充的方式在一些场景下相比于均值和中位数显得不稳定, 所以我们优先采用均值或中位数来进行填充缺失值。
对于某一维度的特征, 如果它对应的是离散型的随机变量, 我们则采用众数填充的方式。
**除上述之外,我们还可以利用其他有关的特征进行计算填充 **, 比如年龄,就可以根据用户的出生日期进行计算填充;所以我们需要具体业务具体分析
类别特征转换之独热编码(One-Hot / 1-of-k)
- 功能:将非数值型的特征值转换为数值型的数据
- 描述: 假设变量的取值有 k 个,如果对这些值用 1 到 k 编序,则可用维度为 k 的向量来表示一个变量的值。在这样的向量里,该取值所对应的序号所对应的元素为1,其他元素均为0.
举个例子, 比如我们预测城市的收入值, 有北京、上海、广州这三个城市, 如果我们用常规的1 2 3分别作为这三个城市对应的数值表示
那么这个特征它就是有序的结构, 并且城市的数值表示会对预测值造成影响, 而这显然不是我们想要的, 并且城市它不是有序的, 于是就产生了一种将类别数据编码成为对应的数值表示的方式——独热编码
到目前为止, 表示分类变量最常用的方法就是使用One-Hot编码/哑编码(one-hot encoding)或N取一编码(one-out-of N, 它可以将我们的类别数据编码成为对应的数值表示。它背后的思想是将一个分类变量替换成一个或对个新特征, 新特征取值为0和1。
当我们采用独热编码以后, 就消除了数值表示所造成的差异, 每个城市所对应的向量到特征空间原点的距离都是相等的, 这样我们不仅消除了数值表示对预测结果的影响, 并且它还是无序的。
下面是使用哑编码的例子, 特征T1代表城市名A、B、C
文本数据抽取
- 词袋法:将文本当作一个无序的数据集合,文本特征可以采用文本中的词条/单词T进 行体现,那么文本中出现的所有词条及其出现的次数/频率就可以体现文档的特征
- TF-IDF: 词条的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语 料库中出现的频率成反比下降;也就是说词条在当前文本中出现的次数越多,表示 该词条对当前文本的重要性越高,词条在所有文本(语料库(corpus)/训练数据集)中出现的次 数越少,说明这个词条对文本的重要性越高。TF(词频)指某个词条在文本中出现的次 数,一般会将其进行归一化处理(该词条数量/该文档中所有词条数量);IDF(逆向文件 频率)指一个词条重要性的度量,一般计算方式为语料库中总文件数目除以包含该词 语的文件数目,再将得到的商取对数得到。TF-IDF实际上是:TF * IDF
模型训练及测试
- 模型选择:对特定任务最优建模方法的选择或者对特定模型最佳参数的选择。
- 在训练数据集上运行模型(算法)并在测试数据集中测试效果,迭代进行数据模型的修改,这种方式被称为交叉验证(将数据分为训练集和测试集,使用训练集构建模型,并使用测试集评估模型提供修改建议)
- 模型的选择会尽可能多的选择算法进行执行,并比较执行结果
什么是性能度量?
我们都知道机器学习需要建模,但对于模型的性能表现(即模型的泛化能力),我们并不知道如何。很可能一个模型的泛化能力较差,无法很好地预测或分类新的数据。
而对模型的泛化能力进行评估, 不仅需要有效可行的实验估计方法, 还需要有衡量模型泛化能力的评价指标, 而这些评价指标就是性能度量。为了评估模型的泛化能力,我们需要使用某个指标来衡量,这就是性能度量的重要性及意义所在。有了这样的指标,我们就能够比较不同的模型,从而了解哪个模型相对更优秀,哪个相对较差,并通过这些指标进一步调参逐步优化我们的模型。
这些性能指标反映了在特定任务或领域中模型的表现, 我们在模型评估中要根据我们的任务需求来选择的合适的评估指标, 因为我们在对比不同模型的性能时, 不同的评估指标所得出的评估结果往往不同。这意味着模型的“好坏”是相对的, 什么样的模型是好的, 不仅取决于算法和数据, 还取决与任务需求。
分类算法评估指标
在了解分类算法的指标之前, 我们先来了解一下混淆矩阵。混淆矩阵是机器学习中总结分类模型预测结果的可视化工具, 它以矩阵形式将数据集中的记录按照实际类别(行)与预测类别(列)进行汇总。以二分类的模型为列, 经过混淆矩阵汇总之后,就会出现四种结果。
混淆矩阵
对混淆矩阵而言我们用Positive来表示正例(我们重点关注的结果), 一般用数字1或简写为P表示。而负例用Negative来表示, 我们一般用数字0或简写为N表示。我们通常用两个字母来表示表中的值, 第一个字母代表的是预测结果是否与真实类别相同, 相同为T(True), 不同为F(False) , 第二个字母代表的就是模型的预测结果了, 也就是正例P或者负例N。
TP – True Positive:实际为正例,且判断为正例(正确)
FN – False Negative:实际为正例,但判断为负例(错误)
TN – True Negative:实际为负例,且判断为负例(正确)
FP – False Positive:实际为负例,但判断为正例(错误)
以上四种指标就构成了混淆矩阵, 并且这四种指标的含义我们以这种方式去理解, 如下图所示;
这里我们先看①, 再看②。例如FN, 模型将某样本预测为负例, 预测错误, 所以它实际上是正例,而错误地判断为了负例 。
分类算法的所有评估指标都是基于以上四种指标进行计算的, 所以我们务必将它们理解透彻。
拓展:当我们在医院进行某种疾病检测时,我们会使用阴性和阳性来表示检测结果, 阳性表示得病,阴性表示没有得病。当然,这种0和1、NEGATIVE和POSITIVE的表示方法并不仅限于医疗环境,而是适用于我们所涉及的所有领域。在这里要强调一点,对于混淆矩阵,行代表真实值,列代表预测值,包括我们采用了0和1的排列表示方式, 这是一个约定俗成的习惯,虽然某些教科书可能有其他的排列方式,比如第一行是1,第二行是0,第一列是1,第二列是0。但通常情况下,我们都采用0和1的排列方式,因为这种排列方式更符合大多数人的习惯。因此,大家在某些资料中可能会看到一个没有行标和列标的混淆矩阵,通常就是按照这种排列方式。
准确率(精度)——Accuracy
准确率描述的就是分类正确的样本占样本总数的比例, 即准确率=提取出的正确样本数/总样本数
A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy=\frac{TP+TN}{TP+TN+FP+FN} Accuracy=TP+TN+FP+FNTP+TN
对于分类算法而言, 我们可能经常采用准确率来对模型的好坏进行度量,那是不是采用准确率这一指标来评估模型就已经足够好了呢? 并非如此, 其实分类准确率在评估分类算法的时候有一个很重要的问题——数据不均衡
分类算法的评估指标其实比回归算法的评估指标复杂的多, 对应的指标也多的多, 在具体采取哪一种指标来评估分类算法的时候, 还是要根据实际情况、数据的分布以及模型的应用场景而定, 就比如我们常使用的准确率这一指标, 虽然准确率可以判断总的正确率, 但在样本数据不均衡的情况下, 准确率这个评估指标并不适用。
例如我们现在有一个机器学习的任务, 我们需要搭建一个癌症预测系统, 也就是说送入不同人的体检信息, 根据体检的不同指标来让癌症预测系统判断体检信息所对应的人是否患有癌症, 大家可以想象一下这个过程。这里我们用0、1来表示一个人是否患有癌症, 1代表患癌, 0代表正常。在模型训练之前, 我们需要收集大量数据作为训练数据集, 以训练一个能够进行癌症预测的系统。假设现在我声称我们开发的这个系统, 它的预测准确率达到了99.9%, 于是很多人看到它惊人的准确率就想当然地认为这是一个非常好的系统, 其实, 并不然, 这个系统可能并不好, 为什么这么说呢?我们可以想一下, 在实际情况下, 癌症的发病率只有0.1%(即千分之一), 换句话说, 癌症只有千分之一的概率发生, 那这意味着什么呢?这意味这我们根本不需要任何机器学习算法, 而对于给定的任何体检信息, 我只需要预测这个人是健康的, 那么我就会有非常高的准确率, 因为只有0.1%的人患有癌症, 所以当我预测所有人都是健康的时候, 就能得到99.9%的准确率。然而, 在这种情况下, 我们的系统几乎没有实际作用。
如果再极端一下, 假设癌症的发病率是万分之一的话, 那意味着如果我预测所有人都是健康的, 其实我们实际上并没有对每个人进行预测, 但模型的准确率依然能达到99.99%。现实中的情况是, 如果我们实际进行了机器学习算法的训练, 而最终发现预测准确率是99.9%, 那实际上表示我们的机器学习系统是失败的, 因为它的准确率还不如我们简单地预测每个人都是健康的时候得到的准确率, 这就是使用准确率来评估分类系统的问题所在, 这种问题发生在数据极度不平衡的情况下,这种不平衡的数据英文称为“skewed data”。
所以, 在数据不平衡的情况下, 准确率这一指标就会失效。正因如此, 我们需要引入其他的指标来判断我们的分类算法的性能好坏
下面我们依次来看一下除准确率以外的指标
精准率(查准率)–Precision
精准率(Precision)=预测正确的正例样本数/预测为正例的样本数
P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP
我们一般将我们关注的预测结果视为正例, 对于精准率来说, 它描述的就是预测为正例的样本中实际为正例的样本所占的比例
精准率和准确率看上去有些类似, 但它们实际上是完全不同的两种概念。精准率代表对正样本结果中的预测准确程度, 而准确率则代表整体的预测准确程度。
召回率(查全率)-- Recall
召回率(Recall)=正确的正例样本数/样本中的正例样本数——覆盖率
实际为正例的样本中被预测为正例的比例
P r e c i s i o n = T P T P + F N Precision=\frac{TP}{TP+FN} Precision=TP+FNTP
召回率的应用场景: 比如电信用户流失预测, 我们的关注点是那些很可能流失的用户, 所以我们要尽可能地找出那些易流失的用户, 然后对这些用户采取一些措施, 防止用户流失。倘若模型的召回率不高, 那么我们很可能过多的将那些易流失的客户预测为不易流失的客户, 那么这些本来就易流失掉的用户可能就流失掉了, 而这会对我们造成损失。即使我们把一些不易流失用户预测为易流失的用户也对我们没什么影响, 我们主抓的就是找出那些易流失的用户。所以召回率越高, 就代表我们将那些实际存在的正例预测出来的比例就越高。它的含义类似于:宁可错杀一千, 不能放过一个
简单来说精准率的目的是为了模型不错报, 而召回率的目的是不漏报
精准率与召回率的关系
θ
T
⋅
X
=
0
\theta^T\cdot X =0
θT⋅X=0(假设样本有两个特征), 在解析几何中, 就是一根直线, 这个直线就是我们分类的决策边界, 所以它是至关重要的。可能有一些同志会产生这样的疑问, 对于这根直线, 为什么是
θ
T
⋅
X
b
=
0
\theta^T\cdot X_b =0
θT⋅Xb=0, 如果我设置任意一个常量, 把这个常量称为threshold(阈值), 我们可不可以让threshold作为决策边界呢?这根直线的方程如下所示
θ
T
⋅
X
b
=
t
h
r
e
s
h
o
l
d
\theta^T\cdot X_b =threshold
θT⋅Xb=threshold
如果分类概率大于threshold的话就分类为1, 小于threshold的话就分类为0, 这样就形成了一个决策边界。那么基于这个想法我们就为我们的逻辑回归算法引入了一个新的超参数threshold, 我们通过指定threshold, 相当于我们可以平移决策边界对应的这根直线, 从而影响我们的分类结果, 下面我们就具体的来看一下threshold的不同取值对我们分类结果的影响, 大家看下图
图中的轴score, 我们可以理解为计算出来的 θ ⋅ X \theta \cdot X θ⋅X, 因为有很多的机器学习算法用的不是 θ ⋅ X \theta \cdot X θ⋅X, 但不管怎么样, 它都是先计算出一个分数值, 然后根据这个分数值来去和不同的threshold进行比较, 进而得出最终的分类, 所以我管这个轴叫做score, 对于我们的逻辑回归算法来说, 我们是以0来作为threshold的, 现在假设我们轴上分布若干个样本,每个样本所在的位置就是样本的特征向量与我们训练出来的西塔相乘得到score值, 在给出的示例中小于0的的一边也就是左侧对应一共有7个样本, 有两种不同形状的样本标识, 这个五角星就是我们关注的事件, 换句话说就是我们之前提到的真实分类为1的目标事件;而圆形的就是真实分类为0的不关注的样本, 如果我们用0来作为分类的阈值的话, 那么右侧五个样本分类为1, 那么相应这些样本对应的精准率就是4/5=0.80, 召回率就是4/6=0.67
现在我们挪动一下threshold的位置, 如下图所示:
相当于我们抬高了我们的threshold, 我们现在以右侧的直线作为threshold, 比这根直线大的样本所对应的score才判断为1, 小于这根直线的我们判断为0, 那么这会发生什么呢?
我们看一下变化阈值后我们整个数据集对应的精准率和召回率
精准率2/2=1.00, 召回率:2/6=0.33
这是将我们的threshold增大一些得到的结果。下面让我们看一下让我们的threshold变小的结果, 在threshold为0的基础上往左移动, 判断的方法与上面同理
现在的精准率是6/8=0.75, 召回率是6/6=1.00
我们把它们全部都归到一张图中来对比一下这两个指标随着threshold的变化情况
以上就是threshold对precision和recall的值的影响, 通过这样一个图示, 我们就可以看出来精准率和召回率是互相牵制、互相矛盾的一对变量, 精准率变高的话, 召回率就会降低, 其实我们可以想一下, 有一些直观的解释非常好理解, 如果我们想让精准率变高的话, 那么相应的其实我们只能对那些特别有把握的数据才分类为1, 在这种情况下, 我们做的事情其实是让我们的算法…比如说样本y=1的概率是90%, 甚至99%的时候, 我们才把它们预测为1, 那么很显然在这种情况下, 就会有很多真实为1的样本被排除在y=1的外面, 那么我们的召回率相应的就会降低, 反过来如果我们想让召回率升高的话, 那么我们就要降低我们判断的概率, 比如在一个癌症预测系统中, 我们可能希望预测出来这个患者有10%的患癌的概率的话, 我们就都判定为癌症患者去做进一步的检查, 所以我们就会把我们的threshold拉低, 拉低之后我们的召回率确实得到了很大的提升, 不过我们的准确率相应的就会下降, 那么这就是precision和recall这两个指标之间的平衡, 下面我们编程看一下, precision和recall于threshold的关系
F1分数–精准率和召回率的关系
F 1 measure = 2 1 P r e c i s i o n + 1 R e c a l l F1\ \ \textit{measure}=\frac2{\frac1{Precision}+\frac1{Recall}} F1 measure=Precision1+Recall12(即F值为正确率和召回率的调和平均值)
通过精准率和召回率的计算公式, 我们发现: 精准率和召回率的分子相同, 都是TP, 但分母是不同的。如果我们把精准率和召回率之间的关系用图来表达, 就是下面的P-R(查准率-查全率)曲线:
可能会有一些人疑惑——这条曲线是根据什么变化的?为什么是这个形状的曲线?其实这要从排序型模型说起, 我们拿逻辑回归举例, 逻辑回归的输出是一个0、1之间的概率值, 然后我们基于一个**阈值(threshold)**来判断模型的预测是正例还是负例。通常来讲, 逻辑回归的概率越大说明其越接近于1。但不同的阈值可以得到不同的召回率。
但问题是:这个阈值并不是我们随便定义的, 我们并不知道这个阈值是否符合我们的要求。因此为了找到一个最为合适的阈值来满足我们的要求, 就必须遍历0、1之间的所有阈值, 而每个阈值下都对应着一对精准率和召回率, 从而就形成了P-R曲线。
可能有些同志又会问——我们又该如何才能找到最好的阈值点呢?首先, 需要说明的是我们对于这两个指标的要求, 我们希望精准率和召回率都非常高。但实际上, 这两个指标是一对矛盾体, 无法做到双高。我们从图中可以明显看到, 如果其中一个指标非常高, 那么另外一个指标肯定会非常低。选取合适的阈值点要根据实际需求, 比如我们想要高的召回率, 那我们就势必要牺牲一些精准率, 保证召回率高的情况下,精准率也不那么低。
P-R曲线直观的显示出模型在样本总体上的召回率、精准率。在进行比较时, 若一个模型的P-R曲线被另一个模型的曲线完全包住, 则可断言后者的性能优于前者。例如上图中模型A的性能优于模型C的。如果两个模型的P-R曲线发生了交叉, 例如上图中的A与B, 则难以一般性的断言两者孰优孰劣, 只能在具体的精准率或召回率条件下进行比较, 然后, 在很多情形下, 人民往往希望把模型A与B比出个高低, 这是一个比较合理的判断依据是比较P-R曲线下面积的大小, 它在一定程度上表征了模型在精准率和召回率上取得相对“双高的比例。但这个值不太容易估算, 因此, 人们设计了一些综合考虑精准率、召回率的性能度量。
“平衡点”(Break-Event Point, 简称BEP)就是这样的一个度量, 它是“精准率=召回率”时的取值。例如上图中模型C的BEP是0.64, 而基于BEP的比较, 我们可认为模型A优于模型B。
通常, 如果我们想要找到这两种指标之间的一个平衡点, 那么我们就需要一个新的指标——F1分数。F1分数同时考虑了精准率和召回率, 让两者同时达到最高, 取一个平衡。
灵敏度,特异度,真正率,假正率
现在我们已经了解了精准率、召回率和F1分数等指标, 但实际上在有些情况下, 这些指标并不能很好的发挥作用。这些情况就发生在正例的数量和负例的数量有很大偏差的时候。假设我们有一个总是预测输出结果为正例的模型。由于对任何输入都预测数据的类别正例,所以我们可能会认为这个模型的准确率会非常低。但在输入数据有偏差 的情况下, 比如正例95, 负例有5个的情况下, 准确率仍会高达95%。
虽然这个模型是一个极端的例子, 但在实际工作中, 这种没有经过很好的训练的模型因数据不均衡而计算出高准确率评估结果的情况经常出现。
而应对数据不均衡的指标有AUC。AUC指的是ROC曲线下的面积。
在正式介绍ROC/AUC之前,我们还要再介绍两个指标,这两个指标的选择也正是ROC和AUC可以无视样本不平衡的原因。 这两个指标分别是:灵敏度和(1-特异度),也叫做真正率(TPR)和假正率(FPR)。
灵敏度(Sensitivity) = TP/(TP+FN)
特异度(Specificity) = TN/(FP+TN)
- 灵敏度其实就是召回率, 只是名字不一样而已;特异度指的是被正确分类为负例的负例实例比率。
- 其实我们可以发现灵敏度和召回率是一模一样的,只是名字换了而已。
- 由于我们比较关心正样本,所以需要查看有多少负样本被错误地预测为正样本,所以使用(1-特异度),而不是特异度。
真正率( T P R ) = 灵敏度 = T P T P + F N 真正率(TPR) = 灵敏度 = \frac{TP}{TP+FN} 真正率(TPR)=灵敏度=TP+FNTP
假正率( F P R ) = 1 − 特异度 = F P F P + T N 假正率(FPR) = 1- 特异度 = \frac{FP}{FP+TN} 假正率(FPR)=1−特异度=FP+TNFP
下面是真正率和假正率的示意,我们发现TPR和FPR分别是基于实际表现(真实类别)1和0出发的,也就是说它们分别在实际的正样本和负样本中来观察相关概率问题。 正因如此,所以无论样本是否平衡,都不会被影响。还是拿之前的例子,总样本中,90%是正样本,10%是负样本。我们知道用准确率是有水分的,但是用TPR和FPR不一样。这里,TPR只关注90%正样本中有多少是被正确覆盖的,而与那10%毫无关系,同理,FPR只关注10%负样本中有多少是被错误覆盖的,也与那90%毫无关系,所以可以看出:如果我们从实际表现的各个结果角度出发,就可以避免样本不平衡的问题了,这也是为什么选用TPR和FPR作为ROC/AUC的指标的原因。
或者我们也可以从另一个角度考虑:条件概率。 我们假设X为预测值,Y为真实值。那么就可以将这些指标按条件概率表示:
精准率 = P ( Y = 1 ∣ X = 1 ) 精准率 = P(Y=1 | X=1) 精准率=P(Y=1∣X=1)
召回率 = 灵敏度 = P ( X = 1 ∣ Y = 1 ) 召回率 = 灵敏度 = P(X=1 | Y=1) 召回率=灵敏度=P(X=1∣Y=1)
特异度 = P ( X = 0 ∣ Y = 0 ) 特异度 = P(X=0 | Y=0) 特异度=P(X=0∣Y=0)
从上面三个公式看到:如果我们先以实际结果为条件(召回率,特异度),那么就只需考虑一种样本,而先以预测值为条件(精准率),那么我们需要同时考虑正样本和负样本。所以先以实际结果为条件的指标都不受样本不平衡的影响,相反以预测结果为条件的就会受到影响。
ROC(Receiver Operating Characteristic)曲线
很多模型是为测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阔值(threshold)进行比较,若大于阈值则分为正例,否则为负例。例如,逻辑回归在一般情形下是对每个测试样本预测出一个[0.0,1.0]之间的概率,然后将每一个样本的预测概率与0.5进行比较,大于0.5则判为正例,否则为反例。这个实值或概率预测结果的好坏,直接决定了模型的泛化能力。实际上根据这个实值或概率预测结果,我们可将测试样本进行排序,"最可能"是正例的排在最前面,“最不可能"是正例的排在最后面。这样,分类过程就相当于在这个排序中以某个"截断点”(cut point)将样本分为两部分,前一部分判作正例,后一部分则判作负例。
在不同的应用任务中, 我们可根据任务需求来采用不同的截断点, 例如若我们更重视“精准率”, 则可选择排序中靠前的位置进行截断;若更重视“召回率”, 则可选择靠后的位置进行截断。因此, 排序本身的质量好坏, 体现了综合考虑模型在不同任务下的“期望泛化性能”的好坏, 或者说, “一般情况下”泛化性能的好坏。 ROC曲线则是从这个角度出发来研究模型泛化能力的有理工具。
ROC(Receiver Operating Characteristic, 接收者操作特征)最初源于20世纪70年代的信号检测理论, 描述的是分类混淆矩阵中FPR-TPR两个量之间的相对变化情况,ROC曲线的纵轴是 “真正例率(TP的占比)”(True Positive Rate 简称TPR),横轴是“假正例率(FP的占比)” (False Positive Rate 简称FPR)。ROC曲线显示了当预测数据为正例的预测概率的阈值从1开始逐渐下降时, FP和TP之间关系的变化。
如果二元分类器输出的是对正样本的一个分类概率值,当取不同阈值时会得到不同的混淆矩阵,对应于ROC曲线上的一个点。那么ROC曲线就反映了FPR与TPR之间权衡的情况,通俗地来说,即在TPR随着FPR递增的情况下,谁增长得更快,快多少的问题。TPR增长得越快,曲线越往上屈,AUC就越大,反映了模型的分类性能就越 好。当正负样本不平衡时,这种模型评价方式比起一般的精确度评价方式的好处尤其显著。
ROC曲线的阈值问题
与前面的P-R曲线类似,ROC曲线也是通过遍历所有阈值 来绘制整条曲线的。如果我们不断的遍历所有阈值,预测的正样本和负样本是在不断变化的,相应的在ROC曲线图中也会沿着曲线滑动。
如何判断ROC曲线的好坏?
改变阈值只是不断地改变预测的正负样本数,即TPR和FPR,但是曲线本身是不会变的。那么如何判断一个模型的ROC曲线是好的呢?这个还是要回归到我们的目的:FPR表示模型虚报的响应程度,而TPR表示模型预测响应的覆盖程度。我们所希望的当然是:虚报的越少越好,覆盖的越多越好。所以总结一下就是TPR越高,同时FPR越低(即ROC曲线越陡),那么模型的性能就越好。 参考如下
ROC曲线无视样本不平衡
前面已经对ROC曲线为什么可以无视样本不平衡做了解释,下面我们用动态图的形式再次展示一下它是如何工作的。我们发现:无论红蓝色样本比例如何改变,ROC曲线都没有影响。
AUC(Area Under Curve)
- AUC的值越大表达模型越好
- AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而AUC作为数值可以直观的评价分类器的好坏,值越大越好。
- AUC = 1,是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
- 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
- AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
- AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
AUC的物理意义
曲线下面积对所有可能的分类阈值的效果进行综合衡量。曲线下面积的一种解读方式是看作模型将某个随机正类别样本排列在某个随机负类别样本之上的概率。以下面的样本为例,逻辑回归预测从左到右以升序排列:
指标 描述 scikit-learn函数 Accuracy 准确率 from sklearn.metrics import accuracy_score Precision 精确度 from sklearn.metrics import precision_score Recall 召回率 from sklearn.metrics import recall_score F1 F1指标 from sklearn.metrics import f1_score Confusion Matrix 混淆矩阵 from sklearn.metrics import confusion_matrix ROC ROC曲线 from sklearn.metrics import roc AUC ROC曲线下的面积 from sklearn.metrics import auc \begin{array}{|c|c|c|} \hline \textbf { 指标 } & \textbf { 描述 } & \textbf { scikit-learn函数 } \\ \hline \text { Accuracy } & \text { 准确率 } & \text {from sklearn.metrics import accuracy\_score} \\ \hline \text { Precision } & \text { 精确度 } & \text { from sklearn.metrics import precision\_score } \\ \hline \text { Recall } & \text { 召回率 } & \text { from sklearn.metrics import recall\_score } \\ \hline \text { F1 } & \text { F1指标 } & \text { from sklearn.metrics import f1\_score } \\ \hline \text { Confusion Matrix } & \text { 混淆矩阵 } & \text { from sklearn.metrics import confusion\_matrix } \\ \hline \text { ROC } & \text { ROC曲线 } & \text { from sklearn.metrics import roc } \\ \hline \text { AUC } & \text { ROC曲线下的面积 } & \text { from sklearn.metrics import auc } \\ \hline \end{array} 指标 Accuracy Precision Recall F1 Confusion Matrix ROC AUC 描述 准确率 精确度 召回率 F1指标 混淆矩阵 ROC曲线 ROC曲线下的面积 scikit-learn函数 from sklearn.metrics import accuracy_score from sklearn.metrics import precision_score from sklearn.metrics import recall_score from sklearn.metrics import f1_score from sklearn.metrics import confusion_matrix from sklearn.metrics import roc from sklearn.metrics import auc
回归算法评估指标
- explained_variance_score: 可解释方差的回归评分函数
explain_variance ( y i , y ^ i ) = 1 − var ( y − y ^ ) var ( y ) \text { explain\_variance }\left(y_i, \hat{y}_i\right)=1-\frac{\operatorname{var}(y-\hat{y})}{\operatorname{var}(y)} explain_variance (yi,y^i)=1−var(y)var(y−y^)
- m e a n _ a b s o l u t e _ e r r o r : 平均绝对误差 M A E = 1 m ∣ y i − y ^ i ∣ mean\_absolute\_error: 平均绝对误差 \quad M A E=\frac{1}{m}\left|y_i-\hat{y}_i\right| mean_absolute_error:平均绝对误差MAE=m1∣yi−y^i∣
- mean_squared_error: 平均平方误差 M S E = 1 m ∑ i = 1 m ( y i − y ^ i ) 2 \text {mean\_squared\_error: 平均平方误差 } \quad M S E=\frac{1}{m} \sum_{i=1}^m\left(y_i-\hat{y}_i\right)^2 mean_squared_error: 平均平方误差 MSE=m1∑i=1m(yi−y^i)2
- r2_score: R 2 R^2 R2值 R 2 = 1 − R S S T S S = 1 − ∑ i = 1 m ( y i − y ^ i ) 2 ∑ i = 1 m ( y i − y ˉ ) 2 y ˉ = 1 m ∑ i = 1 m y i R^2=1-\frac{R S S}{T S S}=1-\frac{\sum_{i=1}^m\left(y_i-\widehat{y}_i\right)^2}{\sum_{i=1}^m\left(y_i-\bar{y}\right)^2} \quad \bar{y}=\frac{1}{m} \sum_{i=1}^m y_i R2=1−TSSRSS=1−∑i=1m(yi−yˉ)2∑i=1m(yi−y i)2yˉ=m1∑i=1myi
指标 描述 scikit-learn函数 Mean Square Error (MSE, RMSE) 平均方差 from sklearn.metrics import mean_squared_error Absolute Error (MAE, MAE) 绝对误差 from sklearn.metrics import mean_absolute_error, median_absolute_error R-Squared R 平方值 from sklearn.metrics import r2_score \begin{array}{|c|c|c|} \hline \text { 指标 } & \text { 描述 } & \text { scikit-learn函数 } \\ \hline \begin{array}{l} \text { Mean Square Error } \\ \text { (MSE, RMSE) } \end{array} & \text { 平均方差 } & \text { from sklearn.metrics import mean\_squared\_error } \\ \hline \begin{array}{l} \text { Absolute Error } \\ \text { (MAE, MAE) } \end{array} & \text { 绝对误差 } & \begin{array}{l} \text { from sklearn.metrics import mean\_absolute\_error, } \\ \text { median\_absolute\_error } \end{array} \\ \hline \text { R-Squared } & \mathrm{R} \text { 平方值 } & \text { from sklearn.metrics import r2\_score } \\ \hline \end{array} 指标 Mean Square Error (MSE, RMSE) Absolute Error (MAE, MAE) R-Squared 描述 平均方差 绝对误差 R 平方值 scikit-learn函数 from sklearn.metrics import mean_squared_error from sklearn.metrics import mean_absolute_error, median_absolute_error from sklearn.metrics import r2_score
模型部署与整合
当模型构建好后,将训练好的模型进行部署有几种方式:
- 直接使用训练好的模型对数据做一个预测,然后将预测结果保存到数据库中。
- 直接将模型持久化为磁盘文件的形式,在需要的代码处从磁盘中恢复模型对象,然后使用恢复的模型对象对数据做一个预测。
- 直接将模型参数保存到数据库中,然后在需要的代码处直接从数据库把模型参数加载到代码中,然后根据模型算法原理使用模型参数对数据做一个预测。
模型需要周期性的进行修改、调优的频率包括一个月、一周。
模型的监控与反馈
-
当模型一旦投入到实际生产环境中,模型的效果监控是非常重要的,往往需要关注业务效果和用户体验,所以有时候会进行测试
-
模型需要对用户的反馈进行响应操作,即进行模型修改,但是要注意异常反馈信息对模型的影响,故需要进行必要的数据预处理操作
参考文献
【1】https://www.6aiq.com/article/1549986548173
【2】机器学习, 周志华
【3】图解机器学习算法, 秋藤申野