社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

机器学习入门,看这一篇就够了

图灵人工智能 • 1 周前 • 97 次点击  

单击上方图灵人工智能”,选择“星标”公众号

您想知道的人工智能干货,第一时间送达

图片
转自机器学习初学者,仅用于学术分享,如有侵权留言删除

1.机器学习概述

1.1  机器学习的定义

机器学习(Machine Learning,ML)是目前信息技术中最热门的方向之一。在这本书中,我们对机器学习的各类机器学习算法进行详细讲解,并将熟练掌握这门前沿科学技术。

机器学习的定义虽然没有学术界统一标准,但业界广泛采用Arthur Samuel的经典表述:“在进行特定编程的情况下,给予计算机学习能力的技术”。该定义强调机器通过数据自主获取知识的能力,而非依赖预设指令。对研究人员来说,最终的研究目标是有一天做出一个和人类一样聪明的机器。实现这个想法任重而道远,目前普遍的看法认为,实现这个目标最好的方法是通过让机器试着模仿人的大脑学习。机器学习与人工智能、深度学习的关系可以用图1-1表示:

图1-1 机器学习与人工智能、深度学习之间的关系

人工智能(Artificial Intelligence,AI)为顶层范畴,旨在实现机器的智能决策;机器学习(Machine Learning,ML)是AI的核心子集,通过数据驱动提升系统性能;深度学习(Deep Learning,DL)作为ML的分支,依托神经网络架构处理复杂模式识别。

1.2 机器学习的范围

机器学习的范围用图来表示如图1-2。

图1-2 机器学习的范围

机器学习的应用范围广泛,包括但不限于模式识别、计算机视觉、数据挖掘、语音识别、统计学习和自然语言处理等领域。以下是一些典型的机器学习应用案例:

数据挖掘:随着网络和自动化技术的飞速发展,我们拥有比以往任何时候都更庞大的数据集。以硅谷为例,众多公司致力于收集网络上的点击流数据(即用户在网页上的点击行为数据),并运用机器学习算法进行深度分析。这使他们能够精准把握用户行为模式和偏好,从而提供更加个性化的服务和产品推荐,在竞争激烈的市场中占据优势。

医疗记录分析:自动化的普及催生了电子医疗记录的广泛应用。如果能将海量医疗记录转化为有价值的医学知识,我们将有望深入理解各类疾病的发生机制、发展规律以及治疗效果,这对于提升医疗服务质量和推动医学研究进步具有不可估量的意义。

计算生物学:生物学家们积累了海量的基因数据序列、DNA 序列等宝贵资料。借助机器学习算法,研究人员能够挖掘这些复杂数据中的隐藏信息,进一步揭开人类基因组的神秘面纱,为生命科学研究和医学创新提供关键支撑,其潜在价值不言而喻。

交通领域 -自动驾驶:自动驾驶技术作为机器学习在交通领域的重要应用,正逐步走向成熟并开始了小范围的商业化应用。它有望彻底变革未来的出行方式,提升交通效率,减少人为驾驶失误引发的事故,为社会带来更安全、便捷的出行体验。

电商领域:电商巨头们利用机器学习技术深度剖析消费者的购物习惯,构建精准的用户画像。基于此,平台能够为用户量身定制个性化的商品推荐列表,提升用户购物体验的同时,也极大地促进了商品销售和商家收益的增长。

音乐与影视领域:各大音乐和影视流媒体平台借助机器学习算法,依据用户的收听、观看历史以及评价数据,为用户提供了一个个独一无二的个性化推荐服务。这些平台拥有庞大的用户基础,显然无法为每个用户单独编写定制程序,而机器学习算法能够高效地从用户行为数据中学习规律,实现大规模的个性化服务。

综上所述,机器学习能够解决诸多关键问题。说到底,机器学习的强项在于基于给定的数据进行预测。具体来说,它能完成数据清洗和特征选择,识别出最具代表性和相关性的数据特征;确定适配的算法模型,并不断优化模型参数,最终实现精准的结果预测。从日常生活的个性化推荐到前沿科学的基因研究,机器学习正以前所未有的深度和广度赋能各个领域,持续推动社会的进步与发展。

1.3 机器学习的类型

机器学习一般包括监督学习、无监督学习、强化学习。有时还包括半监督学习、主动学习。本书限于篇幅,只分为监督学习和无监督两部分,强化学习和半监督学习不包括在本书内容中。

本书将机器学习算法按照传统形式划分,划分结果见图1-3:

图1-3机器学习的类型

目前存在几种不同类型的学习算法。其中主要的两种类型我们称之为监督学习和无监督学习。

注意:强化学习将在第7章讲解。

1.监督学习

绝大部分机器学习问题属于监督学习(Supervised Learning)。监督学习在有些教材中又称为有导师学习,它指的是利用有标签数据进行训练从而得到预测模型的学习任务。所谓的有标签数据由一个输入对象(通常是向量)和一个期望输出值(通常是标量)组成。预测模型对给定的输入产生相应的输出。

上述定义太过抽象,简单地说,就是训练数据有标签,即对于输入数据,能预测

我们用具体的事例介绍什么是监督学习。

图1-4展示了机器学习的基本流程:首先,利用训练数据作为输入,通过机器学习算法从中提取关键特征并构建模型,最终利用该模型对新的输入数据进行预测,输出预测结果。

比如要解决房价预测问题,我们利用训练集(比如房屋的尺寸)进行学习,从而得到一个假设,预测出该房屋的交易价格作为输出变量,输出为结果。

图1-4机器学习算法的工作方式

监督学习算法主要有两种,如果预测的标签是连续的,那么就是回归(Regression、Prediction)问题,如果预测的标签是离散的,那么就是分类(Classification)问题。

我们通过例子来解释监督学习的分类和回归:

回归(Regression、Prediction)的主要案例:

(1) 如何预测上海浦东的房价?

(2) 未来的股票市场走向?

监督学习是一种通过给定的学习算法训练数据集来构建预测模型的方法。在房价预测的例子中,我们会提供一系列已知实际售价的房子数据。然后,利用监督学习算法,从这些数据中学习到房价与各种特征之间的关系,从而训练出一个预测模型。基于这个模型,我们可以对未知价格的房子进行预测,得出一个连续值的结果,即该房子的估计价格。同样地,股票价格的预测也是基于历史数据,通过监督学习算法来构建模型,预测未来的股票价格走势,同样得到一个连续值的结果。在学术上,这类预测连续数值的问题被称为回归问题。

分类(Classification)的主要案例:

(1) 身高1.65m,体重100kg的男人肥胖吗?

(2) 根据肿瘤的体积、患者的年龄来判断良性或恶性?

分类指的是,我们基于预测模型,推测出离散的输出值:0或1(良性或恶性)。第一个问题,是否肥胖,可以用离散值表示:

0 代表不肥胖,1 表示肥胖,第1类实际上,在很多分类问题中,输出可能不止两个离散值。比方说假如存在三种乳腺癌,此时预测离散输出存在四个值0、1、2、3。其中,0 代表良性,1表示第1类乳腺癌,2表示第2类乳腺癌,3表示第3乳腺癌。这同样也是分类问题,只不过一般称之为多分类问题。

分类的类别为两个时,成为二分类问题。

比如:根据肿瘤的体积、患者的年龄来判断良性或恶性?或者根据用户的年龄、职业、存款数量来判断信用卡是否会违约?

这两个问题都是二分类问题。

分类的类别为多个时,称为多类分类问题。

比如:身高1.85m,体重100kg的男人穿什么尺码的T恤?

假设尺码有S、M、L等三种,那这个问题就是多分类问题,分成三类。

多类分类问题如何解决?

当只有两类时,如图1-5所示:

图1-5二分类流程

二分类流程:我们先从用蓝色圆形数据定义为类型1,其余数据为类型2;

只需要分类1次。

图中的步骤:①->②。

多分类流程:我们先定义其中一类为类型1(正类),其余数据为负类(Rest);

接下来去掉类型1数据,剩余部分再次进行二分类,分成类型2和负类;如果有类,那就需要分类-1次。

对于类别,需要训练个模型。

图1-6是多分类的流程,分类的步骤:①->②->③->……

这个方法称为一对多(One-vs-All ,OVA)或者一对余(One-vs-Rest,OVR)。

图1-6多分类流程

2.无监督学习

本节我们介绍机器学习的又一大类型——无监督学习(Unsupervised Learning)。

对于监督学习里的每条数据,我们已经清楚地知道,训练数据确定对应的“正确答案”,即训练数据有标签。

图1-7聚类算法示例

而在图1-7的无监督学习中,已知的训练数据看上去有点不一样,即所有的数据只有输入属性,没有任何的标签。所以我们无法运用监督学习的算法训练模型。针对此类数据集,无监督学习需要基于“物以类聚”的思想,将数据分成两个不同的簇。同一簇内数据相似性大、差异性小,不同簇之间数据相似性小、差异性大。我们把此类算法称作做聚类算法。

实际生活中,聚类算法用处很多。其中一个例子就是在谷歌新闻。如果你之前对此不甚了解,可以到URL网址到谷歌新闻查看。谷歌新闻每天收集非常多的新闻,并运用聚类方法再将这些新闻分组,组成若干类有关联的新闻。于是,搜索时同一组新闻事件往往隶属同一主题的,所以显示到一起。

无监督学习还有其他应用。比如在社交网络的分析上。已知你朋友的信息,比如经常发email的联系人,或是你微博的好友、微信的朋友圈,我们可运用聚类方法自动地给朋友进行分组,做到让每组里的人们彼此都熟识。还有在市场分割上的应用。许多公司有大型的数据库,存储消费者信息。所以,你能检索这些顾客数据集,自动地发现市场分类,并自动地把顾客划分到不同的细分市场中,因此能针对不同的细分市场制定策略更高效地进行销售。

这就是无监督学习,原始数据没有标签,我们只知道这里存在有一堆数据,却不知道数据里面有什么,不知道数据属于什么类型,甚至不知道数据有哪些不同的类型。因此,我们无法提前给数据标定“正确答案”,从而在训练中给模型以指导。我们只能基于“物以类聚”的思想,利用数据分布,将数据自动地聚集到若干类。因为训练数据没有标签,所以无监督学习在很多文章中也被称为无导师学习。

这里我们重新强调一下监督学习与无监督学习间的区别。在房价预测问题中,我们已经获得了若干房屋的真实出售价格,我们需要训练模型预测朋友房屋的价格,这是监督学习问题。还有前一节中的癌症肿瘤例子,我们已知若干恶性和良性肿瘤案例,需要基于训练得到的模型判断一个肿瘤是否为恶性或是良性,这同样是监督学习问题。

总结一下:监督学习,就是训练数据有标签,即对于输入数据,能预测

而谷歌新闻事件分类的例子,可以看到,这些新闻的分类结果我们事先是未知的,只能运用聚类算法将这些文章聚集到若干类,所以是无监督学习。细分市场的例子也是无监督学习问题。因为我只是拿到算法数据,却没有相关细分市场的信息,只能让算法去自动地发现细分市场。

总结一下:无监督学习,训练数据没有标签,对于输入数据能发现什么。

1.4 机器学习的开发流程

机器学习的一般步骤怎么样呢?图1-8中,我们用人类解决问题的流程和机器学习的工作步骤进行了对比。

图1-8 机器学习的一般步骤与人类解决问题的流程的对比

人类根据经验归纳出事物的规律,当有新的问题的时候,可以通过规律来预测未来的情况,而机器学习,通过历史数据进行训练,得到了训练好的模型,新的数据输入到模型,可以预测未知属性。而训练模型的参数和超参数,就好像调音台的旋钮,假设调音台要播放古典音乐,调音师通过播放很多古典音乐(历史数据),把调音台的旋钮调节好(训练模型),然后,有新的古典音乐播放的时候,效果通常会非常不错。

机器学习的开发大致可分为以下几个步骤。

(1)数据搜集:这一步非常重要,我们收集得到的数据的数量和质量将直接决定最后的学习性能。数据搜集通常通过数据库读取,日志文件读取,网络爬虫采集等。

(2)数据清洗:我们需将收集来的数据去重复、修正错误、填充缺失、属性归一化等等,然后将数据保存成csv等格式的文件,为下一步的数据加载做准备。

(3)特征工程:特征选择的好坏也影响最后的学习性能,我们可对上一步确定的自变量进行筛选,选择合适的特征以便更好地标注。数据集拆分:将数据集拆分成训练数据和测试数据,分别用于模型训练和性能测试。拆分比例通常控制在8:2或是7:3的比例。

(4)数据建模:选择合适的算法如线性回归、决策树、随机森林、逻辑回归、SVM、神经网络等等,进行模型训练。我们可以通过交叉验证的方式选择性能最好的一个。数据建模还包括性能评估,训练完成之后,可利用测试数据对模型进行测试,将真实数据输出值与预测输出值进行对比。评估指标有准确率、召回率、调和平均数等。

如图1-9所示,本书将机器学习的流程与西红柿炒蛋的流程做了形象的对比。

图1-9机器学习开发流程的形象对比

数据搜集相当于买菜,搜集原料,数据清洗相当于洗菜,特征工程相当于切菜,而数据建模相对应烧菜。在绝大部分的机器学习工程中,数据搜集、数据清洗、特征工程这三个步骤占总时间的80%-90%,而数据建模,尽管占总时间比较少,但是,这部分技术含量最高,通常由算法工程师完成,工资最高,他们的工作就好比是酒店里的厨师,他们的工资会比厨房的其他工种的工资要高。

2.机器学习算法

2.1 监督学习算法

1.线性回归

线性回归(Linear Regression)是一种通过属性的线性组合来进行预测的线性模型,其目的是找到一条直线或者一个平面或者更高维的超平面,使得预测值与真实值间的误差最小化。从图1-10中可以看出,这个是一个单变量的线性回归,蓝色点代表真实数据,红色的点代表预测数据,红色的点越靠近拟合的红色的线,说明数据拟合的效果越好。

图1-10 线性回归示例

根据图1-11,在一维或者多维空间里,线性回归的目标是找到一条直线(对应一维)、一个平面(对应二维)或者更高维的超平面,使样本集中的点更接近它,也就是残差(Residuals)最小化。

https://img-blog.csdn.net/20180904210821835?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B4aGRreQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

图1-11多变量线性回归

2.逻辑回归

逻辑回归(Logistic Regression,LR)是经典的分类方法,也是目前应用最广泛的分类算法。逻辑回归虽然被称为回归,但其实际上是分类模型,并常用于二分类,它是分类问题的首选算法。

(1)逻辑回归模型形式简单,可解释性好,从特征的权重可以看到不同的特征对最后结果的影响。

(2)训练时便于并行化,在预测时只需要对特征进行线性加权,所以性能比较好,往往适合处理海量ID类特征,用ID类特征有一个很重要的好处,就是防止信息损失(相对于范化的 CTR 特征),对于头部资源会有更细致的描述。

(3)资源占用小,尤其是内存。在实际的工程应用中只需要存储权重比较大的特征及特征对应的权重。

(4)方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行划分阈值。逻辑回归使用的是Sigmoid函数,预测结果是概率,如图1-12是所示,通常情况下,结果大于等于0.5的时候预测为1(正类),小于0.5的时候预测为0(负类)。

门上写着字 AI 生成的内容可能不正确。
门上写着字 AI 生成的内容可能不正确。

图1-12 Sigmoid曲线

3.k近邻算法

近邻算法(k-Nearest Neighbor,KNN)是一种比较成熟也是最简单的机器学习算法,可以用于基本的分类与回归方法。

算法的主要思路:

如果一个样本在特征空间中与个样本最为相似(即特征空间中最邻近),那么这个样本中大多数属于哪个类别,则该样本也属于这个类别。

通俗理解可以归纳为三点:

  1. 近邻法可理解为一种死记硬背式的分类器,记住所有的训练数据,对于新的数据则直接和训练数据匹配,如果存在同属性的训练数据,则直接用它的分类来作为新数据的分类。

  2. 对于分类问题:对新的样本,根据其个最近邻的训练样本的类别,一般是选择多数表决法,即训练集里和预测的样本特征最近的个样本,预测为里面有最多类别数的类别。

  3. 对于回归问题:对新的样本,一般是选择平均法,即最近的个样本输出的平均值作为回归预测值。由于两者区别不大,虽然本文主要是讲解近邻的分类方法,但思想对近邻的回归方法也适用。

img

图1-13 kNN算法原理

如图1-13的例子,蓝色正方形和红色三角形是有标签的(即分类过的做好标记的),使用KNN算法进行分类时候:

当选择的时候,离绿色待分类点最近的3个点中,即图中实线圆的范围里,2个红色三角形,1个属于蓝色正方形,所以绿色待分类的节点应该属于红色三角类。

当选择的时候,离绿色待分类点最近的5个点中,即图中虚线圆的范围里,有3个蓝色正方形,2个红色三角型,所以绿色待分类的节点应该属于蓝色正方形类。

4.决策树

决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。决策树是一个非常常见并且优秀的机器学习算法,它易于理解、可解释性强,其可作为分类算法,也可用于回归模型。

决策树将算法组织成一颗树的形式。其实这就是将平时所说的if-then语句构建成了树的形式。如图1-14所示,决策树主要包括三个部分:内部节点、叶节点和边。内部节点是划分的属性,边代表划分的条件,叶节点表示类别。构建决策树就是一个递归地选择内部节点,计算划分条件的边,最后到达叶子节点的过程。

图示, 工程绘图 描述已自动生成

图1-14 决策树结构

5.支持向量机

在监督学习中,许多学习算法的性能都非常类似,有一个更加强大的算法广泛的应用于工业界和学术界,它被称为支持量机(Support Vector Machine,SVM)。支持向量机是一类按监督学习方式对数据进行二元分类的广义线性分类器(Generalized Linear Classifier),其决策边界是对学习样本求解的最大边距超平面(Maximum-Margin Hyperplane)。与逻辑回归和神经网络相比,支持向量机,在学习复杂的非线性方程时提供了一种更为清晰,更加强大的方式。

支持向量机找到集合边缘上的若干数据(称为支持向量(Support Vector)),用这些点找出一个平面(称为决策面),使得支持向量到该平面的距离最大。

如图1-15所示,在理想的线性可分的情况下其决策平面会有多个。而支持向量机的基本模型是在特征空间上找到最佳的分离超平面使得训练集上正负样本间隔最大,支持向量机算法计算出来的分界会保留对类别最大的间距,即有足够的余量。

图1-15支持向量机图示

6.集成学习算法

在机器学习的监督学习算法中,使用集成学习往往能提高分类效果。集成学习的思想就是把多个弱分类器组合一个更好更全面的强分类器,还可以在一定程度上减少过拟合,即:集成学习如果其中某一个弱分类器预测错误,其他的弱分类器也可以将错误纠正回来,这样最终提高分类效果,也就是说,集成学习的效果通常比传统的机器学习模型要好。

科学家通过研究,发现多个分类器组合的结果比单个分类器的结果要高;通过实验证明,弱分类器通过集成,能提升变为强分类器。

那么,为什么集成学习会好于单个学习器呢?主要原因如下:

1)训练样本可能无法选择出最好的单个学习器,由于没法选择出最好的学习器,所以干脆结合起来一起用;

2)假设能找到最好的学习器,但由于算法运算的限制无法找到最优解,只能找到次优解,采用集成学习可以弥补算法的不足;

3)可能算法无法得到最优解,而集成学习能够得到近似解。比如说最优解是一条对角线,而单个决策树得到的结果只能是平行于坐标轴的,但是集成学习可以去拟合这条对角线。

常见的集成学习框架有两种:Bagging和Boosting两种集成学习框架在基学习器的产生和综合结果的方式上会有些区别,我们先做下简单的介绍。

Bagging(装袋法)全称叫 Bootstrap aggregating,通过从数据集随机抽取数据来训练多个独立的功能较弱的分类器,最终分类结果是由各弱分类器以一定的方式投票决定的,各弱分类器在投票时是平等的,即通过组合多个弱分类器来构成一个功能强大的分类器,由于各分类器是独立的,弱分类器的训练数据也是相互独立的,所以,对各弱分类器的训练可以通过并行方式完成,Bagging方法的工作流程如图1-16所示。

图1-16 Bagging工作流程

1.随机森林

随机森林(Random Forest,RF)是 Bagging的扩展变体,用随机的方式建立一个森林。随机森林算法由很多决策树组成,每一棵决策树之间没有关联。建立完森林后,当有新样本进入时,每棵决策树都会分别进行判断,然后基于投票法给出分类结果。

随机森林可以概括为四个组成部分,其工作流程如图1-17所示:

(1) 随机选择样本(放回抽样)。

(2) 随机选择特征。

(3) 构建决策树。

(4) 随机森林投票(平均)。

图1-17随机森林工作流程

Boosting(提升法)训练过程为阶梯状,基模型的训练是有顺序的,每个基模型都会在前一个基模型学习的基础上进行学习,最终综合所有基模型的预测值产生最终的预测结果,用的比较多的综合方式为加权法。

简单地说,Boosting由多个弱分类器组成,最后的分类结果是由各弱分类器按不同的权重以一定的方式投票决定的,各弱分类器在投票时的权重根据其分类性能的好坏各不相同,性能好,其权重就大,性能差,其权重就小,弱分类器每次训练时的数据集是相同的,但是每次训练时,数据集中每个样本的权重是不同的,每次训练之前,根据分类器上次对其分类的结果对其进行权重的调整,如果上次分类器对该样本分类正确,即降低其权重,如果分类错误,则增加其权重。因为训练集中各实例权重值需要由前一轮弱分类器的分类结果来决定,所以对弱分类器的训练只能通过串行方式进行,Boosting方法的工作流程如图1-18所示。通过这种方式,把弱分类器逐渐训练成强分类器。Boosting方法的代表性算法有XGBoost和LightGBM。

图1-18 Boosting工作流程

2.XGBoost算法

XGBoost 是一种基于梯度提升算法(GBDT)的机器学习算法,由华盛顿大学的博士生陈天奇于2014年2月发明。自诞生以来,XGBoost 凭借其出色的学习效果和高效的训练速度,在数据竞赛中大放异彩,迅速成为数据科学家和机器学习工程师的宠儿。

XGBoost 是一种大规模并行 Boosting Tree 的工具,它是性能和速度俱佳的开源 Boosting Tree 工具包,比常见的工具包快很多倍。XGBoost 和 GBDT 都是 Boosting 方法,但在工程实现和解决问题上有一些显著的差异。最大的不同在于目标函数的定义。XGBoost 通过引入正则化项和优化目标函数,提高了模型的泛化能力和训练效率。

XGBoost 的优势不仅体现在速度和性能上,还在于其强大的灵活性和可扩展性。它支持多种目标函数和评估指标,适用于分类、回归、排名等多种任务。此外,XGBoost 还提供了丰富的参数调整选项,使得用户可以根据具体问题进行精细调优,从而获得最佳的模型性能。

在实际应用中,XGBoost 被广泛应用于各个领域,包括但不限于金融、医疗、电商、广告推荐等。例如,在金融领域,XGBoost 可以用于信用风险评估和股票价格预测;在医疗领域,它可以用于疾病诊断和患者生存分析;在电商领域,它可以用于用户行为预测和商品推荐。XGBoost 的高效性和准确性使其成为解决复杂数据问题的首选工具之一。

3.LightGBM算法

LightGBM 是由微软开发的一种高效梯度提升算法,旨在解决 GBDT 在处理海量数据时遇到的挑战,提升其在工业实践中的应用效率。与 XGBoost 相比,LightGBM 具备以下显著优势:训练速度更快、内存占用更低、模型准确率更高,同时支持分布式计算,能够高效处理海量数据。

LightGBM 在技术实现上进行了多项创新改进:采用基于梯度的单边采样算法(Gradient-based One-Side Sampling, GOSS),优化数据采样过程;运用互斥特征捆绑算法(Exclusive Feature Bundling, EFB),提高特征处理效率;引入直方图算法(Histogram),加速节点分裂的计算;采用基于最大深度的 Leaf-wise 的垂直生长算法,优化树的生长策略。这些改进使得 LightGBM 在性能上超越了传统的 XGBoost 算法,能够以更快的速度和更低的资源消耗完成模型训练,并取得更优的预测准确率。

简而言之,LightGBM 可以看作是在 XGBoost 的基础上,集成了 GOSS、EFB 和直方图算法等创新技术的增强版,它在大规模数据处理场景中展现出了卓越的性能和效率。

2.2  无监督学习算法

1.K均值聚类

K均值(K-means)算法是一种基于距离度量的迭代聚类方法,其目标是将数据集划分为个簇(群集),使得每个数据点尽可能接近其所在簇的中心,同时尽可能远离其他簇的中心。以下是 K均值 算法的核心步骤:

初始化聚类中心:随机选择数据集中 K 个点作为初始的聚类中心(cluster centroids),这些中心点将作为各簇的代表点。

分配数据点到最近的聚类中心:计算每个数据点与各聚类中心的距离,并根据距离最近的原则,将每个数据点分配到对应的簇中。这一步会形成 K 个初始的簇。

更新聚类中心:对于上一步得到的 K 个簇,分别计算每个簇内所有数据点的平均值,将这个平均值作为新的聚类中心。

迭代优化:重复执行分配数据点和更新聚类中心的步骤,直到满足以下条件之一:

聚类中心不再发生变化,说明算法已经收敛,各簇的划分趋于稳定。

达到预设的最大迭代次数。

图1-19 展示了一个完整的聚类过程,通过这个过程可以直观地理解 K均值算法如何逐步优化聚类结果,将数据集划分为具有相似特性的簇。

图表, 散点图 AI 生成的内容可能不正确。
图1-19聚类的流程

2.密度聚类

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。图1-20是典型的密度聚类的例子。图表 描述已自动生成



(a)                                         (b)                                                   (c)

图1-20 DBSCAN密度聚类案例

我们可以看到图1-20(a)如果按照密度划分簇,效果会比K均值更好。

设定了扫描半径和最小包含点数后,根据点的密度来进行聚类,经过多次迭代,最终得到图1-20 (c)的效果。

3.层次聚类

层次聚类假设簇之间存在层次结构,将样本聚到层次化的簇中。

从图1-21中可以看出,层次聚类又有聚合聚类(自下而上)、分裂聚类(自上而下)两种方法。

因为每个样本只属于一个簇,所以层次聚类属于硬聚类。

层次聚类解决了K均值一些缺点,K均值必须在算法开始前就决定簇数 K 的数量,但实际我们并不知道应该有多少个簇,所以一般都是根据自己的理解先设定一个值,这就可能导致我们的理解和实际情况存在一些偏差。层次聚类完全不同,它不需要我们开始的时候指定簇数,而是先完整的形成整个层次聚类后,通过决定合适的距离,自动就可以找到对应的簇数和聚类。

图1-21层次聚类示例

4.降维算法

降维(Dimensionality Reduction) 是将高维数据映射到低维空间的过程(类似“有损压缩”,无完全无损失的降维)。

有很多种算法可以完成对原始数据的降维,在这些方法中,降维是通过对原始数据的线性变换实现的。

1)降维的核心原因和作用

降维的核心原因的是:

(1)减轻计算负担:高维数据运算复杂,降维后可大幅提升训练效率;

(2)增强泛化能力:去除冗余特征后,算法更易捕捉数据核心规律;

(3)提升可读性:低维数据(如 2 维、3 维)可直接可视化,帮助直观发现数据结构。

降维的主要作用有两个:

(1)去冗余、降噪声

如果两个特征高度相关(如 “厘米身高” 与“英寸身高”),保留一个即可,既减少计算,又能降低噪声干扰;

(2)数据可视化

50 维的 “国家特征(GDP、人均寿命等)” 无法直接绘图,但降维到 2 维后,可通过散点图展示(不过新特征的含义需人工解读)。

作为降维的代表性方法主要有SVD与PCA。

1)奇异值分解(SVD):矩阵分解的核心工具

奇异值分解(Singular Value Decomposition, SVD)是将任意矩阵 分解为三个矩阵乘积 的技术,其中 和 为正交矩阵,  为对角矩阵(对角线元素为奇异值)。

图1-22可以很形象地看出上面 SVD 的定义:

手机屏幕的截图 描述已自动生成
图1-22 SVD的定义

(1)核心思想:用少量信息近似还原矩阵

SVD 的关键特点是奇异值衰减极快—— 往往前 10% 甚至 1% 的奇异值,就贡献了 99% 以上的“信息占比”。因此,可通过“前k个最大的奇异值及对应矩阵”,近似还原原始矩阵(如图1-23),实现数据压缩、去噪。

图表 描述已自动生成
图1-23 SVD的近似计算

(2)应用场景

推荐系统:分解 “用户 - 商品”评分矩阵,挖掘隐性偏好,实现精准推荐;

图像压缩:大幅减少图像存储的像素量,同时保留核心视觉信息;

自然语言处理:用于“潜在语义分析(LSA)”,捕捉文本深层语义关联。

2)主成分分析(PCA):方差驱动的降维方法

主成分分析(Principal Component Analysis, PCA)是最常用的降维方法之一,它能将高维特征集转换为低维特征集,同时保留原始数据中的大部分关键信息,从而实现数据维度的有效降低。

PCA的核心思想是:将原始的n维特征映射到k维新特征上,这些新特征(称为主成分)相互垂直(正交),是在原始特征基础上重新构建的。打个比方,就像用更少的“坐标轴”重新描述数据,同时尽量不丢失重要信息。

在PCA中,核心任务是找到合适的方向向量(过原点的向量),当所有数据点投射到该向量上时,投影的平均误差(即数据点到向量的垂直距离)尽可能小。主成分分析的流程可参考图1-24,其核心逻辑非常直观:在减少特征数量的同时,最大限度保留原始数据的信息。

图示 描述已自动生成
图1-24主成分分析流程图

值得注意的是,每个主成分都与前一个主成分垂直(正交)。形象地说,如果有三个主成分,前两个可看作平面内相互垂直的箭头,第三个则垂直于这个平面(向上或向下),如同三维空间中的轴(如图1-25所示)。

图表, 散点图 描述已自动生成
图1-25 每个主成分(PC)与前一个主成分(PC)正交

核心步骤:

(1)数据预处理:通过均值归一化消除不同特征的量纲差异(例如,将身高的“厘米”与体重的“千克”调整到可比范围);

(2)协方差矩阵计算:衡量不同特征之间的相关性(比如身高与体重是否呈正相关);

(3)特征分解:主流方法是通过奇异值分解(SVD)直接获取主成分;也可通过特征值分解求解协方差矩阵的特征值与特征向量,再选取前个最大特征值对应的向量构建投影矩阵;

(4)数据映射:将原始数据投影到由这个主成分构成的低维空间(例如,将二维数据沿方差最大的方向投影,得到更简洁的一维数据)。

优缺点分析:

优势:作为无监督学习方法,无需依赖标签数据;计算高效,易于实现;能有效消除特征间的冗余关联;

局限:新生成的主成分缺乏明确的物理意义(如无法直接对应“身高”“体重”等原始特征);可能丢弃方差较小但对任务至关重要的信息(如某些罕见但关键的特征)。

降维技术的实践意义

降维技术是解决维数灾难的关键路径。SVD与PCA作为代表性方法,通过矩阵分解与方差最大化,在数据压缩(如图像处理)、推荐系统、高维可视化等领域发挥核心作用。未来,随着数据维度持续增长,降维算法的效率与可解释性优化将成为机器学习与数据分析的重要研究方向。

3.机器学习实践

3.1 机器学习库Scikit-learn

Scikit-Learn (简称 Sklearn) 是基于 Python 语言的机器学习工具。它建立在 NumPy、SciPy、Pandas和 Matplotlib 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路。

Scikit-Learn库的算法主要有四类:分类、回归、聚类、降维。其中:

常用的回归:线性回归、决策树回归、SVM回归、KNN回归;集成回归:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees。

常用的分类:线性分类、决策树、SVM、KNN,朴素贝叶斯;集成分类:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees。

常用聚类:K均值(K均值)、层次聚类(Hierarchical clustering)、DBSCAN。

常用降维:LinearDiscriminantAnalysis、PCA。

图片包含 图示 描述已自动生成
图1-26 Scikit-Learn算法选择路径图

图1-26代表了Scikit-Learn算法选择的一个简单路径,这个路径图代表:蓝色圆圈是判断条件,绿色方框是可以选择的算法,我们可以根据自己的数据特征和任务目标去找一条自己的操作路线。

Scikit-Learn中包含众多数据预处理和特征工程相关的模块,但其实Sklearn六大板块中有两块都是关于数据预处理和特征工程的,两个板块互相交互,为建模之前的全部工程打下基础。

3.2  基本建模流程

基本建模的符号标记见表1-1:

表1-1 符号标记

符号
代表含义
符号
代表含义
X_train
训练数据
y_train
训练集标签
X_test
测试数据
y_test
测试集标签
X
完整数据
y
数据标签


y_pred
预测标签

1.导入工具包

导入工具包的方法如下(这里使用伪代码):

from sklearn import 包名称
from sklearn.库名称import 包名称

代码示例:

from sklearn import datasets, preprocessing  
#导入数据集,数据预处理库  
from sklearn.model_selection import train_test_split   
#从模型选择库导入数据切分包  
from sklearn.linear_model import LinearRegression    
#从线性模型库导入线性回归包  
from sklearn.metrics import r2_score  
#从评价指标库导入R2评价指标   

2.导入数据

导入数据的方法如下:

from sklearn.datasets import 数据名称

Scikit-learn支持以NumPy的arrays对象、Pandas对象、SciPy的稀疏矩阵及其他可转换为数值型arrays的数据结构作为其输入,前提是数据必须是数值型的。

sklearn.datasets模块提供了一系列加载和获取著名数据集如鸢尾花、波士顿房价、Olivetti人脸、MNIST数据集等的工具,也包括了一些toy data如S型数据等的生成工具。

Scikit-learn内置了很多可以用于机器学习的数据,可以用两行代码就可以使用这些数据。内置数据分为可以直接使用的数据集、需下载的数据集以及生成数据集。

代码示例:

#导入内置的鸢尾花数据  
from sklearn.datasets import load_iris    
iris = load_iris()  
#定义数据、标签  
X = iris.data  
y = iris.target   

3.3 数据预处理

1.数据划分

机器学习的数据,可以划分为训练集、验证集和测试集,也可以划分为训练集和测试集(图1-2)。机器学习的数据,可以划分为训练集、验证集和测试集。

训练集(Training Set):帮助我们训练模型,简单地说就是通过训练集的数据让我们确定拟合曲线的参数。

验证集(Validation Set):也叫做开发集(Dev Set),用来做模型选择(Model Selection),即做模型的最终优化及确定的,用来辅助我们的模型的构建,即训练超参数,可选。

测试集(Test Set):为了测试已经训练好的模型的精确度。

我们将数据分成训练集和测试集,通常用70%的数据作为训练集,用剩下30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。通常我们应该选择一个泛化的模型。我们需要使用交叉验证集来帮助选择模型。 即:使用60%的数据作为训练集,使用 20%的数据作为验证集,使用20%的数据作为测试集,也可以按照70%、10%、20%,这个是比较普遍的划分方式(图1-27)。

图片包含 文本 描述已自动生成
图1-27数据集划分

但在现代机器学习中,我们更习惯操作规模大得多的数据集,比如说你有1百万个训练样本,这样分可能更合理,98%作为训练集,1%开发集,1%测试集,因为如果你有1百万个样本,那么1%就是10000个样本,这对于开发集和测试集来说可能已经够了。所以在现代深度学习时代,有时我们拥有大得多的数据集,所以使用小于20%的比例或者小于30%比例的数据作为开发集和测试集也是合理的。而且因为深度学习算法需要非常多的数据,我们可以看到那些有海量数据集的问题,有更高比例的数据划分到训练集里,那么测试集呢?深度学习的数据这样划分:98%、1%、1% (假设百万条数据)。

代码示例:

from sklearn.model_selection import train_test_split    

X_train, X_test, y_train, y_test =  train_test_split(X, y, random_state=12, stratify=y,  test_size=0.3)  

#将完整数据集的70%作为训练集,30%作为测试集,并使得测试集和训练集中各类别数据的比例与原始数据集比例一致(stratify分层策略),另外可通过设置shuffle=True 提前打乱数据。 

2.数据变换

数据变换的主要操作如表1-2所示,其中最重要的是数据规范化。

表1-2使用Scikit-learn进⾏数据变换

预处理操作
库名称
标准化
StandardScaler
最小最大标准化
MinMaxScaler
One-Hot编码
OneHotEncoder
归一化
Normalizer
二值化(单个特征转换)
Binarizer
标签编码
LabelEncoder
缺失值填补
Imputer
多项式特征生成
PolynomialFeatures

数据规范化,也叫特征缩放,通常指数据归一化/标准化。

为什么要进行数据规范化?

数据标准化(归一化)处理是机器学习处理数据的基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。主要有以下两个作用:

(1)提升模型精度:不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。

(2)加速模型收敛:最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。

(a)数据未处理
(b)数据标准化(归一化)

图1-28 数据规范化的寻优速度的对比

如图1-28所示,假设只有两个特征,但是两个特征的尺度相差较大,就会出现图(a)(没有处理的原始数据)的情况,梯度下降的寻优过程明显变慢,比较难收敛到最优解,图(b)是经过数据标准化/归一化处理,模型收敛过程明显加快,容易收敛到最优解。

线性模型,如基于距离度量的模型包括KNN(K近邻)、K均值聚类、感知机和SVM。另外,线性回归类的几个模型一般情况下也是需要做数据归一化/标准化处理的。

决策树、基于决策树的Boosting和Bagging等集成学习模型对于特征取值大小并不敏感,如随机森林、XGBoost、LightGBM等树模型,以及朴素贝叶斯,以上这些模型一般不需要做数据归一化/标准化处理。

数据规范化最主要的两种方式是数据归一化和标准化。

(1)数据归一化(最大 - 最小规范化)

数据归一化的结果是将数据映射到[0,1]区间。

数据归一化的目的是使得各特征对目标变量的影响一致,会将特征数据进行伸缩变化,所以数据归一化是会改变特征数据分布的。

(2)Z-Score标准化

数据标准化这样处理后的数据均值为0,方差为1。

数据标准化为了不同特征之间具备可比性,经过标准化变换之后的特征数据分布没有发生改变。

sklearn.preprocessing模块包含了数据变换的主要操作(表1-3),数据变换的方法如下:

from sklearn.preprocessing import库名称
代码示例:
#使⽤Scikit-learn进⾏数据标准化  
from sklearn.preprocessing import StandardScaler  

#构建转换器实例
scaler = StandardScaler()  
#拟合及转换
scaler.fit_transform(X_train)   

3.4  监督学习算法应用

1.监督学习算法-回归

常见的回归模型如表1-3。

表1-3常见的回归模型

回归模型名称
库名称
线性回归
LinearRegression
岭回归
Ridge
LASSO回归
Lasso
ElasticNet回归
ElasticNet
决策树回归
tree.DecisionTreeRegressor

代码示例:

#从线性模型库导入线性回归模型  
from sklearn.linear_model import LinearRegression  
# 构建模型实例  

lr = LinearRegression(normalize=True)  
#训练模型  

lr.fit(X_train, y_train)  
#作出预测 
y_pred = lr.predict(X_test)   

2.监督学习算法-分类

常见的分类模型如表1-4。

表1-4常见的分类模型

模型名称
库名称
逻辑回归
linear model.LogisticRearession
支持向量机
svm.SVC
朴素贝叶斯
naive_bayes.GaussianNB
KNN
neighbors.NearestNeighbors
随机森林
ensemble.RandomForestClassifier
GBDT
ensemble.GradientBoostingClassifier

代码示例:

#从树模型库导入决策树  

from sklearn.tree import DecisionTreeClassifier

#定义模型  

clf = DecisionTreeClassifier(max_depth=5)    

#训练模型  

clf.fit(X_train, y_train)  

#使用决策树分类算法解决二分类问题,得到的是类别  

y_pred = clf.predict(X_test)    

#y_prob 为每个样本预测为“0”和“1”类的概率  

y_prob = clf.predict_proba(X_test)   

3.5  无监督学习算法应用

1.聚类算法

sklearn.cluster模块包含了一系列无监督聚类算法(表1-5),聚类使用的方法如下:

from sklearn.cluster import库名称

表1-5常见的聚类模型

模型名称
库名称
K均值
KMeans
DBSCAN
DBSCAN
层次聚类
AgglomerativeClustering
谱聚类
SpectralClustering

代码示例:

#从聚类模型库导入kmeans  
from sklearn.cluster import kmeans  
#构建聚类实例  
kmeans = KMeans(n_clusters=3, random_state=0)  
#拟合  
kmeans.fit(X_train)  
#预测  
kmeans.predict(X_test)   

2.降维算法

Scikit-learn中降维算法都被包括在模块decomposition中,sklearn.decomposition模块本质是一个矩阵分解模块。最常见的降维方法是PCA(主成分分析)。

降维(Dimensionality Reduction)是将训练数据中的样本(实例)从高维空间转换到低维空间,该过程与信息论中有损压缩概念密切相关。同时要明白的,不存在完全无损的降维。

有很多种算法可以完成对原始数据的降维,在这些方法中,降维是通过对原始数据的线性变换实现的。

为什么要降维?主要原因如下:

(1) 高维数据增加了运算的难度。

(2) 高维使得学习算法的泛化能力变弱(例如,在最近邻分类器中,样本复杂度随着维度成指数增长),维度越高,算法的搜索难度和成本就越大。

(3) 降维能够增加数据的可读性,利于发掘数据的有意义的结构。

PCA算法是一种常见的降维方法,通过将一个大的特征集转换成一个较小的特征集,这个特征集仍然包含了原始数据中的大部分信息,从而降低了原始数据的维数。

PCA算法得到协方差矩阵的特征值特征向量,有两种实现方法:

基于SVD分解协方差矩阵实现PCA算法和基于特征值分解协方差矩阵实现PCA算法。

降维的使用的方法如下:

from sklearn.decomposition import库名称

代码示例:

#导入PCA库  
from sklearn.decomposition import PCA  
#设置主成分数量为3,n_components代表主成分数量  
pca = PCA(n_components=3)  
#训练模型  
pca.fit(X)  
#投影后各个特征维度的方差比例(这里是三个主成分)  
print(pca.explained_variance_ratio_)  
#投影后的特征维度的方差  
print(pca.explained_variance_)  

3.6  评价指标

sklearn.metrics模块包含了一系列用于评价模型的评分函数、损失函数以及成对数据的距离度量函数。评价指标主要分为分类评价指标、回归评价指标等等,表1-6列举了常见的几种评价指标。

评价指标使用的方法如下:

from sklearn.metrics import库名称

表1-6常见评价指标

评价指标
库名称
使用范围
准确率
accuracy_score
分类
精确率
precision_score
分类
F1 值
f1_score
分类
对数损失
log_loss
分类
混淆矩阵
confusion_matrix
分类
含多种评价的分类报告
classification_report
分类
均方误差MSE
mean_squared_error
回归
平均绝对误差MAE
mean_absolute_error
回归
决定系数R2
r2_score
回归

代码示例:

#从评价指标库导入准确率  
from sklearn.metrics import accuracy_score    
#计算样本的准确率  
accuracy_score(y_test, y_pred)  
#对于测试集而言,大部分函数都必须包含真实值y_test和预测值y_pred 

1.回归的评价指标

在回归分析里,主要有几个评价指标:

(1)均方误差(MSE)

先算出每个样本预测值和真实值的差,把这个差平方后,再求所有样本的平均值。它的曲线很平滑,能用梯度下降法优化,比较常用。随着误差变小,梯度也变小,有助于函数收敛,即使学习率固定,也能较快找到最小值。

(2)均方根误差(RMSE)

就是对 MSE 开平方,这样能和数据本身的单位保持一致,方便理解。

(3)平均绝对误差(MAE)

直接算预测值和真实值差的绝对值,再求平均。它对离群点没那么敏感,但如果数据中的离群点很重要,用MAE 可能会忽略这些关键异常值。

(4)R_Squared(R² score)

它表示因变量的变异能通过自变量解释的比例。简单来说,越接近 1,模型拟合得越好;等于 0 时,相当于直接用均值预测;还可能为负数,这意味着模型效果很差,还不如直接用目标变量的平均值来预测。

选择 MSE 还是 MAE 呢?从计算和优化角度看,MSE 更有优势,梯度变化动态,能较快准确收敛。但如果离群点只是数据损坏或错误采样,无关紧要,那 MAE 是更好的选择。

2.分类的评价指标

在分类算法中,针对一个二分类问题,即将实例分成正类(Positive)或负类(Negative),在实际分类中会出现以下四种情况:

正确肯定(True Positive,TP):预测为真,实际为真

正确否定(True Negative,TN):预测为假,实际为假

错误肯定(False Positive,FP):预测为真,实际为假

错误否定(False Negative,FN):预测为假,实际为真

分类的主要评价指标:

(1)准确率(Accuracy)

准确率是分类问题中最简单也是最直观的评价指标,准确率是指分类正确的样本占总样本个数的比例,是针对所有样本的统计量。

(2)精准率(Precision)

又称为查准率,代表对正样本结果的预测准确程度,具体公式如下:

精准率的含义就是在预测为正样本的结果中,有多少是准确的。这个指标比较谨慎,分类阈值较高。

(3)召回率(Recall)

又称为查全率,是针对原始样本而言的一个评价指标。在实际为正样本中,被预测为正样本所占的百分比。具体公式如下:

召回率也是对部分样本的统计量,侧重对真实的正类样本的统计。

(4)F1 score

F1 score是精准率和召回率的调和平均值,它定义为:

F1分数可以看作是模型准确率和召回率的一种加权平均,它的最大值是1,最小值是0。

3.评价指标案例

这里有一个评价指标的案例:假设有100张照片,其中,猫的照片有60张,狗的照片是40张。

输入这100张照片进行二分类识别,找出这100张照片中的所有的猫。识别结果的混淆矩阵见表1-7,混淆矩阵的每一行是样本的预测值,每一列是样本的真实值:

表1-7识别结果的混淆矩阵

混淆矩阵
预测值

正例
负例

实际值

正例
TP = 40
FN = 20
负例
FP = 10
TN = 30

根据分类结果的混淆矩阵,可以得到分类结果的表格(表1-8)

表1-8分类结果

项目
符号
猫狗的例子
识别出的正例
TP + FP
40+10=50
识别出的负例
TN + FN
30+20=50
总识别样本数
TP + FP + TN + FN
50+50=100
识别对了的正例与负例
TP + TN
40+30=70
识别错了的正例与负例
FP + FN
10+20=30
实际总正例数量
TP + FN
40+20=60
实际总负例数量
TN + FP
30+10=40

根据混淆矩阵,可以求得准确率、精确率、召回率等指标:

(1)准确率

由于:,所有样本数量为100,则准确率为:

(2)精确率

根据公式:

由于:,则精确率为:

(3)召回率

由于:。则召回率为:

3.7  交叉验证及超参数调优

1.交叉验证

在机器学习建模过程中,常见的数据划分方法通常是将数据分为训练集和测试集,测试集是与训练独立的数据,完全不参与训练,用于最终模型的评估。这种做法往往会出现问题:在训练过程中,经常会出现过拟合的问题,模型的泛化能力差,也就是说模型可以很好的匹配训练数据,却在预测训练集外的数据(测试集)上表现不佳。如果此时就使用测试数据来调整模型参数,就相当于在训练时已知部分测试数据的信息,造成标签信息的泄露,会影响最终评估结果的准确性。通常的做法是在训练数据再中分出一部分作为验证(Validation)数据,用来评估模型的训练效果。

验证数据取自训练数据,但不参与训练,这样可以相对客观的评估模型对于训练集之外数据的匹配程度。模型在验证数据中的评估常用的是交叉验证,常见的交叉验证方式有K折交叉验证(K-fold Cross Validation)。

K折交叉验证的方式如图1-29所示,主要流程如下:

(1) 将原始数据分成组(K-Fold),将每个子集数据分别做一次验证集,其余的组子集数据作为训练集,这样会得到个模型。

(2) 这个模型分别在验证集中评估结果。

(3) 个模型的误差加和平均就得到交叉验证误差。

图1-29 折交叉验证方法

交叉验证有效利用了有限的数据,并且评估结果能够尽可能接近模型在测试集上的表现,可以作为模型优化的指标使用。代码示例:

#从模型选择库导入交叉验证分数  

from sklearn.model_selection import cross_val_score    

clf = DecisionTreeClassifier(max_depth=5)  

#使用5折交叉验证对决策树模型进行评估,使用的评分函数为F1值  

scores = cross_val_score(clf, X_train, y_train,cv=5, scoring=’f1_weighted’)  

此外,Scikit-learn提供了部分带交叉验证功能的模型类如LogisticRegressionCV、LassoCV、等,这些类包含CV参数。

2.超参数调优

在机器学习中,超参数是指无法从数据中学习而需要在训练前提供的参数。机器学习模型的性能在很大程度上依赖于寻找最佳超参数集。

超参数调整一般是指调整模型的超参数,这基本上是一个非常耗时的过程。目前主要有 3 种最流行的超参数调整技术:网格搜索、随机搜索和贝叶斯搜索,其中Scikit-learn内置了网格搜索、随机搜索,本章进行简单讲解,其余调参方法如贝叶斯搜索,本章不进行讨论。

超参数调优⸺网格搜索代码示例:

#从模型选择库导入网格搜索  
from sklearn.model_selection import GridSearchCV    
from sklearn import svm  
svc = svm.SVC( )  
#把超参数集合作为字典  

params = {‘kernel’:[‘linear’, ‘rbf’], ‘C’:[1, 10]}    

#进行网格搜索,使用了支持向量机分类器,并进行五折交叉验证  

grid_search = GridSearchCV(svc, params, cv=5)    

#模型训练  

grid_search.fit(X_train, y_train)    

#获取模型最优超参数组合  

grid_search.best_params_  

在参数网格上进行穷举搜索,方法简单但是搜索速度慢(超参数较多时),且不容易找到参数空间中的局部最优。

4.机器学习案例

1.项目目标

本项目的目标是通过比较三种不同的机器学习模型——Logistic Regression、Random Forest和XGBoost,在金融欺诈检测任务上的性能表现,确定哪种算法更适合此类任务。我们将使用Kaggle提供的Credit Card Fraud Detection数据集,并利用Python和Scikit-Learn库进行建模和评估,以找出最有效的检测系统。

2.项目介绍

金融欺诈行为日益猖獗,构建高效的欺诈检测系统对于保护金融机构和用户的利益至关重要。选择合适的机器学习算法不仅能提高检测的准确性,还能显著降低误报率。因此,本项目针对不同的机器学习模型在金融欺诈检测中的性能表现进行比较分析。

我们选择了Kaggle上的Credit Card FraudDetection数据集,该数据集包含大量的信用卡交易记录,其中极少数记录为欺诈行为。数据集的不平衡性和实际应用场景中的复杂性,使得选择合适的算法变得尤为重要。

本项目将分为以下几个阶段进行:

1)数据预处理

数据收集与预处理:首先,我们将收集并加载Credit Card Fraud Detection数据集,并进行数据预处理,包括缺失值处理、数据标准化和不平衡数据处理(如使用过采样或欠采样技术)。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler 
# 读取数据

data = pd.read_csv('creditcard.csv')

# 划分数据集

X = data.drop('Class', axis=1)

y = data['Class']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 数据标准化

scaler = StandardScaler()

X_train = scaler.fit_transform(X_train)

X_test = scaler.transform(X_test)  

2)模型训练与评估

我们将依次训练Logistic Regression、Random Forest和XGBoost模型,我们将使用主要的评估指标(如准确率、召回率、F1分数和AUC-ROC)对三种模型的性能进行评估和比较。通过交叉验证等方法来保证评估结果的稳健性和通用性。

from sklearn.linear_model import LogisticRegression

from sklearn.ensemble import RandomForestClassifier

from xgboost import XGBClassifier

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score 

# 初始化模型

models = {

'Logistic Regression': LogisticRegression(max_iter=1000),

'Random Forest': RandomForestClassifier(n_estimators=100),

'XGBoost': XGBClassifier(use_label_encoder=False, eval_metric='logloss')



# 训练和评估模型

results = {}

for name, model in models.items():

model.fit(X_train, y_train)

y_pred = model.predict(X_test)

results[name] = {

'Accuracy': accuracy_score(y_test, y_pred),

'Precision': precision_score(y_test, y_pred),

'Recall': recall_score(y_test, y_pred),

'F1 Score': f1_score(y_test, y_pred)

}

print(f"{name} Model Performance:")

print(results[name])  

3)结果分析

运行上述代码后,你会得到每个模型在测试集上的性能指标。从结果看出,Random Forest和XGBoost模型的指标相对较高。

Logistic Regression Model Performance: {'Accuracy': 0.9990695551420246,
'Precision': 0.8461538461538461, 'Recall': 0.5612244897959183, 'F1 Score':
0.6748466257668712}

Random Forest Model Performance: {'Accuracy': 0.9996313331694814, 'Precision':
0.9753086419753086, 'Recall': 0.8061224489795918, 'F1 Score': 0.88268156424581}

XGBoost Model Performance: {'Accuracy': 0.9995611109160493, 'Precision':
0.9620253164556962, 'Recall': 0.7755102040816326, 'F1 Score':0.8587570621468926}  

通过对比,可以直观地看出哪种模型在金融欺诈检测任务上表现最佳。值得注意的是,由于欺诈数据的不平衡性,除了准确率外,精确率、召回率和F1分数也是重要的评估指标,它们能更全面地反映模型的性能。

通过本项目,我们将透过实际数据分析和模型比较,深入了解不同机器学习算法在金融欺诈检测任务中的适用性和有效性,从而为构建高效的欺诈检测系统提供科学依据和参考。

图片

文章精选:

1.图灵奖得主姚期智最新演讲: AI有边界,恰恰是好事

2.图灵奖得主本吉奥警告全网:AI已经学会“演给安全测试看”,下一代我们可能真的抓不住了!
3.图灵奖得主萨顿 WAIC 2026 最新演讲:现在的 AI 还不算真智能,我们正迈入经验时代
4.菲尔兹奖得主陶哲轩最新访谈:未来数学属于人类与 AI 的混合体
5.图灵奖得主、AI教父辛顿:AI已具备意识,且将进化成远超人类的智能生命体
6.图灵奖得主、“AI教父”辛顿认错:我当年想得太简单!卡死医疗AI落地的,其实是背后的法律
7.图灵奖得主Bengio预言o1无法抵达AGI!Nature权威解读AI智能惊人进化,终极边界就在眼前
8.图灵奖得主、强化学习之父Rich Sutton:大语言模型是一个错误的起点
9.图灵奖得主杨立昆:大语言模型缺乏对物理世界的理解和推理能力,无法实现人类水平智能
10.压缩即是全部 —— 菲尔兹奖得主 Michael Freedman 给数学和 AI 的一封信

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/199475