该文章授权稀土掘金技术社区公众号首发!
✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。
👨💻面向对象: 本篇前言知识主要介绍机器学习,方便小白或AI爱好者学习基础知识。
💚友情提醒: 本文内容可能未能含概机器学习所有知识点,其他内容可以访问本人主页其他文章或个人博客,同时因本人水平有限,文中如有错误恳请指出,欢迎互相学习交流!
💙个人主页: GoAI |💚 公众号: GoAI的学习小屋 | 💛交流群: 704932595 |💜个人简介 : 掘金签约作者、百度飞桨PPDE、领航团团长、开源特训营导师、CSDN、阿里云社区人工智能领域博客专家、新星计划计算机视觉方向导师等,专注大数据与人工智能知识分享。
💻文章目录
《深入浅出OCR》前言知识:机器学习基础 (✨本篇,文末有机器学习总结导图福利!)
《深入浅出OCR》前言知识:机器学习知识总结
一、机器学习概念
机器学习(Machine Learning, ML),说白了,就是让机器去学习。这里的机器指的是计算机,是算法运行的物理载体,你也可以把各种算法本身当做一个有输入和输出的机器。对于一个任务及其表现的度量方法,设计一种算法,让算法能够提取中数据所蕴含的规律,这就叫机器学习。如果输入机器的数据是带有标签的,就称作有监督学习。如果数据是无标签的,就是无监督学习。
首先,什么是机器学习呢?
答:作者的回答是,机器学习等于寻找一种符合 y=f(x)y = f(x)的函数。
其次,如何寻找这个函数?
答:为了寻找函数,首先我们需要给定一个函数集合,通过设计模型来判断函数的好坏,决定选择最好的函数,再进行模型优化。
最后,总结机器学习三板斧。
答:
①前提:设计模型Model
②关键:判断模型的好坏
③升华:选择最好的函数,优化模型
二、 机器学习常见名词总结
当提到人工智能时,我们经常会提到很多专有名词,给初学者学习带来一定困扰。因此,在学习机器学习前,首先我们需要明确以下几个概念。本次GoAI将主要从标签、特征、样本、训练、模型、泛化、过拟合、预测、训练集、验证集、测试集、方差等等概念角度入手,争取让大家弄清楚基础概念。
2.1 主要术语
标签(label)
是我们要预测的事物。
比如,我们从市场上挑了一些苹果。标签可以是连续值(如苹果的甜度,水分),也可以是离散值(苹果的价格,或好坏)
而标签在分类任务中的类别,比如是猫或狗;简单线性回归中的y变量;在监督学习中,标签值是样本的“答案”或“结果”部分。
特征(feature)
是在进行预测时使用的输入变量。
比如苹果的大小,颜色,产地,品牌等都是特征。
特征是输入变量,即简单线性回归中的x变量;在分类任务中的输入图像特征。
简单的机器学习项目可能会使用单个特征,而比较复杂的机器学习项目可能会使用数百万个特征。
样本(example) 是数据集的一行。
比如一个苹果是大的,红色,甜的,红富士牌子,好的等构成一个样本。
在监督学习的样本中,一个样本既有特征,也有标签。在无监督学习的样本中,一个样本只有特征。样本是指数据的特定示例:x。(x表示一个矢量)将样本分为以下两类:
- 有标签样本
- 无标签样本
有标签样本 :同时包含特征的标签,即:labeled examples: {features, label}: (x, y)
这里我们以一个具体实例为例,下表显示了加利福尼亚房价信息的数据集中抽取的5个有标签的样本:
housingMedianAge (特征) | totalRooms (特征) | totalBedrooms (特征) | medianHouseValue (标签) |
---|---|---|---|
15 | 5612 | 1283 | 66900 |
19 | 7650 | 1901 | 80100 |
17 | 720 | 174 | 85700 |
14 | 1501 | 337 | 73400 |
20 | 1454 | 326 | 65500 |
无标签样本 :包含特征,但不包含标签,即:unlabeled examples: {features, ?}: (x, ?)
以下是取自同一住房数据集的3个无标签样本,从表中可以看出不包含房子价值最后一列:
housingMedianAge (特征) | totalRooms (特征) | totalBedrooms (特征) |
---|---|---|
42 | 1686 | 361 |
34 | 1226 | 180 |
33 | 1077 | 271 |
在使用有标签样本训练模型之后,我们会使用该模型预测无标签样本的标签。在垃圾邮件检测器示例中,无标签样本是用户尚未添加标签的新电子邮件。
模型(model) : 模型定义了特征与标签之间的关系。
比如,预测苹果好坏的模型将某些特征(小的、味道酸的)与“坏苹果”紧密联系起来。
模型生命周期的两个阶段:
- 训练 是指创建或学习模型。即:向模型展示有标签样本,让模型逐渐学习特征与标签之间的关系。
- 推理 是指将训练后的模型应用于无标签样本。即:使用经过训练的模型做出有用的预测,在推理期间,可以针对新的无标签样本预测medianHouseValue。
训练集(training set)
数据集的子集,用于训练模型。与验证集和测试集相对。
验证集(validation set)
数据集的一个子集,从训练集分离而来,用于调整超参数。与训练集和测试集相对。
测试集(test set)
数据集的子集,用于在模型经过验证集的初步验证后,进行测试模型。与训练集和验证集相对。
比如,将自己买的很多苹果分为两类,大部分为训练,小部分为测试,然后每种随机打乱与预测具体其他类似特征的苹果是好苹果还是坏苹果。
偏差
偏差度量了模型的期望预测与真实结果的偏离程度, 即刻画了学习算法本身的拟合能力。偏差则表现为在特定分布上的适应能力,偏差越大越偏离真实值。
方差
方差度量了同样大小的训练集的变动所导致的学习性能的变化, 即刻画了数据扰动所造成的影响。方差越大,说明数据分布越分散。
偏差、方差、模型复杂度三者之间的关系使用下图表示会更容易理解:
当模型复杂度上升的时候,偏差会逐渐变小,而方差会逐渐变大。
泛化(generalization)
是指模型依据训练时采用的模型,针对未见过的新数据做出争取预测的能力。
过拟合(overfitting)
创建的模型与训练数据过于匹配,以至于模型无法根据新数据做出正确的预测,使得模型的泛化能力较低。
欠拟合
是指模型拟合程度不高,数据距离拟合曲线较远,或指模型没有很好地捕捉到数据特征,不能很好地拟合数据。换言之,模型在学习的过程中没有很好地掌握它该掌握的知识,模型学习的偏差较大。
从上图a、b、c可以直观看出过拟合、欠拟合及正常拟合的情况,面对不同拟合情况,需要我们进行适当调整。
2.2 其他术语
请参考本人这篇: 机器学习与深度学习基础概念
三、常见机器学习算法简介:
下面主要是对机器学习算法进行简单总结,上述概念中我们提到,如果输入机器的数据是带有标签的,就称作有监督学习。如果数据是无标签的,就是无监督学习。
3.1 监督学习(SupervisedLearning):
有类别标签的学习,基于训练样本的输入、输出训练得到最优模型,再使用该模型预测新输入的输出;
代表算法:决策树、朴素贝叶斯、逻辑回归、KNN、SVM、神经网络、随机森林、AdaBoost、遗传算法;
3.2 半监督学习(Semi-supervisedLearning):
同时使用大量的未标记数据和标记数据,进行模式识别工作;
代表算法:self-training(自训练算法)、generative models生成模型、SVMs半监督支持向量机、graph-basedmethods图论方法、 multiviewlearing多视角算法等;
3.3 无监督学习(UnsupervisedLearning):
无类别标签的学习,只给定样本的输入,自动从中寻找潜在的类别规则;
代表算法:主成分分析方法PCA等,等距映射方法、局部线性嵌入方法、拉普拉斯特征映射方法、黑塞局部线性嵌入方法、局部切空间排列方法等;
四、机器学习模型具体分类
作者从机器学习概念角度出发,将其按照模型类型分为监督学习模型、无监督学习模型等几类:
(一)有监督学习
有监督学习通常是利用带有专家标注的标签的训练数据,学习一个从输入变量X到输入变量Y的函数映射。即Y = f (X),训练数据通常是(n×x,y)的形式,其中n代表训练样本的大小,x和y分别是变量X和Y的样本值。
利用有监督学习解决的问题大致上可以被分为三类:
1.分类问题: 预测某一样本所属的类别(离散的)。比如,我想预测给定其他人(从数据的角度来说,是给出一个人的数据结构,包括:身高,年龄,体重等信息),然后判断是性别,或者是否健康。
2.回归问题: 预测某一样本的所对应的实数输出(连续的)。比如预测某一地区人的平均身高。
线性回归,逻辑回归,分类回归树,朴素贝叶斯,K最近邻算法均是有监督学习的例子。
3.集成学习: 集成学习也是一种有监督学习。它是将多个不同的相对较弱的机器学习模型的预测组合起来,用来预测新的样本。随机森林和XGBoost算法是集成技术的例子。
4.1 分类算法
分类算法和回归算法是对真实世界不同建模的方法。分类模型是认为模型的输出是离散的,例如大自然的生物被划分为不同的种类,是离散的。回归模型的输出是连续的,例如人的身高变化过程是一个连续过程,而不是离散的。
分类具体方法简介:
1.SVM:全称Support Vector Machine(支持向量机),在特征空间上找到最佳的超平面使训练集正负样本的间隔最大;是解决二分类问题的有监督学习算法,引入核方法后也可用来解决非线性问题;
2.Adaboost:全称Adaptive Boosting(自适应增强),对同一个训练集训练不同的弱分类器,把这些弱分类器集合起来,构成一个更强的强分类器;
3.决策树算法(Decision Tree):处理训练数据,构建决策树模型,再对新数据进行分类;
4.随机森林算法(Random Forest):使用基本单元(决策树),通过集成学习将多棵树集成;
5.朴素贝叶斯(Naive Bayes):根据事件的先验知识描述事件的概率,对联合概率建模来获得目标概率值;
6.神经网络(Neural Networks):模仿动物神经网络行为特征,将许多个单一“神经元”联结在一起,通过调整内部大量节点之间相互连接的关系,进行分布式并行信息处理。
3.1.1 常用分类算法
算法 | 优点 | 缺点 |
---|---|---|
Bayes 贝叶斯分类法 | 1)所需估计的参数少,对于缺失数据不敏感。 2)有着坚实的数学基础,以及稳定的分类效率。 |
1)需要假设属性之间相互独立,这往往并不成立。(喜欢吃番茄、鸡蛋,却不喜欢吃番茄炒蛋)。 2)需要知道先验概率。 3)分类决策存在错误率。 |
Decision Tree决策树 | 1)不需要任何领域知识或参数假设。 2)适合高维数据。 3)简单易于理解。 4)短时间内处理大量数据,得到可行且效果较好的结果。 5)能够同时处理数据型和常规性属性。 |
1)对于各类别样本数量不一致数据,信息增益偏向于那些具有更多数值的特征。 2)易于过拟合。 3)忽略属性之间的相关性。 4)不支持在线学习。 |
SVM支持向量机 | 1)可以解决小样本下机器学习的问题。 2)提高泛化性能。 3)可以解决高维、非线性问题。超高维文本分类仍受欢迎。 4)避免神经网络结构选择和局部极小的问题。 |
1)对缺失数据敏感。 2)内存消耗大,难以解释。 3)运行和调参略烦人。 |
KNN K近邻 | 1)思想简单,理论成熟,既可以用来做分类也可以用来做回归; 2)可用于非线性分类; 3)训练时间复杂度为O(n); 4)准确度高,对数据没有假设,对outlier不敏感; |
1)计算量太大。 2)对于样本分类不均衡的问题,会产生误判。 3)需要大量的内存。 4)输出的可解释性不强。 |
Logistic Regression逻辑回归 | 1)速度快。 2)简单易于理解,直接看到各个特征的权重。 3)能容易地更新模型吸收新的数据。 4)如果想要一个概率框架,动态调整分类阀值。 |
特征处理复杂。需要归一化和较多的特征工程。 |
Neural Network 神经网络 | 1)分类准确率高。 2)并行处理能力强。 3)分布式存储和学习能力强。 4)鲁棒性较强,不易受噪声影响。 |
1)需要大量参数(网络拓扑、阀值、阈值)。 2)结果难以解释。 3)训练时间过长。 |
Adaboosting | 1)adaboost是一种有很高精度的分类器。 2)可以使用各种方法构建子分类器,Adaboost算法提供的是框架。 3)当使用简单分类器时,计算出的结果是可以理解的。而且弱分类器构造极其简单。 4)简单,不用做特征筛选。 5)不用担心overfitting。 |
对outlier比较敏感 |
3.1.2 分类算法的评估方法
分类评估方法主要功能是用来评估分类算法的好坏,而评估一个分类器算法的好坏又包括许多项指标。了解各种评估方法,在实际应用中选择正确的评估方法是十分重要的。
-
常用术语
这里首先介绍几个常见的模型评价术语,现在假设我们的分类目标只有两类,为正例(positive)和负例(negative)分别是:- True positives(TP): 被正确地划分为正例个数,即实际为正例且被分类器划分为正例实例数;
- False positives(FP): 被错误地划分为正例个数,即实际为负例但被分类器划分为正例实例数;
- False negatives(FN):被错误地划分为负例个数,即实际为正例但被分类器划分为负例实例数;
- True negatives(TN): 被正确地划分为负例个数,即实际为负例且被分类器划分为负例实例数。
接下来针对上述四种术语的混淆矩阵,做以下说明:
1)P=TP+FN表示实际为正例的样本个数。
2)True、False描述的是分类器是否判断正确。
3)Positive、Negative是分类器分类结果,如果正例计为1、负例计为-1,即positive=1、negative=-1。用1表示True,-1表示False,那实际类标=TF*PN,TF为true或false,PN为positive或negative。
4)如True positives(TP)的实际类标=1*1=1为正例,False positives(FP)的实际类标=(-1)*1=-1为负例,False negatives(FN)的实际类标=(-1)*(-1)=1为正例,True negatives(TN)的实际类标=1*(-1)=-1为负例。
3.1.3常用分类任务评价指标
-
正确率(accuracy)
正确率是我们最常见的评价指标,accuracy = (TP+TN)/(P+N),正确率是被分对的样本数在所有样本数中的占比,通常来说,正确率越高,分类器越好。 -
错误率(error rate)
错误率则与正确率相反,描述被分类器错分的比例,error rate = (FP+FN)/(P+N),对某一个实例来说,分对与分错是互斥事件,所以accuracy =1 – error rate。 -
灵敏度(sensitivity)
sensitivity = TP/P,表示的是所有正例中被分对的比例,衡量了分类器对正例的识别能力。 -
特异性(specificity)
specificity = TN/N,表示的是所有负例中被分对的比例,衡量了分类器对负例的识别能力。 -
精度(查准率)(precision)
precision=TP/(TP+FP),精度是精确性的度量,表示被分为正例的示例中实际为正例的比例。 -
召回率(查全率)(recall)
召回率是覆盖面的度量,度量有多个正例被分为正例,recall=TP/(TP+FN)=TP/P=sensitivity,可以看到召回率与灵敏度是一样的。 -
其他评价指标
计算速度:分类器训练和预测需要的时间;
鲁棒性:处理缺失值和异常值的能力;
可扩展性:处理大数据集的能力;
可解释性:分类器的预测标准的可理解性,像决策树产生的规则就是很容易理解的,而神经网络的一堆参数就不好理解,我们只好把它看成一个黑盒子。
-
F1值
精度和召回率反映了分类器分类性能的两个方面。如果综合考虑查准率与查全率,可以得到新的评价指标F1-score,也称为综合分类率:F1=2×precision×recallprecision+recallF1=frac{2 times precision times recall}{precision + recall}。
多分类任务评价指标:
为综合多个类别的分类情况,评测系统整体性能,经常采用还有微平均F1(micro-averaging)和宏平均F1(macro-averaging )两种指标。
(1)宏平均F1与微平均F1是以两种不同的平均方式求的全局F1指标。
(2)宏平均F1的计算方法先对每个类别单独计算F1值,再取这些F1值的算术平均值作为全局指标。
(3)微平均F1的计算方法是先累加计算各个类别的a、b、c、d的值,再由这些值求出F1值。
(4)由两种平均F1的计算方式不难看出,宏平均F1平等对待每一个类别,所以它的值主要受到稀有类别的影响,而微平均F1平等考虑文档集中的每一个文档,所以它的值受到常见类别的影响比较大。
ROC曲线和PR曲线
如下图所示,ROC曲线是(Receiver Operating Characteristic Curve,受试者工作特征曲线)的简称,是以灵敏度(真阳性率)为纵坐标,以1减去特异性(假阳性率)为横坐标绘制的性能评价曲线。可以将不同模型对同一数据集的ROC曲线绘制在同一笛卡尔坐标系中,ROC曲线越靠近左上角,说明其对应模型越可靠。也可以通过ROC曲线下面的面积(Area Under Curve, AUC)来评价模型,AUC越大,模型越可靠。
PR曲线
Recall召回率(查全率): Recall=TPTP+FNRecall=frac{TP}{TP+FN}
含义:TP除以第一列,即预测为1实际为1的样本在所有真实为1类别中的占比。等价于真阳率。
Precision精准率(查准率): Precision=TPTP+FPPrecision=frac{TP}{TP+FP}
含义:FP除以第一行,即预测为1实际为1的样本在所有预测为1类别中的占比。
PR曲线是Precision Recall Curve的简称,描述的是precision和recall之间的关系,以recall为横坐标,precision为纵坐标绘制的曲线。该曲线的所对应的面积AUC实际上是目标检测中常用的评价指标平均精度(Average Precision, AP)。AP越高,说明模型性能越好。
分类任务评价指标参考学习:blog.csdn.net/u013250861/…
4.2 回归算法
4.2.1 常见回归算法
- 线性回归
- 多项式回归
- 支持向量机回归
- 决策树回归
- 随机森林回归
- LASSO 回归
- Ridge 回归
- ElasticNet 回归
- XGBoost 回归
4.1.2 随机森林回归
(1)随机森林回归概念
随机森林回归是一种基于集成学习的算法,它通过构建多个决策树并将它们的预测结果进行集成来进行回归任务。在随机森林中,每棵决策树都是独立并在随机选择的子样本上进行训练的,这样可以有效地减少过拟合的风险。随机森林通过将多个决策树的预测结果进行平均或加权平均,从而得到最终的回归结果。
(2)随机森林回归的基本原理如下:
随机选择样本:从原始训练集中随机选择一部分样本,构成一个子样本集。这样可以使得每棵决策树都在不同的样本集上进行训练,从而增加模型的多样性。
随机选择特征:对于每个决策树的每个节点,在选择最佳划分特征时,只考虑随机选择的一部分特征。这样可以防止某些特征对整个模型的影响过大,从而提高模型的鲁棒性。
构建决策树:在每个子样本集上使用某种决策树算法(如CART算法)构建一棵决策树。决策树的生长过程中,通常采用递归地选择最佳划分特征,将数据集划分为不纯度最小的子集。
集成预测:对于新的输入样本,通过将多棵决策树的预测结果进行平均或加权平均,从而得到最终的回归结果。
(4)随机森林的优点:
能够处理高维数据和大规模数据集。
具有较好的泛化性能,能够有效地减少过拟合的风险。
能够处理缺失值和异常值。
对于非线性关系的数据,具有较强的拟合能力。
XGBoost 回归
XGBoost是boosting算法的其中一种。Boosting算法的思想是将许多弱分类器集成在一起形成一个强分类器。因为XGBoost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的分类器。而所用到的树模型则是CART回归树模型。
参考学习:一文读懂机器学习大杀器xgboost原理
4.2.2 回归算法的评估指标
平均绝对值误差(MAE)
均绝对值误差就是计算每一个样本的预测值和真实值的差的绝对值,然后求和再取平均值。 其公式为:
MAE(y,y^)=1m∑i=1m(∣yi−f(xi)∣)MAE(y, hat {y}) = frac{1}{m} sum_{i=1}^m{(|y_i – f(x_i)|)}
其中,yiy_i,f(xi)f(x_i)和y^hat {y}为模型的预测值。
均方误差(MSE)
均方误差就是计算每一个样本的预测值与真实值差的平方,然后求和再取平均值。 其公式为:
MSE(y,y^)=1m∑i=1m(yi−f(xi))2MSE(y, hat {y}) = frac{1}{m} sum_{i=1}^m{(y_i – f(x_i))^2}
均方根误差(RMSE)
均方根误差就是在均方误差的基础上再开方。 其公式为:
RMSE(y,y^)=1m∑i=1m(yi−f(xi))2RMSE(y, hat {y}) = sqrt {frac{1}{m} sum_{i=1}^m{(y_i – f(x_i))^2}}
平均绝对百分比误差(MAPE, Mean Absolute Percentage Error)
MAPE是计算对相对误差损失的预期。所谓相对误差,就是绝对误差和真值的百分比。
MAPE(y,y^)=1nsamples∑i=0nsample−1∣yi−y^i∣max(ϵ,∣yi∣)MAPE(y, hat {y}) = frac {1} {n_{samples} } sum_{i=0}^{n_{sample}-1} frac {|y_i- hat y_i|}{max(epsilon, |y_i|)}
其中ϵepsilon是一个任意小的正数,以避免当 y 为零时,分母为零,出现未定义的结果。
决定系数R^2(R-Squared)
R2(y,y^)=1−∑i=1n(yi−y^i)2∑i=1n(yi−y‾)2=1−1n∑i=1n(yi−y^i)21n∑i=1n(yi−y‾)2=1−MSEVarR^2(y, hat {y}) = 1 – frac { sum_{i=1}^n { (y_i – hat y_i)^2 } }{ sum_{i=1}^n{(y_i-overline y)^2}} =1 – frac { frac {1} {n} sum_{i=1}^n { (y_i – hat y_i)^2 } }{ frac {1} {n} sum_{i=1}^n{(y_i-overline y)^2}} = 1 – frac {MSE} {Var}
决定系数R^2将已解释的方差除以总方差,代表了总方差被预测变量所解释或决定的比率。值为0~1之间的值,越接近于1,说明模型的效果越好。
针对多个指标配合使用的情况:
MAE和RMSE一起使用,可以看出样本误差的离散程度。比如RMSE远大于MAE时,可以得知不同样例的误差差别很大。
MAE和MAPE一起使用,再结合 y‾overline y可以估算模型对不同数量级样例的拟合程度。比如,MAE远大于MAPE * y‾overline y ,则可能是模型对真实值小的样本预测更准。可以考虑为不同数量级的样本建立不同的模型。
回归算法参考学习:blog.csdn.net/qq_42363032…
4.3 集成学习
集成学习是一种将不同学习模型(比如分类器)的结果组合起来,通过投票或平均来进一步提高准确率。一般,对于分类问题用投票;对于回归问题用平均。这样的做法源于“众人拾材火焰高”的想法。
集成算法主要有三类:Bagging,Boosting 和Stacking。
4.3.1 bagging思想
bagging是集成学习的思想之一,随机森林是基分类器为决策树的bagging算法。bagging思想首先是采用M轮的bootstrap自助采样,每轮采样对应训练一个弱分类器,并且训练的时候是并行计算的,最后将这M个弱分类器进行组合来实现预测的。由于自助采样,所以bagging是通过样本扰动的方式来增加基分类器的差异性,差异性越大,集成效果越好。因此,bagging的基学习器应为对训练样本扰动敏感的算法。
Bagging的第一步是针对数据集,利用自助抽样法(Bootstrap Sampling method)建造多个模型。
所谓的自助抽样,是指得到一个由原始数据集中随机的子集组成的新的训练集。每一个这样的训练集都和原始训练集的大小相同,但其中有一些重复的数据,因此并不等于原始训练集。并且,我们将原始的数据集用作测试集。因此,如果原始数据集的大小为N,那么新的训练集的大小也为N(其中不重复的数据数量为2N/3),测试集的大小为N。
Bagging的第二步是在抽样的不同的训练集上,利用相同的算法建造多个模型。
在这里,我们以随机森林为例。决策树是靠每一个节点在最重要的特征处分离来减小误差的,但与之不同,随机森林中,我们选择了随机筛选的特征来构造分裂点。这样可以减小所得预测之间的相关性。每一个分裂点搜索的特征的数量,是随机森林算法的参数。
因此,用随机森林算法实现的Bagging,每一个树都是用随机样本构造的,每一个分裂点都是用随机的预测器构造的。
4.3.2 随机森林Bagging
随机森林是由很多决策树构成的,不同决策树之间没有关联。当我们进行分类任务时,新的输入样本进入,就让森林中的每一棵决策树分别进行判断和分类,每个决策树会得到一个自己的分类结果,决策树的分类结果中哪一个分类最多,那么随机森林就会把这个结果当做最终的结果。因此,随机森林算法(多个模型)是袋装决策树(单个模型)的提升版。
- 一个样本容量为N的样本,有放回的抽取N次,每次抽取1个,最终形成了N个样本。这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本。
- 当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m << M。然后从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。
- 决策树形成过程中每个节点都要按照步骤2来分裂(很容易理解,如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。
- 按照步骤1~3建立大量的决策树,这样就构成了随机森林了。
4.3.3 boosting思想
Boosting一族是可将弱学习器提升为强学习器的算法,它的思想就是每一个基分类器纠正前一个基分类器的错误,至于纠正的方式不同所以有不同的boosting算法。算法思想如下:
先从训练集训练出一个基学习器。
再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续得到较大的关注。
然后基于调整后的样本分布来训练下一个基学习器。
如此重复进行,直到基学习器数目达到指定的阈值T位置。
再将这T个基学习器进行加权结合得到强集成学习器。
4.3.4 Adaboost实现Boosting
AdaBoost思想是在boosting思想的基础上,具体流程如下:
- 初始化训练集权重,从初始训练集里训练得到一个基学习器;
- 增加错分样本的权重,减少分对样本的权重增加错误率小的基学习器的权重,减少错误率大的基学习器的权重;
- 用调整后的(样本权重归一化)样本训练下一个基学习器,直到基学习器的数目达到实现指定的值,然后将这几个基学习器加权进行投票。
第一步: 从一个决策树桩开始,根据一个输入变量作出决定
从图中可以看见,其中有两个圆圈分类错误,因此我们可以给他们赋予更大的 权重,运用到下一个决策树桩中。
第二步: 依据不同的输入变量,构造下一个决策树桩
可以发现第二个决策将会尝试将更大权重的数据预测正确。和如图的情况中, 我们需要对另外三个圆圈赋予更大的权重。
第三步: 依据不同的输入变量,训练不同的决策树桩
之前步骤一样,只是这次被预测错误的是三角形的数据,因此我们需要对其赋 予更大的权重。
第四步: 将决策树桩组合起来,将三个模型组合起来,显而易见,集成的模型比单个模型准确率更高。
(二) 无监督学习
无监督学习问题处理的是,只有输入变量X没有相应输出变量的训练数据。它利用没有专家标注训练数据,对数据的结构建模。
可以利用无监督学习解决的问题,大致分为两类:
4.4 关联规则:
关联规则算法在数据库的候选项集中用来挖掘出现频繁项集,并且发现他们之间的关联规则。
发现不同事物之间同时出现的概率。在购物篮分析中被广泛地应用。如果发现买面包的客户有百分之八十的概率买鸡蛋,那么商家就会把鸡蛋和面包放在相邻的货架上。
4.5 聚类问题:
将相似的样本划分为一个簇(cluster)。与分类问题不同,聚类问题预先并不知道类别,自然训练数据也没有类别的标签。
K-Means算法是无监督的聚类算法,实现起来比较简单,聚类效果也不错,因此应用很广泛。它是一个迭代算法的聚类算法,它将相似的数据化到一个簇(cluster)中。该算法计算出k个簇的中心点,并将数据点分配给距离中心点最近的簇。
k-means初始化:
-
选择一个k值。如图6,k=3。
-
随机分配每一个数据点到三个簇中的任意一个。
-
计算每一个簇的中心点。如图6,红色,蓝色,绿色分别代表三个簇的中心点。
-
将每一个观察结果与当前簇比较:
-
重新分配每一个点到距中心点最近的簇中。如图6,上方5个点被分配给蓝色中心点的簇。
-
重新计算中心点:
-
为新分配好的簇计算中心点。如图六,中心点改变。迭代,不再改变则停止:
-
重复步骤2-3,直到所有点所属簇不再改变。
维度约减: 顾名思义,维度约减是指减少数据的维度同时保证不丢失有意义的信息。利用特征提取方法和特征选择方法,可以达到维度约减的效果。特征选择是指选择原始变量的子集。特征提取是将数据从高纬度转换到低纬度。主成分分析算法就是特征提取的方法。
Apriori算法,K-means算法,PCA主成分分析都属于无监督学习。
(三)强化学习
通过学习可以获得最大回报的行为,强化学习可以让agent(个体)根据自己当前的状态,来决定下一步采取的动作。
强化学习算法通过反复试验来学习最优的动作。这类算法在机器人学中被广泛应用。在与障碍物碰撞后,机器人通过传感收到负面的反馈从而学会去避免冲突。在视频游戏中,我们可以通过反复试验采用一定的动作,获得更高的分数。Agent能利用回报去理解玩家最优的状态和当前他应该采取的动作。
五、常见损失函数总结:
损失函数概念:
损失函数(Loss Function)反应的是模型对数据的拟合程度,常见的损失函数种类包括:最小二乘损失函数、交叉熵损失函数、回归中使用的smooth L1损失函数等。
在机器学习中的所有算法都依赖于最小化或最大化一个函数,我们称之为损失函数(loss function)。针对单个训练样本而言,给定一个模型输出和一个真实值,损失函数输出一个实值误差损失,用来衡量预测模型在预测预期结果好坏的标准。求函数最小点最常用的方法是梯度下降法。
常用损失函数如下所示:
1、L1范数损失 计算output和target之差的绝对值。
torch.nn.L1Loss(reduction='mean')
参数:
reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean。
2、均方误差损失MSELoss 计算output和target之差的均方差。
torch.nn.MSELoss(reduction='mean')
参数:
reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean。
3、交叉熵损失CrossEntropyLoss
torch.nn.CrossEntropyLoss(weight=None, ignore_index=-100, reduction='mean')
在多分类任务中,经常采用softmax激活函数+交叉熵损失函数,因为交叉熵描述了两个概率分布的差异,然而神经网络输出的是向量,并不是概率分布的形式。所以需要softmax激活函数将一个向量进行“归一化”成概率分布的形式,再采用交叉熵损失函数计算loss。
4、 KL散度损失KLDivLoss 计算input和target之间的KL散度。KL散度可用于衡量不同的连续分布之间的距离,在连续的输出分布的空间上(离散采样)上进行直接回归时很有效。
torch.nn.KLDivLoss(reduction='mean')
参数:
reduction-三个值,none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean。
5、二进制交叉熵损失BCELoss 二分类任务时的交叉熵计算函数。用于测量重构的误差,例如自动编码机。注意目标的值t的范围为0到1之间。
torch.nn.BCELoss(weight=None, reduction='mean')
参数:
weight (Tensor, optional) – 自定义的每个 batch 元素的 loss 的权重. 必须是一个长度为 “nbatch” 的 的 Tensor
6 、BCEWithLogitsLoss
BCEWithLogitsLoss损失函数把Sigmoid层集成到了BCELoss类中。该版比用一个简单的Sigmoid层和BCELoss在数值上更稳定,因为把这两个操作合并为一个层之后,可以利用log-sum-exp的技巧来实现数值稳定。
torch.nn.BCEWithLogitsLoss(weight=None, reduction='mean', pos_weight=None)
参数:
weight (Tensor, optional) – 自定义的每个 batch 元素的 loss 的权重. 必须是一个长度 为 “nbatch” 的 Tensor
六、机器学习算法总结:
类别 | 方法 | 适用情况 | 损失函数 | 学习策略 | 优化算法 |
---|---|---|---|---|---|
监督学习 | 线性模型 | 二分类 | MSE | 极小化误分类点到超平面距离 | 最小二乘/梯度下降 |
监督学习 | 逻辑回归 | 二分类 | 对数损失函数 | 极大似然估计 | 梯度下降 |
决策树 | 多分类 | 对数似然损失 | 极大似然估计 | 特征选择、生成、剪枝 | |
支持向量机 | 二分类 | 合页损失函数 | 支持向量离超平面软间隔最大化 | 序列最小最优化算法SMO | |
朴素贝叶斯 | 多分类 | 对数损失函数 | 极大似然估计、极大后验概率估计 | EM算法 |
七、 机器学习实战:
机器学习步骤
以随机森林模型为例,机器学习流程通常包括以下几个主要的步骤:
1.数据准备: 首先,需要准备用于训练和测试模型的数据集。数据集应包含特征和对应的目标变量。特征是用于预测目标变量的属性或特性,而目标变量是需要进行回归预测的值。通常,需要将数据集划分为训练集和测试集,其中训练集用于训练模型,测试集用于评估模型的性能。
2.构建模型 在Scikit-learn库中,可以使用提供的方法类来构建对机器学习模型。以随机森林方法为例,可以设置一些参数来控制随机森林的行为,例如决策树的数量、特征选择的方式、决策树的生长方式等。可以根据实际问题和需求进行参数的调整。
3.训练模型: 使用训练集对模型进行训练。训练随机森林模型时将根据训练集中的样本和目标变量的值来构建多棵决策树,并在每棵树上进行特征选择和划分。
4.预测结果: 使用训练好的随机森林回归模型对测试集中的样本进行预测。模型将对每棵决策树的预测结果进行平均或加权平均,从而得到最终的回归预测结果。
5.模型评估: 通过与真实目标变量的比较,评估模型的性能。可以使用各种回归性能指标,例如均方误差(Mean Squared Error, MSE)、平均绝对误差(Mean Absolute Error, MAE)、决定系数(R-squared)等来评估模型的准确性和泛化能力。
6.模型调优: 根据模型评估的结果,可以对随机森林回归模型进行调优。可以尝试调整随机森林的参数,例如增加或减少决策树的数量、调整特征选择的方式、调整决策树的生长方式等,从而提高模型的性能。
鸢尾花分类任务实战:
构建一个鸢尾花分类预测模型,根据鸢尾花的花萼和花瓣大小将其分为三种不同的品种。
Step1.数据集准备
总共包含150行数据每一行数据由 4 个特征值及一个目标值组成。4 个特征值分别为:萼片长度、萼片宽度、花瓣长度、花瓣宽度。目标值为三种不同类别的鸢尾花,分别为:Iris Setosa、Iris Versicolour、Iris Virginica
#加载数据
data_path='https://b2.7b2.com/home/aistudio/data/data5420/iris.data' #数据文件的路径
data = np.loadtxt(data_path, #数据文件路径
dtype=float, #数据类型
delimiter=',', #数据分隔符
converters={4:iris_type}) #将第5列使用函数iris_type进行转换
#print(data) #data为二维数组,data.shape=(150, 5)
#print(data.shape)
#数据分割
x, y = np.split(data, #要切分的数组
(4,), #沿轴切分的位置,第5列开始往后为y
axis=1) #代表纵向分割,按列分割
x = x[:, 0:2] #在X中我们取前两列作为特征,为了后面的可视化。x[:,0:4]代表第一维(行)全取,第二维(列)取0~2
#print(x)
x_train,x_test,y_train,y_test=model_selection.train_test_split(x, #所要划分的样本特征集
y, #所要划分的样本结果
random_state=1, #随机数种 test_size=0.3) #测试样本占比
Step2.安装环境
numpy:python第三方库,用于科学计算
matplotlib:python第三方库,主要用于进行可视化
sklearn:python的重要机器学习库,其中封装了大量的机器学习算法,如:分类、回归、降维以及聚类
import numpy as np
from matplotlib import colors
from sklearn import svm
from sklearn.svm import SVC
from sklearn import model_selection
import matplotlib.pyplot as plt
Step3.模型训练
#***********************训练模型*********
def train(clf,x_train,y_train):
clf.fit(x_train, #训练集特征向量
y_train.ravel()) #训练集目标值
#***********************训练模型**********
def train(clf,x_train,y_train):
clf.fit(x_train, #训练集特征向量
y_train.ravel()) #训练集目标值
#训练SVM模型
train(clf,x_train,y_train)
Step4.模型评估
#**************并判断a b是否相等,计算acc的均值*************
def show_accuracy(a, b, tip):
acc = a.ravel() == b.ravel()
print('%s Accuracy:%.3f' %(tip, np.mean(acc)))
def print_accuracy(clf,x_train,y_train,x_test,y_test):
#分别打印训练集和测试集的准确率 score(x_train,y_train):表示输出x_train,y_train在模型上的准确率
print('trianing prediction:%.3f' %(clf.score(x_train, y_train)))
print('test data prediction:%.3f' %(clf.score(x_test, y_test)))
#原始结果与预测结果进行对比 predict()表示对x_train样本进行预测,返回样本类别
show_accuracy(clf.predict(x_train), y_train, 'traing data')
show_accuracy(clf.predict(x_test), y_test, 'testing data')
#计算决策函数的值,表示x到各分割平面的距离
print('decision_function:n', clf.decision_function(x_train))
# 模型评估
print_accuracy(clf,x_train,y_train,x_test,y_test)
Step5.可视化
#***********************训练模型*********
def draw(clf, x):
iris_feature = 'sepal length', 'sepal width', 'petal lenght', 'petal width'
# 开始画图
x1_min, x1_max = x[:, 0].min(), x[:, 0].max() #第0列的范围
x2_min, x2_max = x[:, 1].min(), x[:, 1].max() #第1列的范围
x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j] #生成网格采样点
grid_test = np.stack((x1.flat, x2.flat), axis=1) #stack():沿着新的轴加入一系列数组
print('grid_test:n', grid_test)
# 输出样本到决策面的距离
z = clf.decision_function(grid_test)
print('the distance to decision plane:n', z)
grid_hat = clf.predict(grid_test) # 预测分类值 得到【0,0.。。。2,2,2】
print('grid_hat:n', grid_hat)
grid_hat = grid_hat.reshape(x1.shape) # reshape grid_hat和x1形状一致
#若3*3矩阵e,则e.shape()为3*3,表示3行3列
cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
cm_dark = mpl.colors.ListedColormap(['g', 'b', 'r'])
plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light) # pcolormesh(x,y,z,cmap)这里参数代入
# x1,x2,grid_hat,cmap=cm_light绘制的是背景。
plt.scatter(x[:, 0], x[:, 1], c=np.squeeze(y), edgecolor='k', s=50, cmap=cm_dark) # 样本点
plt.scatter(x_test[:, 0], x_test[:, 1], s=120, facecolor='none', zorder=10) # 测试点
plt.xlabel(iris_feature[0], fontsize=20)
plt.ylabel(iris_feature[1], fontsize=20)
plt.xlim(x1_min, x1_max)
plt.ylim(x2_min, x2_max)
plt.title('svm in iris data classification', fontsize=30)
plt.grid()
plt.show()
八、机器学习导图总结分享
以下是作者自己整理的机器学习笔记思维导图,这里免费分享供大家学习,导图和笔记后续会继续更新。
链接:app.yinxiang.com/fx/339fe142…
本文参考及优秀资料推荐: