谷歌高级数据分析-VI-笔记-全-

谷歌高级数据分析 VI 笔记(全)

001:《机器学习的基础知识》 🧠

在本课程中,我们将学习机器学习的基础知识,了解如何构建能够进行预测的算法模型。我们将从机器学习的核心概念出发,探索不同类型的机器学习方法,并学习如何在实践中应用它们。课程结束时,你将掌握构建和评估复杂模型所需的关键技能。


你是否曾好奇,你的互联网搜索浏览器如何预测你将要输入的内容?例如,算法知道在你输入“will dinosaurs”之后,你很可能会接着输入“come back”。

但程序员究竟如何构建一个经过训练的算法来进行这类预测呢?在本课程中,你将学习创建复杂模型的过程,这些模型可用于对各种事物提出建议。这些模型的工作原理是应用先前收集的数据,对从恐龙到你听的音乐,再到你可能选择的上班路线等一切事物做出有根据的猜测。如果没有才华横溢的数据专业人士和他们创建的机器学习模型,我们就无法在整个互联网中享受这些有用的功能。

除了模型本身,你还将探索机器学习的主要特性,并继续发展你的Python技能。

在我们开始之前,请允许我对你迄今为止所取得的一切成就表示祝贺。你已经练习了数据清洗,回顾了关键的统计学概念,并探索了回归模型。在此过程中,你已经为应对数据专业人士工作中更复杂的部分做好了更充分的准备。

在我们从宏观视角审视机器学习和复杂模型的世界时,我将作为你的向导。我叫Suila,是一名数据科学家,在谷歌的YouTube部门从事项目工作。在YouTube,我们每天使用机器学习向用户推送内容,从音乐评论到旅行视频博客,再到我个人最喜欢的猫咪视频。我很高兴能与你一起探索机器学习。

正如你之前所学,机器学习是使用和开发算法及统计模型,以教会计算机系统分析和发现数据中的模式。它的应用非常广泛,从优化微芯片设计和改进地震预测,到推荐在YouTube上观看的视频等等。

本课程将帮助你在成为数据专业人士的旅程中更进一步,使你能够使用机器学习来处理与我刚才提到的应用类似的项目。

在开始之前,回顾一下本课程计划早期涵盖的线性和逻辑回归以及统计模型可能会有所帮助。

术语“复杂模型”和“机器学习”经常互换使用。在本课程中,当我们使用“复杂模型”这个术语时,我们指的是广义上的数学或计算模型,包括从回归到深度学习的一切。

首先,你将学习不同类型的机器学习,例如监督学习无监督学习。然后,你将学习如何实现其中的一些类型。每种类型都将按其特性进行分解,以便明确每种类型的用途和目的。

接下来,我们将从数据科学工作流的另一个视角来思考,并发现如何将PACE框架应用于机器学习。此外,你还将学习探索性数据分析(EDA)如何与机器学习相关联。

你还将练习其他技能,例如特征工程。你进入机器学习领域的另一部分介绍将是选择相关的模型和评估指标。你将根据你的目的和数据确定最合适的模型。你将学习使用哪些工具来评估模型的性能。

你还将继续使用Python进行工作。你将探索用于特定类型机器学习的最常用的Python库和包,并且你将使用谷歌数据专家在工作中依赖的相同资源。

到本课程结束时,你将拥有一个装满工具的虚拟工具箱,这些工具是你构建和改进复杂模型所需要的。最后,你将有机会在一个基于数据专业人士常见工作场景的作品集项目中,练习你新学的、符合工作要求的技能。

机器学习对于数据专业人士来说是一个令人兴奋的领域。它一直在不断发展和演进,每天都有新的应用出现。本课程中的概念将帮助你为加入这个领域并在数据科学领域推进你的职业生涯做好准备。


本节课总结

在本节课中,我们一起学习了机器学习课程的介绍和概述。我们了解了机器学习如何驱动日常应用中的预测功能,明确了本课程的学习目标,包括探索机器学习类型、应用PACE框架、进行特征工程以及选择模型和评估指标。我们还认识到,掌握这些技能将为我们构建和评估复杂模型,并最终在数据科学领域发展职业生涯奠定基础。

002:数据科学家的日常与影响 📊

在本节课中,我们将跟随谷歌高级数据科学家Sila,了解数据科学家在谷歌(特别是YouTube团队)的典型工作内容、他们如何利用数据解决问题,以及数据科学工作对产品与用户产生的实际影响。


我是Sila,谷歌的一名高级数据科学家。我的工作是与YouTube团队合作,利用数据回答他们关于产品的各种问题。

我典型的工作日安排因星期几而异。我喜欢在一周中预留出几天会议很少的时间。这段时间是我进行深度、专注工作的宝贵机会。通常在这期间,我会处理当前的分析任务、规划未来的分析、撰写结果总结、准备演示文稿等。这些都是需要我长时间专注、不受干扰地处理单一任务的工作。

在其他日子里,我通常会有很多会议,需要与软件工程师伙伴、产品经理以及任何能为我的问题提供背景信息的人交流。

作为一名数据科学家,我最喜欢的一点是能够真正对人们的生活产生影响,尤其是在YouTube这样的产品上。在我的职责范围内,我做了大量关于评论质量的测量工作。为此,我们拥有多种类型的数据:我们有日志数据,可以查看诸如用户阅读了多少条评论、撰写了多少条评论、观看了多少分钟视频等信息;我们还有调查数据,会询问用户“你觉得这条评论怎么样?”、“它让你满意吗?”、“你喜欢它吗?”等。这些分类回答非常有帮助,我们会将其转化为二元指标,以便将评论分类为好或坏。

当你在评论区看到一些令人愉悦的内容时,那是许多人共同努力的结果。而支撑这些结果的算法正是建立在这些数据之上的。当我们改进评论区功能时,它会对人们的真实生活产生影响。用户的产品体验会变得更好。YouTube是一个触达亿万用户的产品,能够以这种方式感觉自己参与了他人生活的一部分,是一种非常奇妙的体验。

数据科学领域以及进入这个领域可能会让人望而生畏。这可能是一个令人感到畏惧的领域,似乎每个人都拥有复杂的模型和宏大的演示,而你还没有这些东西,还不知道如何去做。但请坚持下去。你会学会的。每个人都有一个起点。回想我当初面试数据科学职位时,那可能是我一生中感觉准备最不充分的时刻。我并非一生都在为那个特定时刻做准备,但我最终通过了,因为我只是坚持不懈地努力。


本节课中我们一起学习了数据科学家Sila在谷歌的工作日常,了解了数据科学家如何通过分析日志和调查数据来驱动产品(如YouTube评论区)的改进,并深刻体会到数据科学工作如何通过算法和模型对亿万用户的真实体验产生积极影响。我们也认识到,进入这个看似复杂的领域需要坚持和不断学习。

003:模块1概述 🎯

在本节课中,我们将要学习机器学习的基础知识,包括其主要类型、变量类型、推荐系统的工作原理,以及机器学习中的伦理与应用。这些内容是构建和理解机器学习模型的重要基石。


机器学习的主要类型 🤖

上一节我们介绍了课程的整体框架,本节中我们来看看机器学习的主要类型。

机器学习主要分为三种类型:监督学习、无监督学习和强化学习。

以下是这三种类型的简要说明:

  • 监督学习:模型从带有标签的训练数据中学习,目标是学习一个从输入到输出的映射函数。例如,根据历史房价数据预测新房屋的价格。
  • 无监督学习:模型在没有标签的数据中发现内在结构或模式。例如,根据客户的购买行为将客户分成不同的群组。
  • 强化学习:智能体通过与环境互动并根据获得的奖励或惩罚来学习最佳行为策略。例如,阿尔法围棋(AlphaGo)学习下棋的策略。

机器学习的变量类型 📊

了解了机器学习的主要类型后,我们需要认识构建模型所使用的不同变量类型。

在机器学习中,数据通常以变量的形式表示,理解其类型对于选择正确的算法和预处理步骤至关重要。

以下是三种常见的变量类型:

  • 连续变量:可以在给定范围内取任意数值的变量。例如,身高、温度、价格。其数学表示通常为 x ∈ ℝ(x属于实数集)。
  • 分类变量:表示类别或组别的变量,其值通常是有限的、离散的标签。例如,性别(男/女)、产品类型(A/B/C)。在代码中,常使用字符串或整数编码表示,如 df[‘category’] = [‘A’, ‘B’, ‘A’, ‘C’]
  • 离散变量:取值为可数数目(通常是整数)的变量。例如,家庭孩子数量、订单中的商品件数。

推荐系统简介 🎬

掌握了变量类型后,我们可以探索一个重要的机器学习应用:推荐系统。

推荐系统通过分析用户偏好和行为,主动向用户推荐他们可能感兴趣的内容或商品。

以下是两种核心的推荐技术:

  • 基于内容的过滤:根据物品本身的属性特征(内容)和用户的历史偏好进行推荐。例如,如果用户喜欢看科幻电影,系统就会推荐其他具有科幻标签的电影。其核心思想是计算物品特征之间的相似度:相似度(物品A, 物品B) = f(特征A, 特征B)
  • 协同过滤:根据大量其他用户的行为(如评分、购买)来预测目标用户的喜好。其基本假设是,如果用户A和用户B在过去对某些物品的喜好一致,那么他们对新物品的喜好也可能一致。一种常见方法是用户-物品评分矩阵的分解。


机器学习的伦理与应用 ⚖️

最后,我们将探讨机器学习中一个至关重要但常被忽视的方面:伦理与应用。

因为机器学习模型非常强大,数据专业人员必须考虑其工作可能带来的伦理影响。接下来,我们将提供一些工具,帮助您避免常见错误,这些错误可能决定一个项目是问题重重还是成功顺利。

数据专业人员在规划、分析、构建和执行模型时,必须审视以下关键问题:

  • 模型是否存在偏见?训练数据是否代表了多样化的群体?
  • 模型的预测结果将如何影响个人或社会?是否存在潜在的伤害?
  • 我们是否保护了用户的隐私和数据安全?
  • 模型是否透明、可解释?其决策过程能否被理解?

本节课中我们一起学习了机器学习的基础知识。我们回顾了监督学习、无监督学习和强化学习这三种主要类型,区分了连续、分类和离散变量,介绍了基于内容过滤和协同过滤这两种推荐系统核心技术,并重点探讨了在机器学习实践中必须考虑的伦理问题与应用准则。理解这些概念是成为一名负责任且高效的数据专业人员的第一步。

004:机器学习的主要类型 🧠

在本节课中,我们将要学习机器学习的主要类型。我们将探讨监督学习和无监督学习的核心区别,并简要介绍强化学习和深度学习。理解这些类型是选择合适算法解决实际问题的关键。


监督学习与无监督学习

上一节我们介绍了回归模型的应用场景。本节中我们来看看,当面对更复杂的数据时,数据专业人士如何选择不同类型的机器学习方法。

根据可用数据的类型和待解决问题的性质,你通常会选择两种主要的机器学习类型之一:监督学习无监督学习。由于监督学习在工作场所中出现得更频繁,数据专业人士最常使用这种类型。

监督学习:使用带标签的数据

监督机器学习使用带标签的数据集来训练算法,以对结果进行分类或预测。数据专业人士使用监督机器学习进行预测。

以下是关于“带标签数据”的核心概念:

  • 带标签的数据是指被标记了代表特定度量、属性或类别标识的标签的数据。

例如,想象你需要一个算法,根据身高来预测一只鸟是企鹅还是鸵鸟。你有一个包含身高值的数据集,以及一个指明该测量值来自企鹅还是鸵鸟的指示符。身高值是 X 数据,指示符就是标签Y 数据

另一个例子是,你拥有一家餐厅。你拥有每月顾客数量和每月收入的数据。如果 X 是顾客数量,y 是收入金额,那么你可以使用一个算法,基于预计的顾客数量来预测下个月的收入。

无论是测量鸟类还是预测收入,你都需要带标签的数据来进行监督学习。

接下来,思考“分类”和“预测”这两个术语在监督学习中的应用。我们可以用鸟类和餐厅的例子来帮助理解。

以下是两种主要的监督学习任务:

  1. 分类:在鸟类例子中,算法旨在将不同类型的数据归类到不同的类别、等级或组别中。
  2. 预测(回归):在餐厅预测收入的例子中,算法的目标是基于已有数据来预测或估计一个数值

总结来说,监督机器学习算法使用已经包含答案的数据,并通过分类或估计未来数据来生成更多答案。

作为数据专业人士,你将手动调整这类模型以满足业务需求。运用你在数据清洗、统计学和回归方面的知识,你将学会训练、调整和优化复杂模型,以提供更准确的结果。

无监督学习:探索未标记的数据

数据专业人士使用的另一种最常见的机器学习类型是无监督学习

无监督机器学习使用算法来分析和聚类未标记的数据集。在这种类型中,数据专业人士要求模型提供信息,而不告诉模型答案应该是什么。

此时,你可能对“未标记数据”的含义有了概念。回想我们之前讨论的鸵鸟例子。未标记数据将描述一组不会飞的鸟,并且不包含任何标签、标记或分类。当你收到这样的数据集时,目标是根据模型检测到的模式,将鸟类按相似性进行分组,而不一定存在一个正确答案。

一旦算法部署,无监督学习将管理输入的数据并对其进行分类或分析。例如,当新闻聚合器按主题对文章进行分类,或媒体平台按类型对视频进行分类时,这都是由无监督学习算法完成的。

在本课程的后续部分,你将学习这些算法在概念层面如何工作、如何实现它们,以及如何将它们应用到工作中会遇到的数据集上。


其他机器学习类型

除了监督学习和无监督学习,还有其他几种机器学习类型。

强化学习:基于奖励与惩罚

强化学习常用于机器人技术,其原理基于对计算机行为进行奖励或惩罚。

以下是强化学习的基本流程:

  1. 计算机会根据其学习到的策略或规则集采取行动。
  2. 如果行动导致有利结果,它将获得奖励;如果导致不利结果,它将受到惩罚
  3. 根据获得奖励还是惩罚,计算机会更新其策略,试图优化奖励最小化惩罚
  4. 这个过程会重复,直到找到一个令人满意的策略。

深度学习:多层神经网络

深度学习模型由相互连接的节点层组成。

以下是深度学习的核心结构描述:

  • 每一层节点接收来自其前一层的信号。
  • 被其接收的输入激活的节点,然后将转换后的信号传递给另一层或最终输出。

机器学习与人工智能

另一个你经常听到的与机器学习相关的术语是人工智能。人工智能包含了所有类型的机器学习,因此在本课程中,我们将不依赖这个术语。相反,我们将专注于监督学习和无监督学习。这是机器学习最常见的应用,在这些领域拥有强大的技能对潜在雇主来说非常有价值。

监督学习和无监督学习使用了许多与强化学习和深度学习相同的原理,因此你将拥有所需的基础,以便未来自行进一步探索这些主题。

现在,你已经熟悉了机器学习的概况。在本课程中,机器学习属于人工智能的范畴。机器学习和人工智能指的是同一个核心原则:训练计算机检测数据中的模式,而无需对其进行明确的编程

在机器学习的范畴下,你还会找到我们讨论过的所有其他学习类型。


总结与核心要点

本节课中我们一起学习了机器学习的主要类型:监督学习、无监督学习,并简要了解了强化学习和深度学习。我们明确了监督学习需要带标签的数据进行分类或预测,而无监督学习则用于探索和聚类未标记的数据。

最后,有一个关于机器学习和数据科学的方面是每位数据专业人士都应该知道的:质量比数量更重要。对于数据专业人士来说,少量多样且具有代表性的数据通常比大量有偏见且不具代表性的数据更有价值。

005:确定特征何时为无限 📊➡️♾️

在本节课中,我们将要学习如何区分机器学习中的连续特征与离散特征,理解“无限”这一概念在数据中的含义,并了解这对选择机器学习模型的重要性。


无限的概念可能难以理解。无论是烹饪一顿饭还是阅读一本书,人类参与的大多数活动都有开始、过程和结束。换句话说,它们是有限的。但正如你在之前的课程中学到的,我们数据专业人员一直在处理无限,这在构建复杂模型时也是如此。

正如在本课程计划早期所学,连续特征可以取一个无限且不可数的值的集合。理解这个概念对于选择机器学习模型以及选择检查该模型效用的度量标准至关重要。

想象你拥有一个柑橘农场,你想了解今年金桔收成的平均重量。整个收成或总体是100蒲式耳。使用简单随机抽样,你从每蒲式耳中取出3个金桔并分别称重。

所有这些金桔记录下来的个体重量被视为连续数据,因为一个金桔的可能重量值是无限且不可数的。换句话说,一个金桔的重量不恰好是15克。在你称重的300个金桔中,它们的重量可能被测量到小数点后两位,如15.76、16.09和15.56,但测量是连续的,因为重量可以是这些测量点之间的任何无限数字,例如15.762950。

简而言之,重量是一个连续特征,因为它具有一组不可数的可能值

相反,你100蒲式耳中金桔的总数是一个固定的数量。因此,金桔的总数不是一个连续特征。作为一名数据专业人员,了解输入到机器学习算法中的特征是连续的还是固定的,对于选择正确的模型以及该模型的评估指标至关重要。

在决定使用哪种机器学习模型时,识别数据特征是否连续并不是唯一需要考虑的指标,但它是一个非常有用的指标。

以下是我们的机器学习地图,其中添加了一些新信息。在“监督学习”下方,你会发现一组用于预测连续结果的模型,包括几个回归器。

用于在连续统上进行预测的监督学习模型被称为回归算法。其中一些模型在本课程计划早期已介绍过,其他模型将在本课程后面定义。目前,你只需要知道数据专业人员使用这些类型的模型来处理连续数据。

这些模型的目标是基于提供的数据集预测结果或值。在这种情况下,数据专业人员工作的本质是训练模型,以尽可能准确地预测值,而这正是你接下来要学习的内容。


总结

本节课中我们一起学习了:

  1. 连续特征的定义:其可能取值构成一个无限且不可数的集合(例如重量、温度)。
  2. 连续特征与离散(固定数量)特征的区别。
  3. 识别特征是否连续,是选择合适机器学习模型(特别是回归算法)和评估指标的关键一步。
  4. 在监督学习中,用于预测连续结果的模型被称为回归算法

006:分类特征与分类模型 🧠

在本节课中,我们将要学习如何根据数据特征选择合适的监督机器学习模型。我们将重点探讨分类特征、离散变量与连续变量的区别,并通过实例理解它们在模型选择中的关键作用。


变量类型回顾

上一节我们介绍了机器学习的基本概念,本节中我们来看看不同类型的数据变量。理解变量类型是选择正确模型的第一步。

连续变量可以取无限且不可数的值集合。例如,一棵树的高度是连续变量。

分类变量包含有限数量的组别或类别。例如,车辆类型(汽车、摩托车、公交车)是分类变量。

离散变量在任意两个给定值之间具有可数个值。例如,公园中树木的数量是离散变量。

离散变量可以被计数,分类变量可以被分组。例如,房屋的油漆颜色是分类变量,而社区中漆成薰衣草色的房屋数量是离散变量。


监督学习中的分类变量

回忆监督机器学习的定义:它使用带标签的数据集训练算法,以对结果进行分类或预测。分类变量和离散变量是该定义的一部分。

许多机器学习算法使用将数据输入分为两个或更多组的大型数据集进行训练。了解数据集中的特征类型以及您期望的结果,将帮助您确定最适用的机器学习模型。


实例分析:毛绒玩具制造

让我们考虑一个来自制造业的例子。假设您是一家毛绒玩具制造商的领先数据科学家。

问题一:分类识别

您有一个自动化系统,可以同时填充、缝合和标记毛绒猫和狗。零售商现在要求猫和狗分开销售。工厂经理要求您使用摄像头识别猫和狗,以便自动分离。

基于摄像头图像的猫狗分组算法将使用分类数据作为监督机器学习模型的一部分。算法会问:这是狗还是猫?您将使用视觉数据训练计算机识别和分离传入的狗和猫。

核心概念:这是一个二分类问题,模型输出是类别标签(猫/狗)。

问题二:数量预测

随后,您被要求构建一个模型来预测运输所有毛绒动物需要多少个集装箱。

这具有离散的目标变量,因为您是在计算集装箱的数量。

核心概念:这是一个回归问题(预测数量),但目标变量是离散的。


机器学习模型地图:分类区域

现在,让我们重新审视我们的机器学习地图,其中新添加了分类区域。您会发现一些新术语。

分类是逻辑回归、决策树分类器、朴素贝叶斯分类器等模型所属的广泛类别。

请注意,决策树、随机森林和提升模型同时出现在连续区域和分类区域中,既作为回归器也作为分类器。

就像任何其他研究领域一样,有些功能和应用无法仅归入一个组。随着您对这些模型理解的加深,它们在两个区域中的位置将更有意义。我们将在课程后面花更多时间讨论这些算法。很快,您将开始构建自己的模型。


总结

本节课中我们一起学习了:

  1. 连续变量分类变量离散变量的定义与区别。
  2. 分类变量和离散变量在监督机器学习中的核心作用。
  3. 如何通过实际问题(如毛绒玩具的分类与计数)理解模型选择。
  4. 机器学习模型地图中分类区域的构成,以及一些模型(如决策树)既可处理分类问题也可处理回归问题的特性。

理解数据的本质是选择和应用正确机器学习模型的关键基础。

007:推荐系统基础 🎯

在本节课中,我们将要学习机器学习中一个非常常见且实用的应用:推荐系统。我们将探讨推荐系统如何工作,并深入了解其两种主要类型:基于内容的过滤和协同过滤。


概述

推荐系统是机器学习算法的一个子类,旨在为用户提供相关的建议。它们通过量化事物之间的相似性,并利用这些信息来推荐密切相关的选项,从而帮助用户更轻松地找到他们可能喜欢的信息、产品或内容。


推荐系统如何工作

上一节我们介绍了机器学习中不同类型的特征。本节中,我们来看看这些特征如何在一个你可能非常熟悉的模型类型中共同使用。

想象一下,你在流媒体服务上听完一张专辑后,系统自动开始播放一首你从未听过但非常喜欢的新歌。这是如何实现的?答案就是推荐系统。

推荐系统的主要目标是量化一件事物与另一件事物的相似程度,并利用这些信息来推荐一个密切相关的选项。

基于内容的过滤

首先,你在音乐流媒体服务上选择了一首歌。当歌曲结束时,服务会播放更多与你最初选择相关的音乐。这就是基于内容的过滤的一个例子。

在这种方法中,比较是基于内容本身的属性进行的。系统会将你所播放音乐的属性与其他音乐的属性进行比较,以确定相似性。

要进行这种比较,必须有关于每首歌的数据,这些数据是对其属性的解构。换句话说,歌曲的每一个独特之处都被识别和标记,例如歌手的嗓音类型、节奏或节拍,或者是否以某种乐器为特色。

以下是其工作原理的简化表示:

# 伪代码示例:基于歌曲属性计算相似度
def calculate_similarity(song_a_attributes, song_b_attributes):
    # 比较两个歌曲的属性列表(例如,流派、节奏、情绪)
    similarity_score = compare_attributes(song_a_attributes, song_b_attributes)
    return similarity_score

然后,当你搜索一首歌时,基于内容的推荐系统会访问该歌曲及其库中所有其他歌曲的属性列表。最后,系统会使用相同的属性列表对它们进行比较。优秀的歌曲推荐系统会对比数百个属性。

基于内容过滤的优缺点

以下是基于内容过滤的主要优点和缺点:

优点:

  • 易于理解:其逻辑相对直观。
  • 精准推荐:有助于推荐更多用户喜欢的内容,甚至是少数人感兴趣的利基内容。
  • 独立性:不需要其他用户的任何信息即可工作。
  • 灵活性:不仅限于比较物品(如歌曲),还可以将用户和物品映射到同一空间,然后推荐最接近用户典型偏好的内容。

缺点:

  • 重复性:总是推荐更多同类型的内容,可能导致用户无法接触到与他们过去选择不同或全新的内容。
  • 手动工作量大:通常需要为所有物品手动选择和映射属性,这是一项巨大的工作。
  • 跨类型推荐无效:由于不同类型的内容不使用相同的特征,因此无法进行跨类型推荐。例如,一本书没有“每分钟节拍数”这个属性,因此同一个流媒体服务无法利用你的歌曲偏好来推荐一本新小说。

协同过滤

在音乐流媒体的例子中,你实际上没有对任何内容进行评分。你只是听了播放列表,算法找到了相似的歌曲。然而,在视频流媒体平台上,你可能会对你喜欢的内容进行评分或评论。

推荐系统也可以利用你的反馈来推荐你可能喜欢的其他视频。在这个例子中,你不仅观看了内容,还通过点赞你喜欢的视频主动参与了反馈过程。这种推荐方法的一个缺点是,你可能喜欢关于各种主题的视频,但系统只会利用你的反馈来推荐与你喜欢的视频相似的内容。

另一种基于用户反馈的推荐系统工作原理是协同过滤

当用户通过评分或给予好评来主动表示喜欢某个内容时,就会引发协同过滤。推荐系统将使用协同过滤,基于还有谁喜欢该内容来进行比较,然后向具有相似偏好的其他人推荐视频。

协同过滤与基于内容的过滤不同,因为推荐系统不需要知道关于内容本身的任何信息。唯一重要的是你是否喜欢它。这是一种不同风格的推荐系统。

协同过滤示例:冰淇淋口味

假设我们想知道大卫会喜欢哪种冰淇淋口味。一个协同过滤系统会将他过去喜欢的物品与其他人的喜好进行比较。

因为大卫的喜好与法蒂玛的非常相似,算法会预测他也会喜欢“软糖布朗尼”口味,因为法蒂玛喜欢。

协同过滤的工作原理与物品本身无关。口味不重要,甚至是不是冰淇淋也不重要。它可以是汽车、餐厅或护发产品。唯一重要的是大卫和法蒂玛有相似的品味。

协同过滤的优缺点

以下是协同过滤的主要优点和缺点:

优点:

  • 跨类型推荐:这是协同过滤的主要优势之一。
  • 发现隐藏关联:能够在数据中发现隐藏的相关性。
  • 无需手动映射:不需要繁琐的手动属性映射工作。

缺点:

  • 冷启动问题:这些系统需要大量数据才能开始获得有用的结果,并且每个用户都必须向系统提供大量数据。
  • 数据稀疏性:协同过滤数据通常非常稀疏,这意味着存在大量缺失值。以电影为例,世界上有成千上万部电影,但大多数人只看过其中一小部分。因此,每个人的电影数据中,对于所有他们没看过的电影都会有缺失值。

一个推荐系统需要使用先进的过滤技术来管理所有这些空白空间。


总结

本节课中,我们一起学习了推荐系统的基础知识。大多数推荐系统都非常复杂,并使用混合模型,综合利用了基于内容过滤和协同过滤的元素。但即使在最简单的用例中,也存在不同的需求、资源和策略可供数据专业人员使用。数据专业人员的职责就是推荐最佳的问题解决方法。

008:机器学习中的公平与公正 🧠⚖️

在本节课中,我们将要学习机器学习模型开发中一个至关重要的议题:公平与公正。我们将探讨模型可能产生意外甚至有害后果的原因,并通过一个具体案例理解数据偏见如何影响模型性能。最后,我们会介绍一些在建模过程中减少风险的基本方法。


推荐算法的局限性与偏见

上一节我们介绍了推荐算法如何帮助用户发现新事物。本节中我们来看看这些算法可能存在的局限性。

最近,你学习了推荐算法,以及它们如何帮助用户发现从新的流媒体音乐到尝试新的护发产品,再到与朋友和家人一起玩的新游戏等各种事物。

这些算法可以非常准确,但也可能出错。例如,推荐工具的一个局限性是流行度偏见问题,即更受欢迎的物品被推荐得过于频繁。这导致大多数其他物品,即可能同样令用户满意的物品,没有得到应有的关注。


机器学习应用中的风险与责任

随着机器学习变得更加普及,其能力被应用于日益广泛的挑战领域,模型产生意外甚至有害后果的潜力也随之增大。

因此,作为数据专业人士,优先考虑你所拥有和使用的数据的公平性至关重要。这种负责任的数据管理的一部分,是采取措施减少机器学习应用产生意外后果的可能性。

数据专业人士还必须考虑风险。他们可能需要做出可能使企业及其服务对象面临负面后果的决策。认识到存在偏见的可能性将有助于最小化风险。


机器学习中偏见的隐蔽性

机器学习中的偏见尤其具有欺骗性,因为它源于人类的偏见,但由于是计算机做出预测,结果很容易显得客观。通常,这种偏见是无意的。

让我们考虑一个创建无意中不道德模型的例子。

假设你正在构建一个面部识别模型,作为某太阳镜零售商服务的一部分进行部署。为了生成面部模板数据库,你招募办公室的人进行面部扫描。

最终,你获得了数百次扫描,你认为这足以生成所需的模板。你兴奋地测试你的成果,于是请另一个部门的人作为测试组。测试结果超出了你的预期。你甚至将项目开源,以便其他人可以使用并在此基础上进行构建。


偏见导致的意外后果

但当服务上线后,其表现远不如预期。一个原因可能是你没有考虑到使用该服务的全部人群范围。

如果所有用于生成模板的人年龄都大于30岁,那么该服务可能对年轻人效果不佳。或者,你可能使用了某一性别端远多于另一端的人群。

由于你的工作已向公众发布,其他人现在可能在他们自己的模型中使用你的模板,而没有意识到模板和面部识别模型可能存在问题。

这一切都不是由不良意图引起的。负面后果是训练数据中偏见的结果,而这种偏见又源于数据收集过程中的偏见。具体来说,用于生成模板的面孔没有代表足够广泛的人群。

通过使用这个资料库来构建你的模型,你最终得到了一个存在数据类别不平衡的数据集。换句话说,在建模开始之前,输入数据就已经存在偏见了。


总结与展望

本节课中我们一起学习了机器学习中公平与公正的重要性。这只是一个例子,说明了机器学习解决方案如何可能带来与公平和公正相关的意外后果。

在本课程后续内容中,你将学习到其他例子。你还将学习到在建模过程的每个步骤中可以提出的一些基本问题,以帮助降低模型造成伤害的风险。

009:构建伦理模型 🧠⚖️

在本节课中,我们将要学习如何构建一个符合伦理的机器学习模型。预测模型是机器学习的核心,具有巨大的潜力,但同时也伴随着风险。因此,数据专业人员确保其模型符合伦理至关重要。

理解伦理模型的意义

首先,我们需要明确“伦理模型”意味着什么。这没有一个简单的指南,因为存在多种应用于不同任务的模型。

无论你处于哪个级别,作为数据专业人员,在解决任何问题时,都可能需要做出具有伦理影响的模型决策。尽管如此,提出有助于你思考模型公平性的问题始终是重要的。

模型开发规划阶段的关键问题

以下是你在模型开发规划阶段应该提出的一些问题。

  • 模型目的:模型的预期目的是什么?其预测将如何被使用?由谁使用?
  • 影响范围:谁会受到模型的影响?这些影响可能有多严重?
  • 数据与同意:如果你的模型使用个人信息,这些人是否同意你收集和使用这些数据?他们是否有权撤回同意?他们是否知晓你如何使用他们的信息?

分析数据阶段的伦理考量

上一节我们介绍了规划阶段的问题,本节中我们来看看分析数据时需要考虑的伦理问题。这一步也伴随着一系列问题。

你必须问自己:你打算用于构建模型的数据是否合适、来源良好且具有代表性。

以贷款预测模型为例,你的贷款数据是否追溯了很多年?如果是,那么历史上被边缘化和受压迫的群体很可能在数据中代表性不足,因为过去的测量可能受到偏见或歧视的影响。

数据科学中有一句俗语:垃圾进,垃圾出。如果你的数据存在问题,那么你的预测也会有问题。

模型构建与可解释性

在规划了流程并分析了数据之后,就该构建模型并提出更多问题了。

例如,模型的预测是否具有可解释性很重要?对于某些建模方法,可能很难知道预测的来源。这有时被称为黑箱模型

神经网络以难以解释而广为人知,因此,在许多透明度很重要的应用中,它们并不合适。

随机森林AdaBoostXGBoost这样的算法并非完全的黑箱,但可能需要额外的努力来解释和证明其预测的合理性。

在光谱的另一端,线性回归逻辑回归方法以及单决策树则具有很高的可解释性。

执行与部署前的最终检查

当你规划好一切、分析了数据并构建了模型后,在完成执行阶段之前,还有更多问题需要问。

首先,问问自己是否理解你的模型及其预测。它们合理吗?预测公平吗?

评估模型公平性的一种方法是检查模型的误差在人群中的分布情况。如果模型只在某些相似的特定情况下出错,它可能具有更高的伦理风险。

另一个问题是,是否有人被分配了在部署前和部署后审查与监控模型的责任,以确保其性能良好并评估潜在的危害。

最后,确保你在PACE流程的每个阶段都考虑到了同意问题。

总结

本节课中我们一起学习了确保模型符合伦理所需考虑的一系列问题。正如你所体会到的,要确保伦理的模型开发,需要提出很多问题。

很少有数据专业人员需要独自回答所有这些问题,但几乎每个数据专业人员都必须回答其中的一部分。因此,重要的是你要始终牢记,在PACE工作流的每个阶段提出正确的问题,有助于确保你的模型既有利于业务,也有利于所有相关方。

010:机器学习中的Python 🐍

在本节课中,我们将要学习数据分析和机器学习中常用的Python工具与文件类型。我们将了解集成开发环境(IDE)、Python脚本和Python笔记本各自的特点、适用场景以及它们如何帮助数据专业人员高效工作。


如今,有许多工具和程序可以帮助你进行数据分析并构建机器学习模型。作为一名数据分析专业人员,了解你的数字工具箱中有哪些可用资源,对于处理和解决问题至关重要。

在YouTube,我们需要处理海量数据。我不会每次都重新发明轮子,而是使用其他数据专业人员已经创建的工具和库,来帮助我高效地清洗、验证和可视化数据。在本课程中,你已经应用了其中许多工具。现在,让我们花点时间回顾一下你用过的一些软件、一些你尚未接触的软件,并理清它们在创建Python脚本或程序时的关系。

集成开发环境(IDE) 🛠️

在创建任何Python脚本或程序时,开发工作几乎总是在集成开发环境(IDE)中完成的。IDE是一种软件,它提供了一个界面来编写、运行和测试代码。

如果你学习过最初的谷歌数据分析证书课程,你使用过R语言及其配套的IDE——RStudio。虽然可以在任何标准文本编辑器中创建和运行脚本,但IDE提供了许多工具来支持你的代码开发。

在本课程中,你已经使用过一个IDE,可能甚至没有意识到。你一直在Jupyter Notebook界面中编写和执行Python代码。在这种情况下,Jupyter Notebook就是IDE。对于大多数编程语言,开发者都有许多IDE可供选择。它们的功能大体相似,但在具体功能和包含的工具上存在差异。选择哪一个通常取决于你的个人偏好或雇主的偏好。

稍后,你将了解更多关于IDE的知识。但现在,让我们来看看它们各自如何处理不同的Python文件。

Python文件类型 📄

两种最常见的文件类型是:扩展名为 .py 的Python脚本,以及扩展名为 .ipynb 的Python笔记本文件。根据任务的不同,数据专业人员可能会同时使用这两种文件类型,甚至在处理同一个问题时交替使用。尽管这两种文件类型都能执行代码,但它们各有优势。

重要的是要记住,Python不仅仅是一种用于数据科学的语言。它是一种灵活的通用语言,可用于Web开发、自动化、加密等任务。很多时候,你只需要一个Python脚本。

Python脚本(.py文件)

Python脚本是写在纯文本文件中的Python代码,由计算机执行,无需人工监督。在代码运行时不需要人工检查的情况下,数据专业人员通常更倾向于使用Python脚本。

以下是Python脚本的一些优势:

  • 多文件协作:当程序包含多个文件时,脚本尤其有用。
  • 调试便利:当程序中存在许多需要调试的错误时,脚本很有帮助,因为它们可以利用笔记本所不具备的额外功能。

Python笔记本(.ipynb文件)

然而,Python脚本通常并非数据科学的理想选择。数据分析专业人员,尤其是在进行探索性数据分析(EDA)时,需要使用Python交互式地探索数据集,并近乎实时地查看代码输出。这些结果通常需要与同事共享,并且必须是人类可读的格式。

对于使用代码来讲述故事的数据任务,Python笔记本更为可取。笔记本在将代码与人类可读的描述和输出配对方面非常有用。非代码元素,如图像、链接和普通文本,可以直接嵌入到文件中。它们还具有一些很好的功能优势,例如能够将文件导出为PDF。

工具选择与总结 🎯

看起来.py文件可能比.ipynb文件更受欢迎,但这并不一定正确。Python笔记本只是数据领域中另一个常见的工具,对学习者和行业专业人士都是如此。许多雇主都在寻找有使用现有Python笔记本经验并知道如何创建新笔记本的候选人。

在本课程的这一部分,你将继续使用Jupyter笔记本。然而,你所学的所有代码和概念在标准的.py文件中同样适用,如果你遇到需要该文件类型的情况。

Python脚本、笔记本和IDE只是工具箱的一部分。请将它们视为你将在本课程以及作为数据专业人员将要进行的其余项目的基础。选择合适的工具组合将帮助你成功完成任何给定的任务。


本节课中,我们一起学习了数据分析和机器学习工作流中Python的核心工具。我们明确了集成开发环境(IDE)的作用,并对比了Python脚本(.py)和Python笔记本(.ipynb)两种文件类型的特点与适用场景。理解这些基础工具,将为你后续高效地进行数据探索、模型构建和协作沟通打下坚实的基础。

011:不同类型的Python集成开发环境 🛠️

在本节课中,我们将要学习Python集成开发环境(IDE)的不同类型及其特点。了解这些工具将帮助你根据项目需求选择最合适的工作环境,从而提升数据分析与机器学习工作的效率。

认识集成开发环境

上一节我们探讨了集成开发环境的基本概念。本节中,我们来看看Python开发中可用的具体IDE选项。

了解你希望使用Python笔记本(Notebook)还是Python脚本(Script),有助于你规划项目的整体工作流程。但值得注意的是,在项目开始时选择了一种类型,并不意味着整个项目都必须使用它。数据专业人员在工作中途切换开发环境的情况,比想象中更为常见。如果你发现需要另一种IDE或文件类型提供的特定功能,随时可以切换。

常见IDE及其支持的文件类型

以下是几种常见IDE及其对文件类型的支持情况:

  • Jupyter Notebooks:最常用的IDE之一,但它仅支持Python笔记本,不支持Python脚本。
  • Spyder:这类IDE仅支持Python脚本
  • Visual Studio Code:这类IDE功能全面,可以同时支持Python笔记本和脚本

IDE的内置工具

选择IDE时,另一个需要考虑的因素是软件内置的工具。许多工具相对简单,但能显著提高开发效率。

以下是IDE中一些常见的实用功能:

  • 代码补全:这是一个非常普遍的功能。它根据代码中已有的函数和变量,自动补全你正在输入的内容。
  • 文件管理器:许多IDE包含文件管理器,在管理大型项目时非常有用。
  • 调试支持与代码测试:许多IDE也提供这些更高级的功能。不过,它们可能不是你作为数据专业人员日常工作中最常使用的工具。

灵活选择与调整

有时,你可能开始使用某个IDE后,才发现它缺少一些你所需或想要的工具。一旦你明确了需要的功能或希望做出的改变,你可以选择自定义当前使用的IDE,或者换用一个更符合需求的IDE

可以将你的IDE想象成一个厨房。烹饪一顿饭需要各种工具和器皿,但厨房是所有工作发生的物理空间。如果你是厨师,拥有一个让你感到舒适、所需物品一应俱全的厨房,会让烹饪过程轻松得多。将同样的逻辑应用到你的工具和软件上,将使你在整个职业生涯中成为一名更出色的数据专业人员。

本节课中,我们一起学习了不同类型的Python集成开发环境,了解了它们对笔记本和脚本的支持差异,认识了常见的内置工具,并强调了根据项目需求灵活选择和调整开发环境的重要性。

012:深入理解Python包 📦

在本节课中,我们将要学习Python包的基础知识。包是Python生态系统的核心,它们提供了大量预构建的功能,能极大地提升我们的工作效率。我们将了解包的分类、常见包的作用以及它们如何协同工作以完成数据分析任务。


在本课程中,你已经学习了许多关于Python及其内置函数的知识。你也使用了一些Python包和库进行编程。

Python包是模块的集合,包含了基础Python语言中不一定存在的功能。模块用于以结构化的方式组织函数、类和其他数据。Python中的库就是包的集合。

在本视频中,你将探索一些常见的包,包括它们能做什么以及它们如何协同工作以帮助你完成任务。


通常,作为数据专业人士,你会使用三种类型的Python包。它们可以用来完成相同的任务。然而,它们通常存在细微差别,这些差别可能使得某个包在特定情况下更有用。

第一类:操作型包 🛠️

操作型包也是你在分析过程中通常会首先使用的包。这类包用于加载、构建和准备数据集以供进一步分析。

当创建一个用于分析的Python文件时,你首先要做的是读取数据。pandas 包通常是完成此任务最有用的工具。但 pandasread_csv 函数(用于将数据读入数据框)只是该包功能的冰山一角。

为了进行高效的分析和建模,你可以使用 pandas 包内置的函数。这使得完成任务变得更加容易,包括:

  • 初步数据检查
  • 数据清洗
  • 数据框的合并与连接

其他操作型包,如 NumPySciPy,提供了用于高级数学运算的函数。

第二类:数据可视化包 📊

有许多不同的包可以帮助你根据项目需求创建完美的图表和图形。虽然最流行的包中都存在简单的绘图函数,但它们之间存在细微差别。你应该尽可能多地熟悉它们。

以下是几个重要的可视化包:

  • Matplotlib:通常是Python中基础可视化的首选库。它功能广泛,可能难以精通,但极其强大,允许开发者创建几乎任何他们能想象到的图形。
  • Seaborn:另一个专注于统计可视化的包。使用Seaborn创建统计图很简单,但创建其他类型的图表有时不可能或需要付出太多努力。
  • Plotly:通常用于演示或出版物,例如为交互式仪表板创建数据可视化。在难以精通这一点上,它与Matplotlib类似,但它可以创建令人惊叹的图形,甚至允许你为可视化添加交互元素。

第三类:机器学习包 🤖

本课程中使用的最后一类包是用于机器学习的。scikit-learn 是一个机器学习库,它建立在我们已经讨论过的许多包之上。

这个库使你能够构建各种类型的模型,包括监督学习和无监督学习。它还提供了一个很好的界面来分析模型的结果。


包极大地扩展了Python的功能,经验丰富的数据专业人士会在工作中使用许多包。随着你对所有这些令人兴奋的工具和功能越来越熟悉,你将为一个成功的数据职业生涯做好更充分的准备。


本节课总结

本节课我们一起学习了Python包的分类与核心功能。我们了解到:

  1. 操作型包(如 pandas, NumPy)用于数据的加载、处理和准备。
  2. 可视化包(如 Matplotlib, Seaborn, Plotly)用于创建静态或交互式的数据图表。
  3. 机器学习包(如 scikit-learn)提供了构建和分析机器学习模型的工具。

掌握这些包是成为一名高效数据专业人士的关键。

013:编程问题解答资源 📚

在本节课中,我们将学习当你在数据分析或编程过程中遇到问题时,如何有效地寻找解决方案。掌握这些资源的使用方法,是每位数据专业人士必备的技能。


关于数据领域的一个小秘密

数据领域有一个小秘密:几乎没有人能在所有时间都清楚自己在做什么。即使是最有经验的专业人士,也会在代码或数据分析过程中遇到问题,并需要寻找答案。

因此,理解有哪些可用资源能帮助你找到所需解决方案,就显得尤为重要。


遇到问题时的情景与第一步

让我们设想一个情景:你刚写完一段代码并按下运行按钮,但出现了一个错误。这可能是数据导入方式的问题,也可能是数据准备过程中的某个环节不完全正确。

此时你能做什么?第一步通常是搜索这个错误信息。因为大多数问题都曾被其他开发者遇到过。


利用错误信息与集成开发环境(IDE)

Python 特别擅长告诉你错误发生在哪里,无论是简单的语法错误还是其他异常。你的集成开发环境(IDE)通常会明确指出问题所在,并附带捕获到错误的确切行号。

你可以将错误输出信息复制下来,并在网上进行搜索。这通常能带来非常有帮助的结果。事实上,你经常会在前几个搜索结果中找到与你完全相同的错误。

示例代码:

# 假设你遇到了一个常见的错误,比如未定义变量
print(variable_name)  # 如果 variable_name 未定义,Python会抛出 NameError

核心求助平台:Stack Overflow

如果你在常规搜索中得不到所需的帮助,可以直接在 Stack Overflow 这样的公共平台上搜索。Stack Overflow 是解决编码问题的首选资源,被许多数据专业人士视为编码问答的权威集合。

不仅如此,其社区响应迅速且乐于助人,因此你应该放心地提出自己的问题。


官方文档的重要性

另一个极好的资源是你正在使用的包或模块的官方文档。文档是由创建该包的开发者编写的深入指南,包含了关于各种函数和特性的具体信息,并且通常附有有用的示例。

核心概念: 始终将 官方文档 作为理解工具功能的第一手资料。


Kaggle:学习与实践的社区

Kaggle 是许多数据专业人士在其职业生涯中某个阶段会使用的另一个资源。这个在线社区拥有数万个公共数据集,以及提供了如何完成各种分析的示例的 Python 笔记本。

许多刚进入数据科学行业的人使用 Kaggle,因为它提供了学习与实践机器学习技术的教程和数据集。在行业工作多年的数据专业人士也使用 Kaggle 来了解技术的新进展,并保持技能的敏锐。


保持工具更新

当你遇到错误信息或其他编码问题时,最佳实践之一是考虑你的工具是否是最新的。包的更新有时会破坏已有的代码,或改变特定函数的访问和使用方式。

你的代码通常会抛出一个错误来告诉你某个包或软件是否过时,但保持主动更新可以首先预防这些问题。因此,请确保你拥有所有软件和工具的正确版本。

核心概念: 定期使用包管理器(如 pip)更新你的 Python 包。

pip install --upgrade package_name

总结与展望

本节课我们一起学习了在编程中遇到问题时可以求助的几种核心资源:从利用错误信息和 IDE 提示,到搜索 Stack Overflow 和查阅官方文档,再到利用 Kaggle 社区进行学习,以及保持工具更新的重要性。

这些资源只是你寻求编程帮助时可以考虑的一部分。你会发现开发者在互联网的各个角落进行协作。你学得越多,自己找到解决方案就会越容易。记住,遇到问题是学习过程中的正常部分,善于利用资源解决问题才是关键。

014:构建你的机器学习团队 👥

在本节课中,我们将学习在工业环境中进行机器学习项目时,如何识别并协同不同的团队成员与部门。理解团队协作是项目成功的关键因素之一。


概述

进行数据任务时,技术工具和在线知识库固然重要,但在工业界工作,同等重要的是了解哪些团队成员能帮助你解答疑问或解决问题。这并不仅限于其他数据专业人士,许多利益相关者都对数据任务有所贡献。

上一节我们介绍了技术资源的重要性,本节中我们来看看人的资源——你的团队。


关键团队成员与部门

以下是你在执行机器学习项目时可能需要咨询的关键团队。了解这些团队能帮助你更高效地获取信息、资源和支持。

1. 信息技术部门

信息技术团队掌握公司内部特定的技术栈。他们可以解释公司有哪些可用的软硬件资源。

  • 例如:如果你意识到需要特定的软件或硬件来完成手头的问题,IT部门可以帮助你获取所需资源。

2. 商业智能部门

商业智能团队负责处理原始数据,使其可用于进一步分析。他们的产出形式多样。

  • 他们可能提供用于快速洞察的仪表盘
  • 他们也可能提供关于数据集的初步信息,你将利用这些信息来构建模型。

3. 市场/销售/产品部门

这些部门有时被称为销售账户、用户洞察或产品管理团队。他们能从最终产品的角度,为你提供分析背后的业务动因

  • 例如:如果你想确认数据项目方向正确,与市场部门沟通可以为你提供更清晰的工作目标。

扩展协作网络

除了上述提到的团队,工作中你还可以咨询许多其他部门。了解与你项目相关的专业人士能为你带来巨大帮助。

因此,每当你开始一份新工作时,主动了解这些团队是非常有价值的。此外,在面试情境中,询问公司的团队构成也是一个你可以且应该做的准备。

你可以提出诸如以下问题:

  • “我将与哪些其他团队合作?”
  • “如果我遇到[某个具体问题],有哪些资源可用?”

这些问题能让你对未来日常的工作环境有一个很好的预判。


总结

本节课中我们一起学习了机器学习项目中的团队协作。请记住,数据工作是协作性的,你的项目总会涉及其他利益相关者。你应该尽可能地利用这些关键资源,与不同的团队有效沟通,共同推动项目成功。


核心要义成功的数据项目 = 强大的技术 × 高效的团队协作

015:连接数据专业社区 📚

在本节课中,我们将跟随产品分析师Samantha,了解数据科学从业者如何通过连接专业社区来保持知识更新、解决实际问题并推动职业发展。

概述

数据科学是一个快速发展的新兴领域,持续学习并与同行交流至关重要。本节将探讨如何利用线上平台和线下会议,构建你的专业支持网络。

社区的价值与参与方式

上一节我们介绍了数据科学的基础概念,本节中我们来看看从业者如何在实际工作中成长。Samantha指出,数据科学领域不断涌现新技术、新语言和新方法。保持与时俱进的最佳方式之一是积极参与专业社区。

以下是几种有效的社区参与途径:

  • 关注社交媒体专家:在Twitter上关注数据科学家,或浏览Reddit的相关论坛。
  • 阅读专业博客:关注由公司或个人贡献者维护的数据科学博客。
  • 参与问题讨论:寻找能与其他数据科学家交流、讨论项目难题的场所。

这些社区资源非常实用,当你需要寻找未曾想到的方法、有用的技术,或是一些教科书里学不到的小技巧时,它们总能提供参考。在日常工作中,Samantha也常会使用社区中其他数据科学家自行开发的代码库,这些资源常能帮助解决一些此前无法处理的难题。

线下会议与行业交流

除了线上社区,线下会议也是连接行业网络的重要桥梁。数据科学传统上是一个学术性很强的领域,有众多学术会议可供参加。

对于业界从业者而言,开放数据科学会议(Open Data Science Conference) 是一个绝佳的选择。在那里,你可以遇到来自全球各大公司的分析师、科学家和工程师。大家齐聚一堂,共同学习最新技术、拓展人脉、相互结识。

这是一个结识业内其他数据科学家的宝贵机会,尤其是那些可能没有传统学术背景或不符合招聘启事上典型头衔的从业者。

构建支持网络对职业发展的帮助

对Samantha而言,在她学习数据科学和职业起步阶段,找到一群志趣相投、并能提供建议和咨询的社区伙伴,起到了关键作用。

这个支持网络可以提供多方面的帮助:

  • 招聘与求职:交流数据科学相关的招聘信息和面试经验。
  • 技术问题解答:协助解决那些在互联网上难以找到答案的编码问题。
  • 项目合作:寻找伙伴共同完成数据科学项目。

在完成你的第一个数据科学项目时,拥有可以协作的伙伴只会让事情变得更容易。

总结

本节课中我们一起学习了数据科学从业者连接专业社区的重要性与方法。通过积极参与线上论坛、关注行业领袖、阅读专业博客以及参加线下会议,你可以建立一个强大的支持网络。这个网络不仅能帮助你保持知识更新、解决技术难题,还能为你的职业发展和项目合作提供宝贵的资源与人脉。记住,在快速变化的数据科学领域,你永远不是独自前行。

016:《机器学习的基础知识》课程总结 🎯

在本节课中,我们将回顾并总结《机器学习的基础知识》这一模块的核心内容。我们已经学习了许多新的、复杂的概念,现在是时候巩固一下了。


回顾学习历程 📚

首先,让我们花点时间回顾一下我们已经走过的路程。我们涵盖了不少新的、复杂的概念。

以下是本模块中我们学习到的核心知识点:

  • 机器学习的类型:我们识别并区分了机器学习的主要类型,包括监督学习无监督学习强化学习深度学习
  • 特征的类型:我们讨论了连续特征离散特征的区别。同时,我们也学习了分类特征,它是离散特征的一个有限集合。
  • 推荐系统概述:我们概述了推荐系统,以及它们如何用于从音乐到冰淇淋口味等各种内容的推荐。你现在已经熟悉了推荐系统的工作原理。
  • 推荐系统方法:你能够识别基于内容的过滤协同过滤之间的区别,以及它们各自的优点和缺点。
  • 数据责任:最后,我们学习了为什么成为负责任的数据管理者很重要,以及如何在模型开发的每一步提出关键问题。

伦理考量与影响 🤔

通过思考伦理影响,你学会了如何减少模型可能导致的意外或有害后果。所有这些概念和技能对于成为一名数据专业人士至关重要。


展望未来 🚀

掌握这些知识对你继续本课程的学习将特别有帮助。在接下来的课程中,你将:

  • 选择机器学习模型。
  • 学习衡量模型的方法。
  • 使用Python构建模型。

这些重要的技能将使你能够成为一名数据驱动的故事讲述者,无论你在哪里工作,都能成为推动变革的强大影响者。


总结 ✨

本节课中,我们一起学习了机器学习的基础分类、不同类型的数据特征、推荐系统的基本原理与两种主要方法,以及数据科学实践中的伦理责任。这些构成了你迈向数据科学领域的坚实基石。

恭喜你完成本模块的学习!我们下一部分课程再见。

017:模块2介绍 🚀

在本节课中,我们将开始学习如何从零开始构建机器学习模型。我们将应用之前学到的知识和技能,完成一个完整的模型构建流程。数据专业人员在实现业务目标时会运用多种技术,并且我们有很多机会持续学习和改进我们的成果。

数据专业人员也深刻意识到,人类本身是不完美的。同样,我们构建的模型和数据集也存在不完美之处。但这并不意味着它们没有用处,只是意味着我们需要了解其局限性。事实上,预期不完美可以成为一种优势。此外,有许多工具可以帮助我们更好地理解数据的局限性,甚至将其转化为有效的数据解决方案。


上一节我们介绍了机器学习的基本概念,本节中我们来看看模型构建的实际流程。

在接下来的内容中,我们将探索这些优势,同时构建并优化我们的模型。这对于你未来在数据领域的职业发展将是一项宝贵的技能。

以下是本模块的核心要点:

  • 模型和数据集的不完美是固有的,但可以被理解和利用。
  • 存在多种工具和技术来识别并处理这些局限性。
  • 通过实践构建完整模型,可以将理论知识转化为有价值的技能


本节课中我们一起学习了模型构建的初步视角,认识到不完美是模型开发过程中的一部分,并准备好开始动手实践。让我们在下一个视频中正式开始。

018:机器学习中的节奏 🎯

在本节课中,我们将学习如何运用PACE工作流程来构建有效的机器学习模型。PACE代表计划、分析、构建和执行四个阶段,它能帮助数据专业人员将数据和模型与业务需求对齐。我们将通过一个预测银行客户流失率的实例,全面理解数据、进行特征工程、处理类别不平衡问题,并使用朴素贝叶斯模型进行建模与评估。


回顾PACE工作流程 📋

上一节我们介绍了机器学习的基本概念,本节中我们来看看构建模型的具体节奏——PACE工作流程。

PACE由四个阶段组成:

  • Plan(计划)
  • Analyze(分析)
  • Construct(构建)
  • Execute(执行)

PACE工作流程能指导数据专业人员采取步骤,确保我们的数据和模型与业务需求保持一致。


应用PACE:预测客户流失 🏦

我们将使用PACE框架来更全面地理解数据,并为建模做好准备。这包括运用特征工程和处理类别不平衡的技术。

接下来,我们将使用Python中的一种监督学习模型——朴素贝叶斯进行实践。目标是建立银行客户流失率模型,以预测客户是否会关闭其银行账户。在此语境下,流失率是指在一定时间内客户停止与公司业务往来的比率。为了持续改进,我们将创建不同的模型迭代版本。

最后,我们将使用性能指标来评估模型在多大程度上成功地解决了业务需求。


工作流程的价值与总结 ✅

使用PACE工作流程不仅为解决问题提供了良好的基线,还能帮助数据专业人员在整个过程中保持专注。

通过应用和参考这个框架,你将掌握在职业生涯中处理数据驱动问题的技能。

本节课中我们一起学习了PACE工作流程及其在构建机器学习模型中的应用。我们从计划阶段开始,经历了数据分析和准备,实践了朴素贝叶斯模型的构建,并最终通过评估来验证模型对业务需求的满足程度。掌握这一节奏,是高效解决实际数据科学问题的关键。

019:规划机器学习项目 📋

在本节课中,我们将学习如何规划一个机器学习项目。这是PACE工作流程的第一步,其核心是围绕业务需求进行规划,并选择最合适的机器学习模型。我们将通过一个预测房价的实例来具体说明这一过程。


规划阶段:围绕业务需求

上一节我们介绍了PACE工作流程,本节中我们来看看其第一步——规划阶段。规划阶段的核心是确保你的机器学习项目与业务目标保持一致。

使用PACE工作流程时,必须确保你的计划与业务团队和数据团队的目标一致。这意味着你计划构建的机器学习模型需要满足实际的业务需求。这一点看似显而易见,但考虑到问题的潜在复杂性,最终产出很可能涉及多个部门的协作。在进入模型构建的其他流程之前,你还必须考虑你可用的数据。

请记住,你通常是为公司或组织构建模型。因此,你需要确保在PACE的其他阶段(如分析、构建和评估)中,你的数据建模、指标和优化策略始终聚焦于你在规划阶段制定的目标。


规划阶段:选择机器学习模型

在明确了业务需求之后,规划阶段的第二部分是根据业务需求的背景和要求,考虑哪种类型的机器学习模型最适合解决当前问题。

以下是选择模型时需要考虑的关键因素:

  • 问题类型:明确是分类、回归还是聚类问题。
  • 数据性质:数据是带标签的(监督学习)还是无标签的(无监督学习)。
  • 输出目标:需要的是离散类别、连续数值还是数据分组。

让我们通过一个例子来具体探索。假设你在金融行业工作,你的公司正试图预测房价。你拥有某个地区房屋的大量数据集。这个数据集包含了房屋的信息,例如面积、卧室和浴室的数量以及地理位置。最重要的是,数据集中还包含每栋房屋最近的售价。

基于你对机器学习模型的了解,你需要创建一个监督学习、连续模型来获得所需的数值结果。对于这个预测房价的例子,回归模型是唯一能帮助你达成目标的模型类型。

回归模型的核心公式可以简化为寻找一个函数 f,使得:
预测房价 = f(面积, 卧室数量, 浴室数量, 地理位置, ...)


总结与过渡

本节课中,我们一起学习了机器学习项目规划阶段的两个核心部分:首先是围绕业务需求进行规划并确保跨团队对齐,其次是基于业务问题选择最合适的机器学习模型类型。

现在,你已经为业务问题制定了计划,并明确了机器学习模型的范围,接下来就可以准备进入PACE工作流程的下一步:分析(Analyze)。我们下节课再见。

020:从错误中学习 📚

在本节课中,我们将跟随Waymo的数据科学经理Ganesh,学习他在进行A/B测试时遇到的一个具体挑战,以及如何通过分析问题根源并调整策略来克服它。我们将重点理解在数据科学实践中,从错误中学习并避免重复犯错的重要性。

背景介绍

我是Ganesh,是Waymo的数据科学团队经理。Waymo是Alphabet旗下的自动驾驶汽车公司,我们的目标是实现驾驶自动化,让用户能够随时随地召唤车辆并前往目的地。

我管理的团队主要目标是寻找优化和改进Waymo日常流程的机会。每天都是新的挑战,因为今天处理的问题可能与明天的完全不同。我们团队的一项重要职责是为Waymo运行实验。

实验设计与挑战

每当有人考虑进行流程变更或推出新功能时,我们就会运行实验,也就是通常所说的A/B测试,以确定这个变更是否真正有益,是否按预期工作,以及我们将从这些变更中获得什么影响。

有一次,我们正在进行一项A/B测试,以衡量某个流程改进带来的效果。

  • 对照组:执行旧流程。
  • 实验组:执行新流程。

我们预期这个新流程会带来巨大的改进,因为我们非常确信。我们进行了一些演示,并认为新流程明显优于旧流程。

意料之外的结果

然而,当我们启动测试后,并没有发生任何显著的变化。我们等待了一段时间,结果依然如故。

这令人感到棘手,因为许多项目经理和产品经理都为此投入了大量精力。

深入调查与发现

我们进行了一些实地研究,去探究问题出在哪里。

我们发现,用户已经非常习惯于旧流程,以至于他们完全不愿意尝试新流程。他们又回到了旧的工作方式。这就是我们的测试没有达到预期的原因。

关键教训与策略调整

这对我们来说是一个重要的学习时刻,对我个人而言尤其如此,因为这是启动A/B测试的一个重要环节。

正是在那时,我意识到,不应该让现有用户或客户来尝试流程变更。最好使用新用户来测试这些新流程。

  • 原因:新用户没有使用习惯的包袱,能提供无偏见的反馈,从而可以真实衡量新流程的影响

试想,如果问题没有得到解决,我们可能会错误地认为新流程不好,从而放弃一个真正对公司有益的项目。因此,解决这个问题、找出根源,确保我们没有放弃它,并最终推出了对公司真正重要的东西。

总结与心态建议

犯错是可以接受的。你遇到的很多情况,对许多人来说可能都是第一次。所以,寻求帮助是可以的,犯错也是可以的

但关键在于,我们不应该一次又一次地重复同样的错误

因此,保持这种尝试、实践、学习的心态,是任何数据科学家都必须具备的最重要的素质。

021:为机器学习模型分析数据 📊

在本节课中,我们将学习PACE框架中的“分析”阶段。我们将探讨如何为机器学习模型准备和分析数据,重点关注理解响应变量和预测变量,并初步了解特征工程的概念。


在上一节中,我们探讨了PACE框架的“计划”阶段。现在,您已经完成了初步规划,是时候进入PACE的“分析”阶段了。

在计划阶段,将业务需求作为核心焦点至关重要。这一原则在开发机器学习模型的整个过程中也同样重要。业务需求告知数据专业人员模型需要产出什么,其结果指明了需要何种类型的模型。业务需求还告知数据专业人员,需要哪些数据来训练模型以达到预期结果。

分析阶段的主要重点是更深入地理解数据,同时始终牢记模型最终需要预测什么。

例如,如果您正在创建一个监督学习模型,您首先需要知道您的模型试图预测什么。换句话说,您需要理解您的响应变量。您在本课程前面决定使用哪种类型的监督学习模型时已经做过这件事:是连续型还是分类型。

让我们以天气为例。如果您需要预测精确的降水量,您可能会选择连续型模型。但如果业务需要一个能够预测是雨天、阴天还是晴天的模型,那就需要一个分类型模型。

通常,作为一名数据专业人员,您的数据可能不会完全按照您需要的方式结构化。这时,您可以利用之前学到的许多探索性数据分析原则。您将使用迄今为止学到的所有技术,来了解您拥有哪些可用数据以及它们的结构如何。

让我们回到预测降水量的连续型模型例子。在您的数据集中,记录的降雨量可能不是所需的精确单位,或者数据可能在雨、雪和其他类型的降水之间分开。这些都是数据专业人员在构建模型本身之前需要分析的细节。

对于预测雨天、阴天还是晴天的分类型模型例子,您的数据集可能没有标注您需要的类别。数据集中的各个日子可能只标注了云量指标,这是您必须更改才能有效分析结果的内容。

在牢固理解了响应变量是什么以及它们的结构之后,下一步是探索您的预测变量。理解数据集中变量之间存在的关联对于构建能产生有价值结果的模型至关重要。

与响应变量类似,预测变量可能不是您想要的格式或样式。在这些情况下,同样的考虑因素适用。您需要在构建模型之前确定您希望数据如何结构化。

这种仔细考虑您拥有的变量和您需要什么的流程,将引导我们进入分析阶段的下一部分:特征工程。接下来,您将学习特征工程、可用的各种技术、在哪些场景中使用它们,以及它们能为您的数据做什么。


本节课中,我们一起学习了机器学习模型开发中“分析”阶段的核心任务。我们明确了理解业务需求对定义响应变量和模型类型的重要性,并探讨了如何检查和处理响应变量与预测变量的数据格式。最后,我们引入了特征工程的概念,为下一阶段的学习做好了准备。

022:特征工程入门 🛠️

在本节课中,我们将要学习特征工程的基础知识。特征工程是数据分析阶段的核心环节,它通过选择、转换或提取原始数据的特征,为构建高性能的机器学习模型奠定基础。


概述

上一节我们介绍了分析阶段的主要目标是深入理解数据。仔细考虑已有的变量和所需的信息,会自然引导我们进入分析阶段的下一部分:特征工程。特征工程技术旨在解决数据结构化的问题,如果执行得当,可以显著提升模型的性能。本节视频将详细介绍特征工程的概念、工作原理及其应用场景。


什么是特征工程?

特征工程是运用实践、统计学和数据科学知识,从原始数据中选择、转换或提取特征、属性和特性的过程。这个定义包含几个关键点。首先,特征工程的过程高度依赖于你正在处理的数据类型。

在我们深入探讨之前,先看一些例子。之前,我们学习过连续型和分类型特征(或变量)。请记住:

  • 连续型变量是通过测量获得的变量,因此可以取无限且不可数的一系列值。
  • 分类型变量则包含有限数量的组别、类别或可数的数值。

特征工程的过程,就是改变和调整这些变量,最终目标是将其用于训练模型。这通常是一个具有挑战性的过程。工作中使用的数据集有时需要多轮探索性数据分析和特征工程,才能将所有数据调整到适合训练模型的格式。

这个过程突显了PACE框架对数据专业人员如此有益的一个原因。分析阶段直接建立在计划阶段之上,或者更简单地说,计划指导着你的分析方式。如果没有战略上一致的商业和技术计划,分析阶段和特征工程过程就像试图在没有蓝图的情况下建造摩天大楼。


特征工程的三大类别

特征工程主要分为三大类:特征选择特征转换特征提取。以下是关于这些类别的详细介绍。

1. 特征选择

这类特征工程的目标是选择数据中对预测响应变量贡献最大的特征。换句话说,就是剔除那些对做出预测没有帮助的特征。这可以手动完成,也可以通过算法实现。

我们用一个简单的天气数据集作为例子。它包含五个不同的变量和14个数据点。最右边的变量代表基于其他数据,你是否愿意在外面踢足球。

在我们的例子中,外面是否刮风可能不会影响我们踢足球的决定。如果是这种情况,那么我们会选择outlooktemperaturehumidity,并从数据集中剔除windy。特征选择意味着选择对做出预测最有帮助的变量。

2. 特征转换

在特征转换中,数据专业人员获取数据集中的原始数据,并创建适合建模的特征。这个过程通过修改现有特征来完成,目的是在训练模型时提高准确性。

在我们的天气数据集例子中,你的数据可能包含精确的温度值,但你可能只需要一个指示天气是热、冷还是温和的特征。为了实现这种转换,你可以为数据定义一些分界点,并从数值数据中创建一个新的分类特征。

例如,你可以定义:

  • 任何高于80华氏度为“热”。
  • 任何低于70华氏度为“冷”。
  • 两者之间的任何温度为“温和”。

特征转换意味着将度数转换为你定义的温度类别。

3. 特征提取

这类特征工程涉及组合多个特征以创建一个新的特征,从而提高算法的准确性。

例如,假设我们想创建一个名为muggy的新变量,用于模拟我们是否踢足球。如果温度温暖且湿度高,变量muggy将为真。如果温度或湿度任一较低,则muggy为假。


特征工程的重要性

请记住,特征工程技术旨在提高模型的性能。虽然你可以通过调整和优化模型来获得很多改进,但最稳定、最显著的性能提升往往来自于将变量开发成最适合模型的格式。

在我的工作中,这通常表现为需要将结果变量变为二元的。例如,我们可能会获得用户从一星到五星的评分,但我们需要预测某条内容是“好”还是“坏”。在这种情况下,我们需要通过将星级评分映射到“好”或“坏”的标签来改变我们的响应变量。这是数据专业人员在分析阶段更好地理解其数据的一个例子。

在探索性数据分析期间,你只是开始对数据形成初步理解。特征工程则是超越探索性数据分析的一步:你正在为机器学习模型的构建,从数据集中选择、提取或转换变量或特征。


总结

本节课中,我们一起学习了特征工程的基础概念。我们了解到特征工程是分析阶段的关键步骤,包括特征选择、转换和提取三大类。它的核心目标是通过优化数据的结构和表示,为机器学习模型提供更有效的输入,从而提升模型性能。现在你对特征工程的概念有了更好的理解,已经准备好在未来使用Python进行自己的特征工程实践了。

023:解决类别不平衡问题 🎯

在本节课中,我们将要学习机器学习中一个常见且重要的问题:类别不平衡。当数据集中某个类别的样本数量远多于另一个类别时,就会发生类别不平衡,这可能导致模型预测出现偏差。我们将探讨其定义、影响以及两种核心的解决技术:上采样下采样

理解类别不平衡 ⚖️

上一节我们介绍了数据分析阶段需要理解变量及其结构。本节中我们来看看分类问题中另一个关键方面:响应变量的频率分布

作为数据专业人员,你可能会遇到响应变量分布不均的数据集。一个典型的例子是欺诈检测:你可能拥有数百万条非欺诈交易记录,但只有几千条真正的欺诈交易记录。在这种情况下,如何构建一个能够有效检测欺诈的模型呢?

这个问题被称为类别不平衡。类别不平衡是指数据集的预测变量中,一个结果类别的实例数量远多于另一个结果类别。实例数量多的类别称为多数类,而实例数量少的类别称为少数类

一个数据集的结果类别完美地按50/50分割是极其罕见的,通常都存在某种程度的不平衡。然而,这不一定是个问题。信不信由你,70/30或80/20的分割比例通常是可以接受的。只有当多数类占数据集的90%或更多时,才会出现重大问题。通常,只有在模型构建完成后,你才能知道是否存在不平衡问题。

解决不平衡的技术:上采样与下采样 🔧

为了解决潜在的类别不平衡问题,主要有两种技术:上采样下采样。这两种技术都涉及以某种方式调整数据,在消除不平衡的同时,尽可能保留数据中的信息。

下采样 📉

下采样涉及通过使用更少的原始数据集来调整多数类,以产生更均匀的分割。多数类的条目数量减少,从而带来更好的平衡。

以下是实现下采样的常见方法:

  • 随机下采样:随机选择多数类中的条目进行移除。
  • 公式化下采样:例如,计算多数类中两个数据点的平均值,移除这两个原始数据点,并添加这个平均数据点。

上采样 📈

上采样与下采样相反。它不是减少多数类的频率,而是人为地增加少数类的频率。与下采样类似,也有多种实现方式。

以下是实现上采样的常见方法:

  • 随机过采样:随机复制少数类中的数据点,并将其添加回数据集。
  • 合成采样:使用数学技术(如SMOTE)生成非完全相同的合成样本,然后将它们添加到数据集中。

如何选择:上采样还是下采样? 🤔

既然上采样和下采样都能达到平衡类别的结果,你可能会想知道该使用哪一种。大多数时候,在构建模型并观察其性能之前,你无法确定哪种方法更优。不过,有一些通用规则可以参考。

  • 下采样通常在处理极大型数据集时更有效。如果你有一个包含1亿个数据点但存在类别不平衡的数据集,你并不需要全部数据来构建一个好模型,也肯定不需要通过上采样产生的额外数据。
  • 上采样在处理小型数据集时可能更好。如果你处理的数据集只有10,000个条目,减少任何数据都极有可能对模型性能产生负面影响。

请记住,类别平衡是一个微妙的过程,可能需要一些试错。通过使用上采样数据和下采样数据分别构建模型,可以确定在特定情况下哪种技术更优。

此外,你还需要试验重新平衡后达到的分割比例。将数据平衡到50/50的分割并不总是最优的。另一方面,将99/1的分割变为70/30的分割可能就足够了。这是在模型开发过程中需要考虑的因素。

总结 📝

本节课中,我们一起学习了机器学习中的类别不平衡问题。我们了解到,当多数类占比过高(如超过90%)时,会严重影响模型性能。为了解决这个问题,我们介绍了两种核心方法:下采样(减少多数类样本)和上采样(增加少数类样本)。选择哪种方法取决于数据集的大小,通常需要通过实验来确定最佳方案以及最合适的类别平衡比例。掌握这些技术,将帮助你构建出在真实不平衡数据上表现更稳健的机器学习模型。

024:特征工程与类别平衡 🛠️⚖️

在本节课中,我们将学习如何使用Python完成PACE框架中“分析”阶段的收尾工作。我们将通过一个银行客户流失预测的案例,实践特征工程的核心步骤,为后续的模型构建打下坚实基础。

概述

在“分析”阶段,我们的目标是深入理解数据,并对其进行预处理,使其适用于模型训练。之后,我们将进入PACE工作流程的“构建”阶段。在本课程接下来的部分,我们将构建多个模型来预测银行的客户流失情况。

客户流失是一个商业术语,用于描述停止使用产品或服务、或完全终止与公司业务往来的客户数量和比率。我们将构建的是监督分类模型,因为它们预测的是一个分类目标变量。在本案例中,这是一个二元分类问题:预测每位客户是流失了还是留下来了。

数据准备与导入

在开始处理数据之前,我们需要导入必要的工具包。由于我们目前仅进行建模前的数据准备,因此只需要NumPy和pandas。

import numpy as np
import pandas as pd

现在,我们将从一个CSV文件中读取数据集到一个pandas DataFrame中,并将其命名为df_original,然后使用head函数查看其内容。

df_original = pd.read_csv('bank_data.csv')
df_original.head()

我们用于解决此问题的数据包含客户信息,其中数据中的每个条目代表一位客户。对于每位客户,有多个特征描述其与银行的关系以及财务状况。此外,还有每位客户的元数据,如姓名、性别和客户识别号。

其中两个可能不那么直观的特征是:

  • tenure:代表客户使用该银行的年数。
  • geography:标识客户居住的国家。

此外,我们有一个标记为 Exited 的特征。这表示客户是否离开了银行:1表示他们终止了与银行的业务,0表示他们仍然是客户。变量Exited将作为响应变量,即我们的模型将要尝试预测的变量。

特征工程流程

在建模时,最佳实践是在开始特征工程和特征选择之前,对数据进行严格的检查。这个过程很重要,因为它不仅能帮助你理解数据在告诉你什么、没有告诉你什么,还能为你提供创建新特征的线索。

你已经学习了探索性数据分析的基础知识,因此本教程将跳过建模过程中的这一关键部分。但请记住,一个优秀的数据科学项目总会包含EDA。

首先,让我们快速浏览一下数据,使用info函数来检查DataFrame。

df_original.info()

从输出表中,我们可以确认数据有14个特征和10,000个观测值。我们还知道有9个特征是整数类型,2个是浮点数类型,3个是字符串类型。最后,我们可以判断没有空值,因为共有10,000个观测值,且每列都有10,000个非空值。

接下来,我们将准备这个数据集,使其可用于训练模型。

特征选择

我们要做的第一件事是特征选择。回想一下,这是挑选出我们希望模型用来预测结果的特征,并丢弃对模型无用的特征的过程。

在我们的银行数据中,请注意第一列名为RowNumber。这只是对行的编号。由于行号本身不应与我们的响应变量有任何内在相关性,因此我们将从数据集中删除此特征。

CustomerIdSurname列也是如此。CustomerId似乎是出于管理目的分配给客户的编号,Surname是客户的姓氏。我们将删除这两列。

在进行特征选择时,请牢记课程早期学到的伦理考量,考虑你的数据及由此产生的模型可能带来的影响。例如,在本建模练习中,我们将不包含Gender列。这个数据特征引发了一系列复杂的技术、文化和伦理问题。我们认识到,最严谨的方法是分别包含和不包含此特征进行建模,并检查它如何影响预测。

无论采用何种方法,都应以实现公平结果为目标。针对我们这个特定用例,我们将通过调用DataFrame的drop函数来删除这些列。

churn_df = df_original.drop(['RowNumber', 'CustomerId', 'Surname', 'Gender'], axis=1)
churn_df.head()

我们将要删除的列名列表传递给该函数,并通过设置axis=1来表明我们删除的是列而不是行。我们将结果赋值给一个名为churn_df的新DataFrame。调用head方法可以显示结果DataFrame。

然而,在开始训练模型之前,我们还有更多工作要做。

特征提取

接下来,让我们实践特征提取。这是获取两个或多个特征并用它们创建一个全新特征的过程,目的是使模型更准确。

通常,特征提取会使用统计分析每个变量的预测能力,并判断提取的新特征是否比原始变量本身更具预测性。目前,我们将作为一个示例来提取一个特征,而不进行我们在尝试构建生产就绪模型时通常会执行的分析。

让我们创建一个名为Loyalty的新变量。我们将通过取客户的tenure(使用年限)除以其age(年龄)来实现。

churn_df['Loyalty'] = churn_df['tenure'] / churn_df['Age']
churn_df.head()

使用tenure除以客户age背后的逻辑是,它代表了客户人生中作为该银行客户的时间百分比。百分比更高的人可能是更忠诚的客户。现在,我们有了一个名为Loyalty的新列,可以通过检查DataFrame来验证。

特征转换

这个数据集中有一些特征需要进行转换。请记住,特征转换是改变单个特征在数据集中表示方式的过程,目的是提高模型的准确性。

许多分类模型要求你将分类特征转换为数值形式。我们的数据中有一个名为Geography的分类特征。让我们通过对该序列使用unique函数来检查此特征的数据中有多少个类别。

churn_df['Geography'].unique()

有三个唯一值:FranceSpainGermany

让我们对这部分数据进行编码,使其可以用布尔特征表示。我们将使用一个名为get_dummies的pandas函数来实现。

# 对‘Geography’列进行独热编码,并删除第一列以避免多重共线性
geography_encoded = pd.get_dummies(churn_df['Geography'], drop_first=True)
# 将编码后的列连接到原DataFrame,并删除原始的‘Geography’列
churn_df = pd.concat([churn_df.drop('Geography', axis=1), geography_encoded], axis=1)
churn_df.head()

当我们对此特征调用pd.get_dummies时,它将用三个新的布尔列替换Geography列,每一列对应原始列中包含的一个可能类别。

当我们在函数调用中指定drop_first=True时,意味着它将用两列而不是三列来替换Geography列。我们可以这样做是因为没有信息丢失,并且数据集更短、更简单。

在这种情况下,我们最终得到两个名为Geography_GermanyGeography_Spain的新列。我们不需要Geography_France列。为什么?因为如果客户在Geography_GermanyGeography_Spain列上的值都是0,我们就知道他们来自法国。

总结

本节课中,我们一起学习了PACE框架“分析”阶段的收尾工作。我们通过一个银行客户流失预测的案例,系统性地实践了特征工程的三个核心步骤:特征选择特征提取特征转换。我们移除了不相关或存在伦理问题的特征,创建了可能提升模型表现的新特征(如Loyalty),并将分类变量(如Geography)转换为适合机器学习模型的数值格式。

完成这些步骤后,我们的数据集已经为建模做好了准备。在接下来的“构建”和“执行”阶段,我们将使用这个处理好的数据集进行大部分建模工作。你现在已经为PACE框架的后续阶段奠定了坚实的基础。

025:朴素贝叶斯入门 🧠

在本节课中,我们将学习朴素贝叶斯分类器的基础知识。这是一种基于贝叶斯定理的监督学习分类技术,其核心假设是特征之间相互独立。我们将通过一个简单的天气预测示例,一步步理解其工作原理。


概述

上一节我们介绍了特征工程,将数据转换为适合训练的格式。本节中,我们将进入构建阶段,学习如何构建一个名为“朴素贝叶斯”的模型。这是一种基于贝叶斯定理的分类方法,它假设所有预测变量(特征)之间相互独立。


贝叶斯定理与后验概率

朴素贝叶斯的核心是贝叶斯定理。该定理提供了一种计算后验概率的方法,即在考虑新信息后,某个事件发生的可能性。换句话说,当你计算某事发生的概率时,你会将相关的观察结果纳入考量。

后验概率可以用以下公式表示:

P(C|X) = [P(X|C) * P(C)] / P(X)

其中:

  • P(C|X) 是给定特征 X 时,类别 C 的后验概率。
  • P(X|C) 是给定类别 C 时,特征 X 的概率(似然)。
  • P(C) 是类别 C 的先验概率。
  • P(X) 是特征 X 的先验概率。

当模型使用多个预测变量时,后验概率公式可以展开。例如,对于两个特征 X1X2,公式近似为:

P(C|X1, X2) ∝ P(X1|C) * P(X2|C) * P(C)

这看起来有些复杂,接下来我们通过一个具体例子来理解。


应用示例:天气与足球赛

为了更好地理解,让我们回到之前视频中讨论过的基于天气的例子,并应用朴素贝叶斯。

这个天气数据集将帮助你构建一个模型,以决定是否外出踢足球。数据集包含五列:前四列是预测变量(特征),最后一列是数据集的标签(目标),显示我们是否应该踢足球。

以下是数据特征:

  • Outlook:天气是雨天、阴天还是晴天。
  • Humidity:相对湿度。
  • Windy:是否有风。

我们的目标是预测“Play”这个标签(是或否)。

计算后验概率的步骤

我们将以“Outlook”变量为例,计算其中一个特征的后验概率。

第一步:构建频率表
为每个属性(例如,Outlook 的“Sunny”)针对目标(Play)构建一个频率表,统计在给定属性下踢球和不踢球的次数。

第二步:转换为似然表
将频率表转换为似然表,计算每个属性下踢球和不踢球的概率。这为我们提供了公式中的 P(X|C)

第三步:计算所需概率
使用这些信息,我们可以找到:

  • 预测变量给定类别的概率 P(X|C)
  • 类别的先验概率 P(C)
  • 预测变量的先验概率 P(X)

有了这些值,我们就可以代入贝叶斯公式计算后验概率 P(C|X)

提示:如果需要,可以暂停并回顾视频中的计算细节。

进行预测

我们需要为每一个可能被预测的类别计算后验概率。在这个例子中,只有两个结果:“Play”或“Don‘t Play”。

一旦找到这些值,预测就基于具有最高后验概率的类别做出。

例如,计算后发现,在晴天(Sunny)条件下,“Play”的后验概率高于“Don‘t Play”的后验概率。因此,如果外面是晴天,朴素贝叶斯模型会预测条件适合踢足球。


扩展到多个预测变量

稍后,你将探索如何使用多个预测变量来进行预测。无论使用多少个变量,所有核心概念都适用。

朴素贝叶斯通过计算后验概率,并基于概率最高的结果进行预测。处理多个变量时,只需在似然计算中考虑所有特征的条件概率乘积。


总结

本节课中,我们一起学习了朴素贝叶斯分类器的基础。我们了解了其背后的贝叶斯定理公式,并通过一个天气预测的实例,逐步演示了如何从数据中计算频率表、似然,最终得到后验概率并做出分类决策。记住,其“朴素”之处在于假设特征相互独立,这简化了计算,并在许多实际应用中表现良好。

026:用Python构建朴素贝叶斯模型 🧮

概述

在本节课中,我们将学习如何使用Python的Scikit-learn库来构建一个高斯朴素贝叶斯分类器模型。我们将使用银行客户流失数据集,涵盖从数据准备、模型训练到评估的完整流程。


数据准备回顾

上一节我们讨论了朴素贝叶斯的工作原理,本节我们将使用Python来实现它。

我们将继续使用在特征工程笔记本中准备好的银行客户流失数据框。

我们删除了行号、客户ID、姓氏和性别列。

我们对地理列进行了虚拟编码,将其从分类变量转换为布尔变量,并创建了一个名为“忠诚度”的新特征,其值为客户任期除以年龄。

需要记住的是,该数据的预测变量类型不同。例如,余额和估计薪资是连续变量,而地理是分类变量。

同时,Scikit-learn有几种不同的朴素贝叶斯算法实现,每种都假设你的所有预测变量是单一类型。

作为一名数据专业人员,你在工作中首先会学到的一点是,现实世界的数据从来都不是完美的。有时数据会违反模型的假设,在实践中,你必须在现有条件下尽力而为。

对于本课程,我们将使用高斯朴素贝叶斯分类器。该实现假设你的所有变量都是连续的,并且服从高斯分布或正态分布。

我们的数据并不完全符合这些假设,但即使数据不完美,高斯模型仍可能为我们提供可用的结果。让我们开始吧。


导入必要库

首先需要导入所需的包和库。

我们将首先导入NumPy、pandas和Matplotlib。我们还将导入train_test_split来帮助我们将数据拆分为训练集和测试集。

我们将使用的模型称为GaussianNB,我们从Scikit-learn的naive_bayes模块中导入它。

接下来,我们将导入用于计算模型准确率、精确率、召回率和F1分数的函数。

最后,我们将导入confusion_matrixConfusionMatrixDisplay,它们将帮助我们计算和绘制模型结果的混淆矩阵。

以下是导入代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

加载与检查数据

让我们读入数据框并将其命名为churn_df

在开始建模之前,我们先做几件事。首先,我们将检查exited列(我们的目标变量)的类别平衡。我们可以通过对pandas序列调用value_counts方法来实现。

类别比例大约为80:20。换句话说,该数据中大约20%的人流失了。

这是一个不平衡的数据集,但并不极端,因此我们将继续处理,不对目标变量进行任何类别重新平衡。

其次,当预测变量彼此条件独立时,朴素贝叶斯模型效果最佳。

当我们准备数据时,我们通过将任期除以年龄创建了一个名为“忠诚度”的特征。由于这个新特征只是两个现有变量的商,它不再条件独立,因此我们将删除任期和年龄。

此步骤可能有益,也可能无益,但我们将执行它以帮助符合模型的假设。


拆分数据

我们已经准备好了数据,可以开始建模了。现在我们需要拆分数据,首先拆分为特征和目标变量,然后拆分为训练数据和测试数据。

让我们将预测特征分配给一个名为X的变量,将exited列(我们的目标)分配给一个名为y的变量。

然后我们可以拆分为训练数据和测试数据。我们使用train_test_split函数来完成此操作。我们将25%的数据放入测试集,并使用剩余的75%来训练模型。

请注意,我们包含了参数stratify=y。如果我们的主数据类别比例为80:20,分层可以确保在训练数据和测试数据中都保持这个比例。

stratify=y告诉函数应使用在y变量(即我们的目标)中找到的类别比例。

你拥有的总数据越少,类别不平衡越严重,在拆分数据时进行分层就越重要。如果我们不分层,那么函数将随机拆分数据,我们可能会得到一个不幸的拆分,导致测试数据中没有任何少数类。

那样的话,我们将无法有效地评估我们的模型。最糟糕的是,如果不进行一些调查工作,我们甚至可能意识不到问题出在哪里。

最后,我们设置一个随机种子,以便我们和其他人可以复现我们的工作。

以下是拆分代码:

X = churn_df.drop(columns=['exited'])
y = churn_df['exited']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, stratify=y, random_state=42)

构建初始模型

现在是时候构建模型了。

与线性和逻辑回归一样,我们的建模过程将从将模型拟合到训练数据开始,然后使用该模型对测试数据进行预测。

首先,我们将实例化高斯朴素贝叶斯模型,将其分配给一个名为gnb的变量。

然后,我们将其拟合到X_trainy_train数据。

最后,我们将使用predict方法让模型对X_test数据进行预测,并将结果分配给一个名为y_preds的变量。

以下是建模代码:

gnb = GaussianNB()
gnb.fit(X_train, y_train)
y_preds = gnb.predict(X_test)

评估初始模型

现在我们可以使用我们导入的评估指标来检查模型的性能。对于每个指标,我们首先传递实际的y_test数据,然后传递预测值。

这个结果并不理想。我们的精确率、召回率和F1分数都是零。这是怎么回事?

让我们考虑一下精确率公式。模型精确率为零有两种可能:第一种是分子为零,这意味着我们的模型没有预测出任何真正例;第二种是分母也为零,这意味着我们的模型根本没有预测出任何正例。

除以零会导致未定义的值,但Scikit-learn在这种情况下会返回值0。

根据你的建模环境,你可能会收到一个警告,告诉你分母为零。

我们没有收到警告,所以让我们检查一下这里发生的是哪种情况。为此,我们将在预测值上调用NumPy的unique函数。

模型对测试数据中的每个样本都预测为零(即未流失)。分子和分母都为零。

考虑一下为什么会这样。也许我们在建模过程中做错了什么,或者对不同类型的预测变量和分布使用高斯朴素贝叶斯根本无法建立一个好模型。也许数据有问题。


数据探索与特征缩放

在我们放弃之前,也许数据可以让我们深入了解可能发生的情况,或者我们可以采取哪些进一步的步骤。让我们使用describe来检查X数据。

一个突出的问题是,我们创建的“忠诚度”变量与某些其他变量(如余额或估计薪资)的尺度差异巨大。“忠诚度”的最大值是0.56,而余额的最大值超过250,000,几乎大了六个数量级。

建模时可以尝试的一件事是缩放你的预测变量。有些模型要求你缩放数据才能按预期运行,而另一些则不需要。朴素贝叶斯不需要数据缩放。

然而,有时包和库需要在计算中进行假设和近似。我们已经通过在这个数据集上使用高斯朴素贝叶斯分类器打破了一些假设,而我们的一些预测变量尺度差异很大可能也无济于事。

一般来说,缩放可能不会改善模型,但可能也不会使其更糟。让我们试试看。

我们将使用一个名为MinMaxScaler的函数,我们从Scikit-learn的preprocessing模块导入它。

MinMaxScaler对每一列进行归一化,使每个值都落在0到1的范围内。列的最大值将缩放到1,其最小值将缩放到0,其他所有值将落在两者之间。

这是其公式:

X_scaled = (X - X_min) / (X_max - X_min)

要使用缩放器,你必须将其拟合到训练数据,并使用同一个缩放器转换训练数据和测试数据。

让我们应用这个并重新训练模型。

首先,导入缩放器。

然后我们实例化它并将其分配给一个名为scaler的变量。

现在,我们通过将X_train数据传递给它来拟合缩放器。

接下来,我们使用transform方法缩放X_train数据。

最后,我们转换X_test数据。

以下是缩放代码:

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)

使用缩放数据重建模型

现在我们将重复拟合模型的步骤,只是这次我们将拟合到我们新的缩放数据。

当我们计算这个模型的性能指标时,我们没有得到错误。模型并不完美,但至少它现在可以预测流失的客户了。

让我们更仔细地检查我们的模型如何分类测试数据。我们将使用混淆矩阵来完成此操作。

请记住,混淆矩阵是一个图形,显示模型的真正例、假正例、真反例和假反例。

我们可以使用我们导入的ConfusionMatrixDisplayconfusion_matrix函数来绘制它。

以下是一个辅助函数,允许我们为模型绘制混淆矩阵:

def plot_confusion_matrix(y_true, y_pred):
    cm = confusion_matrix(y_true, y_pred)
    disp = ConfusionMatrixDisplay(confusion_matrix=cm)
    disp.plot()
    plt.show()

我们所有的模型指标都可以从混淆矩阵中推导出来,每个指标都讲述了故事的一部分。

混淆矩阵中最突出的是,模型遗漏了很多将会流失的客户。换句话说,有很多假反例,确切地说是355个。这就是为什么我们的召回分数只有0.303。


总结

在本节课中,我们一起学习了使用Python和Scikit-learn构建高斯朴素贝叶斯分类器的完整流程。我们从回顾数据准备开始,导入了必要的库,加载并检查了数据的类别平衡。接着,我们拆分了数据,特别注意了使用分层抽样来处理类别不平衡问题。

然后,我们构建了初始模型并进行了评估,发现模型性能不佳,所有关键指标均为零。通过分析,我们发现预测变量尺度差异巨大可能是原因之一。因此,我们引入了MinMaxScaler对特征进行归一化处理,并使用缩放后的数据重新训练了模型。

最后,我们使用混淆矩阵等工具对改进后的模型进行了更深入的评估,发现模型虽然有所改善,但在识别流失客户(召回率)方面仍有很大提升空间。这为我们后续探索其他模型评估指标和优化方向奠定了基础。

接下来,你将研究各种模型评估指标及其使用时机。你将探索使用多个指标来评估模型性能,然后确定哪个模型最能满足数据项目的业务需求。我们下次课再见。

027:分类模型的关键评估指标 📊

在本节课中,我们将学习如何评估分类模型,特别是当面对类别不平衡的数据集时。我们将回顾准确率、精确率、召回率和F1分数等核心指标,并理解它们在模型迭代与优化过程中的作用。

你已经到达了机器学习工作流程的最后阶段——模型分析。这是模型最终投入生产前的关键步骤。你已经学习了许多关于模型评估指标的知识,了解了可用的选项,以及这些指标如何向数据专业人员展示已构建模型的性能。同时,你也构建了包括逻辑回归在内的监督学习分类模型。

回顾核心评估指标 🔍

上一节我们介绍了模型构建的流程,本节中我们来看看用于评估分类模型的具体指标。用于评估之前模型的指标同样适用于评估朴素贝叶斯等模型。

以下是分类模型中最常用的几个评估指标:

  • 准确率:反映了正确预测的数量除以预测总数。其公式为:
    准确率 = (正确预测数) / (总预测数)
  • 精确率:衡量在所有被模型预测为正类的样本中,真正为正类的比例。其公式为:
    精确率 = 真阳性 / (真阳性 + 假阳性)
  • 召回率:衡量在所有实际为正类的样本中,被模型正确识别出来的比例。其公式为:
    召回率 = 真阳性 / (真阳性 + 假阴性)
  • F1分数:是精确率和召回率的调和平均数,用于综合评估模型性能。其公式为:
    F1分数 = 2 * (精确率 * 召回率) / (精确率 + 召回率)

处理类别不平衡问题 ⚖️

然而,准确率并不总能反映全貌。有些数据集存在严重的类别不平衡问题,即绝大多数样本只属于一个类别,此时数据集被视为不平衡的。

这里有一个二元分类问题的例子:一位IT专业人员希望用一个模型来检测公司电脑中的恶意软件。假设数据集中有5000个实例,但只有500个是电脑中确实存在恶意软件的阳性实例。那么这个人的数据集就是不平衡的,因为在所有检查中发现恶意软件的概率相对较低。

在这种情况下,精确率和召回率指标就能提供帮助。精确率关注的是“预测出的威胁有多少是真实的”,而召回率关注的是“真实的威胁有多少被找出来了”。

指标应用与模型迭代 🚀

准确率、精确率、召回率和F1分数是分类技术中的顶级评估指标。更具体地说,精确率、召回率和F1分数对于衡量不平衡类别的模型性能尤其有用。

无论如何,数据专业人员会使用全部四个指标来评估分类监督学习模型。正如你开始发现的那样,每个模型的表现都不同,有些算法比其他算法效果更好。在构建任何旨在投入生产的模型时,改进结果是至关重要的。你可能会调整特定参数以探索性能如何提升。

因此,你应该始终记住,模型构建本质上是一个迭代的过程。你构建的第一个模型几乎永远不会是最终部署的那个。这个迭代过程提供了在调整参数或改变每个模型中特征工程方式后,使模型达到最佳工作状态所需的信息。性能指标为模型之间的相互比较以及模型自身的纵向比较提供了基础。

总结与展望 📈

本节课中,我们一起学习了分类模型的关键评估指标:准确率、精确率、召回率和F1分数。我们理解了它们在评估模型性能,特别是在处理不平衡数据集时的重要作用,并认识到模型优化是一个持续的迭代过程。

接下来,我们将利用这些指标来揭示我们模型的更多信息,评估我们构建的其他模型,并研究如何提升模型性能。持续改进是数据专业人员工作的关键部分,因此这些练习正在为你不断推进各种数据流程做好准备。

028:PAC工作流程总结 🎯

在本节课中,我们将总结用于构建机器学习模型的PAC工作流程。我们将回顾计划、分析和执行三个阶段的关键步骤,并理解这一框架如何帮助解决复杂的业务问题。


开发一个机器学习模型是一个复杂的过程。然而,无论业务需求如何,拥有一个坚实的框架作为依靠,都能帮助你奠定成功的基础。

在本课程的这个部分,PAC工作流程为你提供了一个支持框架,帮助你应对一个示例业务场景的不同阶段。

计划阶段 📋

上一节我们介绍了PAC工作流程的整体概念,本节中我们来看看第一个阶段:计划。

在计划阶段,你评估了业务需求,以确定哪种类型的模型最适合预测银行客户流失。这个决策是基于可用数据做出的。

分析阶段 🔍

在完成了计划之后,我们进入下一个关键阶段:分析。

接下来,在分析阶段,你使用探索性数据分析实践和特征工程技术检查了数据。这个过程揭示了关于数据的更多细节,有助于为你构建模型的计划提供信息。

以下是分析阶段的核心实践:

  • 探索性数据分析:初步检查数据,了解其分布、关系和潜在问题。
  • 特征工程:创建、选择或转换数据特征,以更好地表示问题。

构建与测试阶段 ⚙️

基于分析阶段的发现,我们便可以开始动手构建模型了。

从那里开始,你继续构建了朴素贝叶斯模型的第一个迭代版本。然后,你使用初步的评估指标测试了模型,以确定其在测试数据上的性能。

朴素贝叶斯分类器的核心公式基于贝叶斯定理:
P(A|B) = [P(B|A) * P(A)] / P(B)
在分类问题中,我们计算每个类别的后验概率 P(类别|特征),并选择概率最高的类别。

执行阶段 🚀

模型构建并初步测试后,最后一步是深入评估与优化。

最后,在执行阶段,你仔细评估了模型的性能,并考虑了如何改进它。这可能涉及调整超参数、尝试不同的算法或收集更多数据。


这就是机器学习模型的PAC工作流程。在你的技能库中拥有这个过程,将使你能够解决许多业务问题。

虽然在你继续学习的过程中,模型很可能会变得更加复杂,但坚持在这个框架内工作将帮助你获得所需的结果。

本节课中我们一起学习了PAC工作流程,它包含了计划分析构建与测试以及执行四个核心阶段。掌握这个结构化方法,是成功应用机器学习解决实际业务问题的重要基础。

029:《机器学习的基础知识》第3模块 🎯

概述

在本节课中,我们将要学习机器学习中的一个重要分支——无监督学习。我们将探讨其核心概念、应用场景,并重点介绍一种常用的无监督学习算法:K均值聚类


课程内容

你已经深入数据世界,并为数据建模打下了坚实基础。

到目前为止,你已经学习了线性回归、逻辑回归和朴素贝叶斯模型。

这些都是监督学习技术,用于对已标记的数据进行预测。

当前大多数机器学习应用都基于监督学习。

但当我们考虑世界上所有可用数据时,绝大多数数据是未标记的。

照片、录音、视频、社交媒体帖子,这些都是未标记数据的例子。

你可能在数据分析的背景下熟悉这个概念。

如果你获得了谷歌数据分析职业证书,你曾学到:任何未以易于识别的方式组织的数据都被称为非结构化数据。

在本课程中,我们有时会将其称为未标记数据,但含义相同。

那么,我们如何理解所有这些未标记数据呢?

当我们的数据未标记时,我们使用无监督学习技术。

这些方法使数据专业人员能够了解数据的底层结构,并找出不同特征之间的相互关系。

在课程早期,你探索了一种非常常见的无监督学习类型:推荐系统。

你了解到它们是机器学习算法的一个子类,用于向用户提供相关建议,例如为你的播放列表推荐新歌,或为冬季推荐新外套。

现在,你将了解无监督学习的许多其他令人兴奋的方法和应用。

在课程的这一部分,你将首先学习K均值聚类,这是一种无监督建模技术。

你将研究它如何根据每个观测值与数据中其他观测值的相似性来对数据进行聚类。

你还将构建一个K均值模型,并学习如何使用称为惯性轮廓系数的指标来评估它。

我很高兴能与你一起探索无监督学习。

未来发展的潜力巨大。

我们才刚刚开始挖掘世界上大量的非结构化数据。

让我们开始建模吧。


核心概念与算法

上一节我们介绍了无监督学习的背景和重要性,本节中我们来看看其核心算法之一:K均值聚类。

K均值聚类是一种迭代算法,旨在将数据集划分为K个不同的、非重叠的子组(簇),其中每个数据点只属于一个组。

以下是该算法的基本步骤:

  1. 初始化:随机选择K个数据点作为初始簇中心(质心)。
  2. 分配:将每个数据点分配到距离其最近的质心所在的簇。
  3. 更新:重新计算每个簇的质心(即该簇所有点的平均值)。
  4. 迭代:重复步骤2和3,直到质心的位置不再发生显著变化,或达到预设的迭代次数。

该过程可以用以下伪代码表示:

# K-Means 算法伪代码示例
初始化 K 个簇中心
while 簇中心变化大于阈值或未达到最大迭代次数:
    for 每个数据点:
        将其分配到最近的簇中心
    for 每个簇:
        将簇中心更新为该簇所有点的均值

模型评估指标

构建模型后,我们需要评估其效果。以下是两个常用的评估指标:

惯性:衡量每个样本到其所属簇的质心的距离平方和。惯性越小,说明簇内样本越紧密。公式为:
Inertia = Σ(样本i到其质心的距离²)

轮廓系数:结合了簇内凝聚度和簇间分离度,其值在-1到1之间。值越接近1,表示聚类效果越好。公式为:
Silhouette Score = (b - a) / max(a, b)
其中,a是样本到同簇其他样本的平均距离(簇内不相似度),b是样本到其他簇中所有样本的平均距离的最小值(簇间不相似度)。


总结

本节课中,我们一起学习了机器学习中无监督学习的基本概念。我们了解到,与使用已标记数据的监督学习不同,无监督学习用于探索未标记数据的底层结构和模式。我们重点介绍了K均值聚类算法,了解了其工作原理、步骤以及如何使用惯性轮廓系数来评估聚类结果。掌握这些知识是理解更复杂无监督学习技术的重要基础。

030:K均值聚类入门 🎯

在本节课中,我们将要学习K均值算法的基础知识。这是一种无监督学习算法,用于将未标记的数据组织成不同的组或簇。


什么是K均值算法? 🤔

K均值是一种无监督分区算法。它用于将未标记的数据组织成组或簇。

它通过创建一个逻辑方案来理解数据。在K均值中,每个簇由一个中心点或质心定义。其位置代表簇的中心,也称为数学平均值,因此得名“K均值”。


构建K均值模型的四个步骤 🔄

构建一个K均值模型包含四个步骤。让我们逐一进行检视。

步骤1:选择并放置质心

在步骤1中,你选择质心的数量并将它们放置在数据空间中。

K代表模型中质心的数量,也就是你将拥有的簇的数量。这是一个由你做出的决定。

有时,你可能对项目所需的簇数量有所了解。例如,如果你的公司生产五种不同的产品,你可能希望将K值设置为5。

其他时候,你可能不知道数据应该被分成多少个簇。因此,可以尝试不同的K值,并确定哪个能提供最佳结果。

以下是一个示例:

  • 有时你已知簇的数量(例如,对应5种产品)。
  • 有时你需要尝试不同的K值来寻找最佳结果。

在这里,很明显我们的数据被分成了两个簇,一个在上方,另一个在下方。在步骤1中,我们将随机初始化两个质心,用蓝色和红色的“X”表示。


步骤2:将每个数据点分配到最近的质心

步骤2是将每个数据点分配到其最近的质心。最近的质心是指在空间上距离最近的那个。

在这个例子中,顶部的两个观测点被分配到蓝色质心,底部的两个观测点被分配到红色质心。

作为快速回顾,在此上下文中,一个观测点就是任何被观察的数据点。


步骤3:重新计算每个簇的质心

再次强调,质心的位置是通过计算其簇内所有点的平均值来确定的。

请注意,质心移动到了其簇的中点。在算法达到收敛之前,每次迭代都会发生这种情况。

收敛是在一系列解决方案结束时找到的稳定点。


步骤4:重复步骤2和3,直到算法收敛

在这种情况下,我们的数据非常少,因此模型很简单,并且已经收敛。如果你有更多的数据,质心会越来越接近其相关的簇。

你可能还会发现,随着质心位置在每次迭代中移动,每个数据点的簇分配也会发生变化。


需要注意的关键点 ⚠️

上一节我们介绍了K均值的基本步骤,本节中我们来看看一些关键的注意事项。

需要留意的一点是,用不同的质心起始位置运行模型非常重要。这有助于避免由局部最小值导致的糟糕聚类。换句话说,就是避免簇之间没有适当的距离。

让我们用我们的例子来探讨这个概念。

如果这是我们的质心初始位置,注意会发生什么。

在步骤2中,我们将点分配到它们最近的质心。对于这些特定的起始位置,左边的两个观测点被分配到红色簇,右边的两个观测点被分配到蓝色簇。

对于步骤3,我们重新计算每个簇质心的位置。模型已经收敛,但簇的划分结果并非我们所期望的。

我们知道,最直观的聚类应该是顶部的两个观测点在一个簇中,底部的两个在另一个簇中。但事实并非如此。并且进一步的迭代也不会改变这一点。

这就是为什么用不同的质心初始化运行模型很重要,以避免模型在局部最小值收敛而导致的糟糕聚类。

请注意,这种聚类并非错误。它仍然是模型的一个有效解决方案。只是在这个上下文中,它没有太大意义。毕竟,目标是找到一个能理解你数据的聚类方案。


算法特性与总结 📝

最后,请注意,尽管K均值是一种分区算法,但数据专业人员通常将其称为聚类算法。

区别在于,在聚类算法中,离群点可以存在于簇之外。然而,对于分区算法,所有点都必须被分配到一个簇中。换句话说,K均值不允许未分配的离群点

以下是核心特性的总结:

  • 分区算法:所有数据点都必须属于某个簇。
  • 无离群点:K均值不允许存在未分配的数据点。

课程总结

本节课中我们一起学习了K均值聚类的基础知识。

K均值是一种无监督学习技术,它根据相似性将未标记的数据分组到K个簇中。聚类过程包含四个步骤,这些步骤会重复直到模型收敛。

K的值是由建模者决定的一个参数。最后,构建多个模型以避免糟糕的聚类非常重要。

在本节后面的内容中,你将学习如何确定K的最佳值。你还将发现K均值模型的一些局限性。更多内容即将到来。

031:使用K均值聚类进行颜色压缩 🎨

在本节课中,我们将学习如何将K均值聚类算法应用于一个实际案例:压缩照片中的颜色。我们将通过一个具体的图像处理示例,来加深对K均值算法工作原理的理解。


准备工作:理解图像数据

上一节我们介绍了K均值算法的基本直觉,本节中我们来看看如何将其应用于真实数据。

我们将使用一张郁金香的照片作为数据。使用Matplotlib库的imread函数将图像读取为一个数组,并用imshow函数显示它。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# 读取图像
image = mpimg.imread('tulips.jpg')
plt.imshow(image)
plt.show()

检查图像的形状(以像素为单位),我们得到(320, 240, 3)。这些数字可以解释为像素信息:

  • 320240 分别代表图像的垂直和水平像素数量。
  • 维度 3 指的是编码每个像素颜色的值。

每个像素都有三个参数:红色(R)、绿色(G)和蓝色(B)。这些值统称为RGB值。每个颜色(R、G、B)的取值范围是0到255。这意味着有 256^3(超过1600万)种不同的RGB组合,每种组合对应一种独特的颜色。

为了便于建模,我们将数据重塑为一个数组,其中每一行代表一个像素的RGB颜色值。

# 将图像数据重塑为像素列表
pixels = image.reshape(-1, 3)
print(pixels.shape)  # 输出: (76800, 3)

现在我们得到一个 76800 x 3 的数组,每一行是一个像素的颜色值。


可视化颜色空间

为了更好地理解和可视化这些数据,我们可以创建一个Pandas DataFrame。DataFrame的每一行代表一个像素,三列分别是其R、G和B值。

由于只有三个维度,我们可以在三维空间中可视化这些数据。下图在3D坐标系中绘制了照片的每个像素。

import pandas as pd
from mpl_toolkits.mplot3d import Axes3D

df = pd.DataFrame(pixels, columns=['R', 'G', 'B'])
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(df['R'], df['G'], df['B'], c=pixels/255.0, s=1)
ax.set_xlabel('Red')
ax.set_ylabel('Green')
ax.set_zlabel('Blue')
plt.show()

每个轴的范围是0到255,与RGB值范围一致。图中的每个点都是由其RGB值指定的颜色,就像原始照片中一样。颜色越强烈,该区域中的点就越集中。图中最具代表性的颜色是照片中最丰富的颜色——主要是红色、绿色和黄色。

我们可以从不同角度检查这个图形,甚至可以缩放。


应用K均值聚类:从K=1开始

我们可以在这些数据上训练一个K均值模型。该算法通过最小化每个点到其最近质心的平方距离来创建K个簇。

以下是一个实验:如果我们用仅一个质心(即K=1)构建一个K均值模型,你预期会发生什么?让我们来验证一下。

首先,实例化模型。作为复习,实例化涉及创建类的一个副本,该类继承了所有类变量和方法。

from sklearn.cluster import KMeans

# 创建K=1的K均值模型
kmeans1 = KMeans(n_clusters=1, random_state=42)
kmeans1.fit(pixels)

现在,我们将复制原始图像,用其最近聚类中心的RGB值替换每一行(即每个像素),然后重塑图像以便显示。

# 获取质心颜色并替换所有像素
centroid_color = kmeans1.cluster_centers_[0]
compressed_image_1 = centroid_color.reshape(1, -1).repeat(pixels.shape[0], axis=0)
compressed_image_1 = compressed_image_1.reshape(image.shape)

# 显示结果
plt.imshow(compressed_image_1)
plt.title('K=1')
plt.show()

我们得到的图像完全不像郁金香。发生了什么?

让我们回顾一下K均值的步骤:

  1. 算法在255x255x255的颜色空间中随机放置一个质心。
  2. 它将每个点分配给最近的质心。因为只有一个质心,所有点都被分配给它,因此属于同一个簇。
  3. 算法将质心的位置更新为其所有点的平均位置。同样,只有一个质心,所以它更新为图像中每个点的平均位置。
  4. 通常,这些步骤会重复直到模型收敛。但在这里,只需要一次迭代。

我们将每个像素的RGB值更新为与质心相同。结果就是一张每个像素都被替换为平均颜色的郁金香图像。

我们可以通过手动计算数组中每列的平均值来验证这一点。

manual_average = pixels.mean(axis=0)
print("手动计算的平均RGB值:", manual_average)
print("K均值模型计算的质心:", kmeans1.cluster_centers_[0])

两者是相同的。现在,让我们回到颜色空间的3D渲染图,但这次添加上质心。质心是颜色空间中间的一个大圆点,可以看作是图中所有点的“重心”。


应用K均值聚类:K=3的情况

现在,让我们用K=3重新拟合另一个K均值模型。花点时间思考一下你预期会得到什么结果。像上面一样,在脑海中过一遍模型正在执行的步骤。你可能会看到什么颜色?

我们重新拟合模型,将簇的数量设置为3,得到三个质心位置,这些就是我们可以用来显示每个质心颜色的RGB值。

# 创建K=3的K均值模型
kmeans3 = KMeans(n_clusters=3, random_state=42)
kmeans3.fit(pixels)

# 获取质心颜色
centroids_k3 = kmeans3.cluster_centers_
print("三个质心的RGB值:\n", centroids_k3)

# 使用辅助函数显示颜色样本
def plot_colors(centroids):
    plt.figure(figsize=(3, 1))
    for i, color in enumerate(centroids):
        plt.subplot(1, len(centroids), i+1)
        plt.axis('off')
        plt.imshow([[color/255.0]])
    plt.show()

plot_colors(centroids_k3)

你可能会假设三簇模型会产生相似的颜色。这是正确的。照片中的主要颜色——红色、绿色和黄色——都出现在这里。

同样,我们可以用新K均值模型分配的质心的RGB值替换原始图像中的每个像素。

def compress_image(pixels, kmeans_model, original_shape):
    labels = kmeans_model.predict(pixels)
    compressed_pixels = kmeans_model.cluster_centers_[labels]
    return compressed_pixels.reshape(original_shape)

compressed_image_3 = compress_image(pixels, kmeans3, image.shape)
plt.imshow(compressed_image_3)
plt.title('K=3')
plt.show()

我们现在得到一张只有三种颜色的照片,就是上面样本中的那三种颜色。每种颜色的RGB值对应于其最近质心位置的RGB值。

我们可以再次返回到我们的3D坐标空间。这次,我们将根据其质心的颜色重新为每个点上色,这能让我们看到K均值算法如何在空间上对数据进行聚类。

# 在3D图中用质心颜色重新着色点
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
colors_k3 = kmeans3.cluster_centers_[kmeans3.labels_] / 255.0
ax.scatter(df['R'], df['G'], df['B'], c=colors_k3, s=1)
ax.set_xlabel('Red')
ax.set_ylabel('Green')
ax.set_zlabel('Blue')
plt.title('3D Color Space with K=3 Clusters')
plt.show()

每个像素现在都根据其质心的RGB值着色,并且簇位于空间的顶点处。


探索不同的K值

整个过程可以应用于任何K值。以下是K从2到10时,每张照片的输出结果。

plt.figure(figsize=(15, 10))
for i, k in enumerate(range(2, 11)):
    kmeans = KMeans(n_clusters=k, random_state=42).fit(pixels)
    compressed_img = compress_image(pixels, kmeans, image.shape)
    plt.subplot(3, 3, i+1)
    plt.imshow(compressed_img)
    plt.title(f'K={k}')
    plt.axis('off')
plt.tight_layout()
plt.show()

注意,每次增加一种颜色后,越来越难看出图像之间的差异。这是所有聚类模型都会发生的情况的一个视觉示例,即使数据不是你可以看到的图像。当你将数据分成越来越多的簇时,超过某个点后,额外的簇对你理解数据的贡献越来越小。


总结与展望

本节课中,我们一起学习了如何将K均值聚类算法应用于图像颜色压缩。我们通过从K=1到K=10的示例,直观地理解了算法如何将像素分组,以及随着簇数量的增加,图像细节如何变化。这个演示加深了我们对K均值算法工作原理的理解。

很快,我们将探索用数值方法确定特定数据的最佳K值。一如既往,欢迎你自行探索代码笔记本,继续构建你的技能。

032:K均值聚类的关键评估指标 🎯

在本节课中,我们将要学习如何评估K均值聚类模型的有效性。我们将探讨在没有标签数据的情况下,如何判断模型是否成功地将数据点分成了有意义的组,并介绍两个核心的评估指标。


上一节我们介绍了K均值方法的基本原理。在一些二维或三维空间的例子中,我们可以直观地看到数据点是否被正确地分配到了簇中。

然而,在实际工作中,数据通常具有远超三个维度的特征,这使得我们无法通过可视化来直接判断聚类效果。我们甚至可能不知道数据中应该存在多少个簇。

那么,如何决定K的值?一旦确定了K,又该如何知道模型是否按预期工作呢?

在线性回归和逻辑回归中,我们可以使用R平方、均方误差、ROC曲线下面积、精确率和召回率等指标来评估模型。但在无监督学习中,我们没有带标签的数据作为比较基准,这些指标并不适用。

事实上,聚类模型并不进行预测,而是根据数据点之间的相似性对其进行分组。因此,需要由你来调查和理解不同的簇。

如果你拥有相关的领域知识,或者你试图解决的问题本身存在约束条件,请充分利用这些信息。例如,如果你正在为一项提供四种不同订阅等级的服务进行客户细分,那么你很可能应该将K的值设为4。

但是,如果你无法预先知道K的值,也无需担心,还有其他方法可以解决这个问题。

在开始介绍评估指标之前,我们先来思考一下,一个好的聚类模型应该是什么样的。本质上,我们希望得到清晰可辨的簇。

这意味着,在每个簇内部,数据点之间应该彼此接近。同时,在不同的簇之间,应该有足够的空白空间。

以下是评估K均值模型簇内紧密程度的一种方法:

惯性是K均值模型的一个核心评估指标。请注意,这里的“惯性”与物理学中的定义不同。在K均值中,惯性被定义为每个观测点到其最近质心的平方距离之和

公式:
Inertia = Σ (distance(point_i, centroid_i))²

本质上,这是一个衡量同一簇内观测点之间紧密相关程度的指标。该信息会在所有簇上进行汇总,为这个特定的度量标准产生一个单一的分数。

另一个评估K均值模型的重要指标是轮廓系数。这是一个比惯性更精确的评估指标,因为它同时考虑了簇与簇之间的分离程度。

轮廓系数定义为模型中所有观测点的轮廓系数的平均值。我们稍后会对此进行更深入的探讨。现在只需知道,轮廓系数有助于评估你的模型,为K的最优值提供见解,并且在计算中同时使用了簇内和簇间的度量。


😊 做得很好。现在你对什么是一个好的聚类模型有了更好的理解,也对一些用于确定模型有效性的指标有了更多的认识。

在接下来的课程中,我们将进一步探索这些指标,并学习数据专业人士如何在工作中运用它们。

本节课中,我们一起学习了:

  1. 评估无监督学习模型的挑战:由于没有标签数据,传统监督学习的评估指标不适用。
  2. 好聚类的标准:簇内紧密,簇间分离。
  3. 两个核心评估指标
    • 惯性:衡量簇内紧密度的指标,计算所有点到其所属簇质心的距离平方和。值越小,表示簇内越紧密。
    • 轮廓系数:一个更全面的指标,同时考虑簇内凝聚度和簇间分离度。其值介于-1到1之间,越接近1表示聚类效果越好。

033:评估聚类模型的核心指标 📊

在本节课中,我们将学习如何评估K均值聚类模型。我们将重点介绍两个核心评估指标:惯性轮廓系数。理解这些指标对于判断模型质量、选择合适的聚类数量至关重要。


评估聚类模型的目标

上一节我们介绍了K均值聚类的基本原理。本节中,我们来看看如何量化评估一个聚类模型的好坏。

一个理想的聚类模型应具备两个特征:

  1. 簇内紧凑:同一个簇内的数据点彼此非常接近。
  2. 簇间分离:不同簇之间被清晰地分开。

接下来,我们将学习两个用于衡量这些特征的指标。


指标一:惯性

惯性衡量的是簇内距离,即同一个簇内数据点的紧密程度。

惯性被定义为数据集中每个观测值与其所属簇的质心之间距离的平方和。它是一个衡量簇内紧凑度的指标。惯性越低,说明簇内数据点越相似、越紧凑。

惯性可以用以下公式表示:

inertia = Σ (d(x_i, c_k))^2

其中:

  • n 是数据中观测值的总数。
  • x_i 是第 i 个观测值。
  • c_k 是观测值 x_i 所属簇的质心。
  • d(x_i, c_k) 是观测值 x_i 到其质心 c_k 的距离。

簇越紧凑,惯性值越低,因为每个观测值与其最近质心之间的距离更小。因此,我们的目标是让惯性尽可能接近0。

惯性有可能为0吗?
有可能,但以下两种情况下的惯性为0并不能为我们提供有价值的信息:

  1. 所有观测值完全相同(所有数据点在同一位置),那么对于任何K值,惯性都为0。
  2. 聚类数量等于观测值数量。如果每个观测值自成一簇,那么其质心就是它自身,距离为0,惯性也为0。

惯性是一个重要的指标,因为它能帮助我们决定最优的K值。我们通过肘部法则来实现这一点。

在肘部法则中,我们首先用不同的K值构建多个模型。然后绘制每个K值对应的惯性曲线。

以下是一个示例图表示意。注意,K值越大,惯性通常越低。那么是否应该总是选择高K值呢?答案是否定的。低惯性固然好,但如果它导致了无意义或无法解释的聚类,那么它对你就毫无帮助。

选择最优K值的一个好方法是找到曲线的“肘部”。这是指惯性下降开始趋于平缓时所对应的K值。在上面的示例中,当我们使用3个簇时出现了肘部。有时可能难以在两个连续的K值之间做出选择,这时就需要你根据具体项目情况来决定哪一个更合适。


指标二:轮廓系数

第二个评估K均值模型的重要指标是轮廓分数。这是一个比惯性更精确的评估指标,因为它同时考虑了簇间的分离度

轮廓分数定义为模型中所有观测值的轮廓系数的平均值。

每个观测值都有自己的轮廓系数,其计算公式为:

silhouette_coefficient = (b - a) / max(a, b)

其中:

  • a 是该观测值到同一簇内所有其他观测值的平均距离。
  • b 是该观测值到下一个最近簇中每个观测值的平均距离。

轮廓系数的取值范围在 -1 到 1 之间。

考虑以下示意图:

  • 如果一个观测值的轮廓系数接近 1,意味着它既很好地位于自己簇的内部,又与其他簇清晰分离。
  • 值为 0 表示该观测值位于簇的边界上。
  • 如果轮廓系数接近 -1,则可能意味着该观测值被分配到了错误的簇中。

因此,正如你所体验到的,当使用轮廓分数来帮助确定模型应有多少个簇时,通常应选择能最大化轮廓分数的那个K值。


课程总结

本节课中,我们一起学习了评估K均值聚类模型的两个核心指标:惯性轮廓系数

  • 惯性专注于衡量簇内的紧凑程度,通过肘部法则帮助我们寻找合适的聚类数量。
  • 轮廓系数则提供了一个更全面的视角,同时评估了簇内紧凑度和簇间分离度。

理解这些指标的推导和含义,将使你能够更自信地运用它们来优化你的聚类模型,为后续的数据分析工作打下坚实基础。

034:使用Python计算惯性与轮廓分数 📊

在本节课中,我们将学习如何构建一个K均值模型,并使用惯性轮廓分数这两个关键指标来评估它,从而帮助我们确定数据中最合适的聚类数量K。我们将涵盖从导入必要的包、数据预处理、模型构建到最终评估的完整流程。


概述

上一节我们介绍了惯性和轮廓分数的概念,它们是评估K均值模型效果、帮助确定最佳K值的核心指标。由于K均值是一种无监督学习模型,没有所谓的“正确答案”,因此数据专业人员必须依赖这些指标来判断模型是否识别出了对业务需求有用的数据特征。

本节中,我们将动手实践,在Jupyter Notebook中构建一个K均值模型,并使用惯性和轮廓分数来评估它,最终确定最佳的K值。


第一步:导入必要的包

首先,我们需要导入构建模型和进行分析所需的Python包。

以下是需要导入的包和模块:

  • numpypandas:用于数据处理和操作。
  • sklearn.cluster 中的 KMeans:用于构建K均值聚类模型。
  • sklearn.metrics 中的 silhouette_score:用于计算轮廓分数。
  • sklearn.preprocessing 中的 StandardScaler:用于数据标准化(缩放)。
  • sklearn.datasets 中的 make_blobs:用于生成本次演示所需的合成数据。
  • seaborn:用于数据可视化。
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_blobs
import seaborn as sns

第二步:准备数据

在实际工作中,你会从真实数据集开始,并进行数据探索、清洗等预处理步骤。为了简化流程并专注于建模与分析,本节我们将使用合成数据。

首先,我们创建一个随机数生成器,以确保生成的合成数据可复现。

rng = np.random.default_rng(42)

接下来,使用 make_blobs 函数和随机数生成器来创建具有未知数量聚类的数据。我们将结果转换为Pandas DataFrame,以便于查看和处理。

X, y, centers = make_blobs(n_samples=300, centers=None, n_features=6, random_state=rng, return_centers=True)
df = pd.DataFrame(X)

我们的数据有6个特征。由于维度较高,我们无法在二维或三维空间中直观地观察聚类情况,因此需要借助惯性和轮廓分数来“探测”数据的结构。


第三步:数据标准化

K均值模型基于数据点之间的距离来衡量相似性。如果数据的特征尺度不一致,距离计算会被尺度大的特征主导,从而影响聚类效果。因此,建模前对数值数据进行标准化至关重要。

我们将使用 StandardScaler。它通过以下公式对每个特征进行缩放:

公式: x_scaled = (x - μ) / σ

其中,μ 是特征均值,σ 是特征标准差。这使得所有特征的均值为0,标准差为1。

Sklearn的预处理包中还有其他缩放方法(如MinMaxScaler、Normalizer等)。虽然没有固定规则决定哪种方法最好,但对于K均值模型,使用任何缩放方法几乎总比完全不缩放效果更好。

我们使用 .fit_transform() 方法一步完成标准化器的实例化和数据转换。建议保留一份未缩放的原始数据副本以备后续分析。

scaler = StandardScaler()
X_scaled = scaler.fit_transform(df)

第四步:构建K均值模型并计算惯性

数据标准化后,我们就可以开始建模了。由于我们不知道数据中存在多少个聚类,我们将从检查不同K值对应的惯性开始。我们先尝试一个任意值,例如K=3。

默认情况下,Sklearn使用一种优化的K均值算法——K-means++。它通过让初始质心彼此远离来帮助确保模型达到更优的收敛状态。因此,我们无需多次重新运行模型。

现在,让我们实例化模型,设置聚类数 n_clusters=3,并指定一个 random_state 以确保结果可复现。

kmeans3 = KMeans(n_clusters=3, random_state=42)
kmeans3.fit(X_scaled)

模型拟合完成后,我们可以调用其属性来查看结果:

  • .labels_:获取每个数据点的聚类标签。
  • .inertia_:获取模型的惯性值(所有样本到其最近质心的平方距离之和)。
labels_3 = kmeans3.labels_
inertia_3 = kmeans3.inertia_
print(f"K=3时,惯性值为:{inertia_3}")

单一的惯性值意义不大。我们需要比较多个K值下的惯性,以寻找“拐点”。


第五步:通过惯性确定最佳K值

为了系统地比较,我们创建一个函数,计算K从2到10时的惯性,并绘制“惯性-聚类数”曲线图。

def get_inertia(data, max_k=10):
    inertia_values = []
    for k in range(2, max_k+1):
        kmeans = KMeans(n_clusters=k, random_state=42)
        kmeans.fit(data)
        inertia_values.append(kmeans.inertia_)
    return inertia_values

inertia_list = get_inertia(X_scaled)
# 使用seaborn或matplotlib绘制 inertia_list 随K值变化的折线图

观察生成的曲线图,我们发现在 K=5 处存在一个清晰的“拐点”(肘部)。当聚类数超过5时,惯性下降不再明显。这表明5个聚类可能是一个最优选择。


第六步:通过轮廓分数验证最佳K值

惯性分析给出了一个候选K值,我们再用轮廓分数来验证。轮廓分数衡量了每个样本与自己所属聚类和其他聚类的分离程度,其值越接近1越好。

首先,计算我们之前构建的K=3模型的轮廓分数。

score_3 = silhouette_score(X_scaled, labels_3)
print(f"K=3时,轮廓分数为:{score_3}")

同样,单一的分数没有比较价值。我们编写另一个函数,计算K从2到10时的轮廓分数,并绘制曲线图。

def get_silhouette(data, max_k=10):
    silhouette_scores = []
    for k in range(2, max_k+1):
        kmeans = KMeans(n_clusters=k, random_state=42)
        labels = kmeans.fit_predict(data)
        score = silhouette_score(data, labels)
        silhouette_scores.append(score)
    return silhouette_scores

score_list = get_silhouette(X_scaled)
# 绘制 score_list 随K值变化的折线图

轮廓分数图显示,当 K=5 时,分数最接近1。这证实了我们从惯性分析中得出的结论。


第七步:最终建模与聚类分析

由于我们使用的是合成数据,可以验证真实的聚类数量。回顾我们在创建数据时保存的 centers 变量,确认数据确实有5个中心点。我们的分析是正确的!

现在,我们用确定的最佳K值(5)来实例化最终的K均值模型,并拟合数据。

final_kmeans = KMeans(n_clusters=5, random_state=42)
final_kmeans.fit(X_scaled)
final_labels = final_kmeans.labels_

模型给出了0到4的五个唯一标签。我们可以将这些标签作为新列添加到原始的未缩放DataFrame中,以便进行后续分析。

df['cluster'] = final_labels

接下来,我们可以基于 df 分析不同聚类之间的特征差异(例如,计算每个聚类在各个特征上的均值)。这一步在缩放后的数据上难以进行,因为数值失去了原有的业务含义。

需要注意的是,在许多实际案例中,区分不同聚类的特征可能并不明显,需要结合领域知识和大量分析工作,才能判断某种聚类方式是否合理、是否有意义。这正是实践经验和专业知识极具价值的地方。


总结

本节课中,我们一起学习了如何完整地应用K均值聚类模型:

  1. 导入工具:引入了建模和评估所需的Python包。
  2. 准备与标准化数据:理解了数据标准化对基于距离的算法的重要性,并使用了 StandardScaler
  3. 构建与评估模型:实例化K均值模型,并利用 .inertia_ 属性计算惯性,利用 silhouette_score 函数计算轮廓分数。
  4. 确定最佳K值:通过绘制惯性和轮廓分数随K值变化的曲线,寻找“拐点”和最高分,综合确定最佳的聚类数量。
  5. 最终分析与验证:使用最佳K值重建模型,并将聚类结果用于后续的数据解读与分析。

通过结合使用惯性和轮廓分数,我们能够更有信心地为无监督的K均值聚类模型选择合适的参数,从而发现数据中潜在的有价值结构。

035:无监督学习总结 🎯

在本节课中,我们将总结无监督学习部分的核心内容,特别是K均值模型的关键概念和应用方法。


恭喜你完成了本课程的又一个重要部分。在此过程中,你已经发现无监督学习是一个拥有众多不同应用的广阔领域。

首先,你学习了用于从数据中提取结构的K均值模型。😊

你被引入了围绕质心对相似数据组进行聚类的概念,并学习了如何构建一个K均值模型。

我们探讨了使用不同的K值多次运行K均值模型的重要性。

我们还解释了局部最小值的问题,以及如何通过不同的质心初始化来构建模型,以确保获得最准确的结果。

现在,你对用于选择最佳聚类数量和评估模型有效性的惯性轮廓系数方法更加熟悉了。

并且,你能够识别惯性曲线的“肘部”,并利用它来帮助确定最优的K值。

无监督学习模型和方法论的世界非常广阔。这仅仅是一个开始。但现在,你已经掌握了在这个领域中导航并发展你作为数据专业人士才能的关键工具。😊


核心概念回顾

以下是本部分课程中涉及的核心概念和方法总结:

  • K均值聚类:一种将数据点围绕质心(中心点)分组的方法。其目标是最小化每个点到其所属簇质心的距离平方和。
    • 公式/目标:最小化 J = Σ Σ ||x_i - μ_j||²,其中 x_i 是数据点,μ_j 是第j个簇的质心。
  • 惯性:衡量模型性能的指标,表示每个样本到其最近质心的距离平方和。惯性越小,聚类效果通常越好。
  • 轮廓系数:用于评估聚类质量的指标,结合了内聚度和分离度。其值在-1到1之间,越接近1表示聚类效果越好。
  • 肘部法则:一种通过绘制不同K值对应的惯性曲线,并寻找曲线拐点(“肘部”)来确定最优K值的方法。
  • 局部最小值:K均值算法可能收敛到的非全局最优解,这通常与质心的初始随机选择有关。
  • 多次初始化:为了克服局部最小值问题,通常使用不同的随机种子多次运行K均值算法,并选择惯性最小的结果。

总结

本节课中,我们一起学习了无监督学习,特别是K均值聚类的基础知识。你了解了如何构建和评估K均值模型,掌握了使用惯性、轮廓系数和肘部法则来选择最佳聚类数量的关键技能。同时,你也认识到了处理局部最小值问题的重要性。这些工具为你进一步探索更广阔的无监督学习世界奠定了坚实的基础。

036:欢迎来到模块4 🌳

在本模块中,我们将深入探讨更高级的机器学习技术。你将重新审视监督式机器学习,并研究一些更先进的分类方法。这些进展对数据专业人员而言非常令人兴奋,因为它们使我们能够克服一些典型的建模限制。

基于树的学习 🌲

上一节我们介绍了本模块的学习目标,本节中我们来看看第一种高级技术:基于树的学习。

基于树的学习是一种监督式机器学习,用于执行分类和回归任务。它使用决策树作为预测模型,从代表项目特征的分支出发,最终到达代表项目目标值的叶子节点,从而得出结论。

决策树模型可以用以下伪代码逻辑表示:

如果 条件A 成立:
    如果 条件B 成立:
        预测为 类别1
    否则:
        预测为 类别2
否则:
    预测为 类别3

很快,你将学习到单一决策树如何为各种数据工作中更先进的方法奠定基础。

集成学习技术 🤝

了解了单一决策树后,我们将继续前进,探索集成学习技术。这些技术使你能够同时使用多个决策树,以构建非常强大的模型。

以下是集成学习的核心思路:

  • 核心思想:结合多个较弱的模型(如浅层决策树),共同做出比任何单一模型都更准确、更稳定的预测。

超参数调优 ⚙️

除了学习这些新模型的工作原理及其应用场景,你还将接触到超参数调优。了解如何以及何时调整或优化模型,可以帮助数据专业人员显著提升模型性能。

超参数调优可以理解为寻找模型的最佳配置,例如:

# 例如,在决策树中调整最大深度
model = DecisionTreeClassifier(max_depth=5)

学习成果与展望 🎯

我们将共同构建能够对各种商业应用产生巨大影响的模型。你即将学到的内容将使你在行业雇主面前脱颖而出。

让我们开始学习吧。


本节课总结

本节课中我们一起学习了模块四的概述。我们了解到本模块将重点介绍基于树的学习和集成学习这两种强大的监督机器学习技术,以及优化模型性能的关键技能——超参数调优。这些知识是构建高效、实用预测模型的重要基础。

037:突出技术和人际技能 🎯

在本节课中,我们将学习谷歌数据科学经理Daisy分享的关于数据科学家求职的核心见解。她将结合自己过去三年进行约200场面试的经验,详细阐述在招聘中高级和初级数据科学家时所看重的技术能力与软技能,并为希望入行的初学者提供实用的建议。


技术能力:坚实的分析基础 💻

上一节我们了解了课程背景,本节中我们来看看数据科学家需要具备哪些核心技术能力。Daisy指出,面试的技术部分主要考察候选人的编程技能以及对机器学习和统计学的理解。

以下是技术能力的具体考察点:

  • 编程技能:重点考察在 RPythonSQL 方面的熟练程度。
  • 理论知识:需要理解机器学习统计学的核心概念。

人际技能:连接技术与业务的桥梁 🤝

掌握了技术基础后,数据科学家还需要具备将技术应用于实际业务的能力。因此,面试的另一部分会重点考察候选人的软技能。

以下是人际技能的具体考察点:

  • 协作与沟通:能够与业务方合作,理解他们的问题。
  • 分析与建议:能够推荐合适的分析和见解,以帮助解决业务问题。

Daisy特别提到一个常见的面试误区:有时候选人会在第一个问题上卡住,并在整个面试中持续纠结于此。她鼓励候选人尽力而为,但也要知道何时应该停止,继续前进。


给初学者的建议:如何迈出第一步 🚀

如果你对成为数据科学家感兴趣,但没有相关工作经验,Daisy提供了清晰的入门路径。核心在于构建一个能够证明你能力的作品集。

以下是构建作品集的具体方法:

  • 完成实践项目:参与在线课程或认证项目中的毕业设计项目
  • 进行公益工作:尝试一些无偿的公益项目来积累经验。
  • 参加算法竞赛:参与 Kaggle 等类型的竞赛,这有助于你理解接近真实世界的问题。

她强烈建议通过上述方式构建作品集,并开始接触那些接近真实世界的、“杂乱”的数据。


本节课中我们一起学习了谷歌数据科学家面试的核心要求。总结来说,成功的候选人需要兼备扎实的技术能力(如Python编程和机器学习知识)和出色的人际技能(如业务理解和沟通)。对于初学者而言,积极构建一个包含实际项目的作品集是开启职业生涯的关键一步。

038:基于树的建模 🌳

在本节课中,我们将要学习监督学习中的一种重要技术——决策树。决策树是一种流行的分类和预测工具,也是当今工业界使用的一些最有效模型的基础。我们将了解它的工作原理、组成部分、优点与缺点,并通过一个简单的例子来直观理解其决策过程。


什么是决策树?

决策树是一种类似流程图的监督分类模型。它代表了基于相关选择可能产生的各种结果,来解决给定问题的多种方案。

与所有监督学习分类技术一样,决策树使数据专业人员能够根据当前可用信息对未来事件进行预测。在某些特定领域,它比其他监督学习模型具有非常明显的优势。


决策树的优势与局限

上一节我们介绍了决策树的基本概念,本节中我们来看看它的主要特点和需要注意的地方。

决策树具有以下优势:

  • 无需数据分布假设:决策树不要求底层数据符合特定分布。
  • 处理非线性关系:与我们之前介绍的模型不同,决策树可以轻松处理非线性关系。
  • 数据预处理简单:准备用于训练决策树的数据过程通常不那么复杂,几乎不需要预处理。

然而,决策树并非完美。任何模型都有其局限性。决策树尤其容易过拟合。模型可能在预测训练数据时表现得极其出色,但一旦引入新数据,其性能可能大打折扣。在构建此类模型时,你需要牢记这一点。


决策树的组成部分

了解了决策树的优缺点后,我们来深入其内部结构。一个决策树由节点组成。边将节点连接起来,本质上沿着树从一个节点指向下一个节点。

在每个节点处都会做出决策,每次考虑数据的一个特征并据此决定。最终,所有相关特征都会被解析,从而得出分类预测。

让我们通过一个例子来进一步探索。


一个决策树实例

假设我们有一个决策树,用于帮助你在任何给定的一天决定是否外出踢足球。

以下是决策过程:

  1. 根节点:第一个决策与天气展望有关。选项有三个:晴天、多云或雨天。这个做出第一个决策的节点称为根节点。它是树中的第一个节点,做出预测所需的所有决策都源于它。它是一种特殊的决策节点,因为它没有前驱节点。
  2. 决策节点:做出决策的节点就是决策节点。决策节点总是指向树内的一个叶节点或其他决策节点。
    • 在我们的例子中,如果天气是晴天或雨天,树将继续做出更多决策以得出最终预测。
    • 如果天气是多云,树会直接到达一个预测:去踢足球。😊
  3. 叶节点:这便引出了叶节点的概念。叶节点是做出最终预测的地方。整个过程在此结束,因此在此之后不需要进一步的决策。
  4. 继续决策:现在,让我们看看如果天气展望是晴天,决策树会走向何方。我们还没有到达叶节点,仍有决策要做。
    • 这次,考虑的因素是湿度。如果湿度高于75%,树会在一个叶节点结束,该节点说:不去踢足球
    • 如果湿度低于75%,决策树会说:去踢足球
  5. 父子节点关系:被指向的节点(无论是叶节点还是其他决策节点)称为子节点。指向它们的节点称为父节点

决策树如何选择分裂点?

你可能会问,算法如何决定在何处、以何种方式分裂变量?其核心原则是基于预测能力

算法决定在何处以及如何分裂变量,基于的是什么能提供最强的预测能力

例如,如果90%的下雨天都不踢足球,那么“天气展望”这个变量就非常有预测性。根据“天气展望”分裂数据会产生新的数据组,每组中“踢球”和“不踢球”的结果会占大多数。😊


总结与展望

本节课中,我们一起学习了决策树的基础知识。你现在知道了决策树是一种用于分类的流程图模型,它由节点和边组成,包括根节点、决策节点和叶节点。我们讨论了它的优势(如无需数据假设、处理非线性)和主要局限(容易过拟合),并通过一个生动的“是否踢足球”的例子理解了其决策过程。

现在你掌握了决策树的基础,这个基础将有助于你继续学习基于树的建模。接下来,你将学习构建树的具体方面,以及如何使用训练数据来发展节点和边。然后,你将学习如何优化基于树的模型,以及作为一名数据专业人员,可以做些什么来最大化它们的能力。

039:用Python构建决策树 🌳

在本节课中,我们将学习如何使用Python构建一个标准的决策树模型。我们将以预测银行客户流失为例,从导入必要的库开始,逐步完成数据准备、模型训练、评估和可视化分析的完整流程。

上一节我们介绍了分类模型的基础,本节中我们来看看如何构建一个更高级的模型——决策树。

概述与准备

首先,我们需要导入构建决策树所需的Python包和库。

以下是需要导入的库:

from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay, accuracy_score, precision_score, recall_score, f1_score
import pandas as pd
from sklearn.model_selection import train_test_split

我们将读取原始数据集,并像往常一样将其转换为Pandas DataFrame。通常,在此步骤之后会进行探索性数据分析(EDA),并根据模型的使用场景选择合适的评估指标。

对于我们的银行客户流失模型,我们假设需要一个能平衡精确率和召回率的指标。F1分数是实现这种平衡的指标,其定义为精确率和召回率的调和平均数,即它们的乘积除以它们的总和。重要的是,您需要根据具体的使用场景做出明智的选择。

数据准备

现在我们已经确定了评估指标,接下来开始为建模准备数据。

以下是数据准备步骤:

  1. 删除无预测性的特征以及“性别”列,以防止模型基于性别进行预测。
  2. 对“地理位置”列进行虚拟编码,将分类列转换为布尔列。
  3. 将目标变量与其余数据分离。
  4. 使用 train_test_split 函数将数据划分为训练集和测试集,并记得根据目标变量进行分层。

训练基准决策树模型

我们将首先训练一个基准决策树模型,不对其进行调优,仅为我们提供一个参考分数。

以下是训练基准模型的步骤:

  1. 实例化分类器并设置随机状态,将其赋值给变量 dec_tree
  2. 将模型拟合到训练数据上,这将在我们的数据上“生长”出一棵决策树。
  3. 使用 predict 方法,利用刚生成的树对 X_test 数据进行预测,并将结果赋值给变量 dtp

现在,我们可以使用导入的不同评估指标函数来获取结果。该模型的F1分数优于我们之前构建的朴素贝叶斯模型。

评估与可视化

让我们检查决策树预测的混淆矩阵。首先,编写一个简短的辅助函数来帮助我们显示矩阵。

从这个混淆矩阵中注意到,模型正确预测了许多真阴性,这是可以预期的,因为数据本身偏向于阴性类别。当模型出错时,它预测假阳性的可能性似乎略高于假阴性,但总体上是平衡的。这反映在精确率和召回率分数非常接近上。

接下来,让我们检查决策树的分裂情况。我们将使用导入的 plot_tree 函数来实现。

我们将拟合好的模型以及一些额外参数传递给该函数。请注意,如果我们不设置 max_depth=2,该函数将绘制出直到叶节点的整棵树。但我们最感兴趣的是靠近根节点的分裂,因为它们能告诉我们最具预测性的特征。

class_names 参数显示每个节点中的多数类,filled 参数根据节点的多数类为其着色。

我们如何解读这个图?

  • 每个节点中的第一行信息是模型识别出的最具预测性的特征和分裂点。换句话说,这就是在该分裂点提出的问题。对于我们的根节点,问题是:客户年龄是否小于或等于42.5岁?
  • 在每个节点,如果问题的答案是“是”,样本将移动到左侧的子节点;如果答案是“否”,样本将移动到右侧的子节点。
  • gini 指的是节点的基尼不纯度。这是衡量节点纯度的一种方式,其值范围从0到0.5。基尼分数为0表示没有不纯度,节点是叶节点,其所有样本都属于单一类别。分数为0.5表示该节点中各类别的样本数量相等。
  • samples 表示该节点中的样本数量。
  • value 表示该节点中每个类别的样本数量。回到根节点,我们有 value = [5972, 1528]。注意这些数字之和为7500,即该节点中的样本总数。这告诉我们,该节点中有5972名客户留住了,1528名客户流失了。
  • class 告诉我们每个节点中样本的多数类。

如果我们查看树的顶部,这个图告诉我们,如果只能对单个变量进行一次分裂,那么最能帮助我们预测客户是否会流失的变量是他们的年龄。

如果我们查看深度为1的节点,会注意到产品数量以及客户是否为活跃会员也都是预测他们是否会流失的强指标。这是一个很好的迹象,表明可能值得回到您的EDA中,更仔细地检查这些特征。

总结

本节课中我们一起学习了如何在Python中构建和评估一个决策树分类器。我们完成了从数据准备、模型训练、使用F1分数等指标进行评估,到可视化决策树结构并解读其节点的完整流程。通过分析树的分裂,我们能够识别出最具预测性的特征,例如客户年龄。

现在您已经对Python中基于树的建模工作原理有了基本了解,在继续学习更强大的优化技术之前,还有两个技巧需要掌握:超参数调优和交叉验证。使用这些技术,我们可以进一步优化单个决策树,并且您将运用这些概念来增强后续将要学习的模型。

040:调整决策树 🌳

概述

在本节课中,我们将要学习如何通过调整超参数来优化决策树模型的性能。我们将介绍决策树的关键超参数,并详细讲解如何使用网格搜索方法系统地寻找最优参数组合。


决策树与超参数调优

在之前的课程中,你已经探索了如何为许多模型构建决策树分类器,并使用F1分数等评估指标来衡量其性能。

在本节课程中,你将更进一步,通过一些额外步骤从模型中获取额外的性能提升。

模型创建后,一种非常流行且广泛使用的提升性能的技术被称为超参数调优

超参数是在模型训练之前可以设置的参数。通过调整这些参数,可以直接影响模型对数据的拟合方式,从而改善模型性能。

超参数调优是调整参数以找到最佳值的过程,这些最佳值将产生最优的模型。就像音乐家调吉他弦一样,其目标是实现平衡和优美的结果。

对于基于树的建模,有许多可以调整的超参数,它们对模型本身有很大影响。实际上,你在本课程中处理K均值模型时已经使用过一个超参数。

回想一下,在构建K均值模型时,你设置了k的值以产生不同的聚类结果。当你改变其值时,你就在执行超参数调优。


决策树的关键超参数

以下是决策树的两个基础但重要的超参数。

最大深度 (max depth)

设置此超参数定义了决策树可以有多长的限制。

决策树的深度是根节点与离根节点最远的节点之间的层数,根节点本身为第0层。

考虑我们之前的例子。这棵树有三个层级。根节点是第0层。中间的节点是第1层,最底部的叶节点是第2层。所以这棵树的深度为2。

然而,这棵决策树的深度为4。尽管这棵决策树不像前一个例子那样填满,但重要的是最远节点与根节点的距离,无论它是叶节点还是决策节点。

这让我们回到最大深度。在处理非常大的数据集时,你可能会创建非常深的大树。但这并不一定是你的模型所需要的。

因此,设置最大深度的值可以通过限制树的深度来帮助减少过拟合问题。此外,它还可以从一开始就降低训练和使用模型的计算复杂度。

例如,如果你发现决策树在深度为10和深度为100时具有相同的性能,你可以将最大深度设置为10,从而更快地达到所需的性能。

最小叶节点样本数 (min samples leaf)

这个超参数定义了叶节点中必须包含的最小样本数。这意味着只有当结果节点中有足够的样本来满足所需值时,才会发生分裂。

例如,也许在你的树的一部分,有一个决策节点目前有10个样本。然而,最小叶节点样本数超参数设置为6。那么将无法以某种方式分割数据,使得每个叶节点都有六个样本,因此无法进行进一步的分裂。


使用网格搜索寻找最优参数

除了决策树的其他超参数,我们首先来探索如何为参数寻找最优值,这就是网格搜索发挥作用的地方。

网格搜索是一种工具,通过系统地检查超参数的每种组合,根据所选指标确定哪一组能产生最佳结果,从而确认模型达到了其预期目的。

因此,最终你将获得在执行网格搜索时能为你的模型产生最佳结果的值。

以下是执行网格搜索的步骤:

  1. 指定要调优的参数及其搜索范围值:例如,我们想要调优最大深度和最小叶节点样本数。我们需要为每个参数定义可能的值。

    • 对于最大深度,我们可以检查深度为4、8、12、20和30。
    • 对于最小叶节点样本数,我们可以尝试10、50和100。
  2. 算法检查所有值组合:算法将检查每个值组合,看看哪一对具有最佳的评估指标。它会首先检查最大深度为4,最小叶节点样本数为10,然后是50,然后是100。接着,算法会检查最大深度为8,最小叶节点样本数为10,然后是50,然后是100。这个过程一直持续到分析完所有组合。

请记住,如果你认为收益值得计算时间的成本,你可以在网格搜索期间尝试任何值和任意数量的值。


总结

在本节课中,我们一起学习了决策树模型超参数调优的核心概念。我们介绍了最大深度最小叶节点样本数这两个关键超参数,并详细解释了如何使用网格搜索方法系统地寻找最优参数组合。通过调整这些超参数,我们可以控制模型的复杂度,防止过拟合,并提升模型的整体性能。接下来,我们将把到目前为止学到的许多基于树的建模概念付诸实践,从构建树到优化它,再到使用它进行一些分类预测。

041:模型验证 🧪

在本节课中,我们将要学习机器学习中一个至关重要的环节:模型验证。我们将探讨什么是模型验证,以及如何使用验证集和交叉验证来评估模型的性能,确保模型能够按照预期工作。


模型验证概述

上一节我们介绍了构建强大模型所需的多种工具。本节中,我们来看看如何验证这些模型的性能。

模型验证是一系列旨在确认模型是否按预期执行的过程和活动。这通过一个验证数据集来实现,该数据集是在训练期间被保留下来的一部分数据。验证数据集用于对最终调优模型的技能提供一个无偏估计。需要注意的是,验证数据与测试数据不同,并且必须在整个流程的最后阶段之前保持“不可见”。

传统的数据拆分方法

在我们之前构建的一些模型中,我们并没有严格遵循这一流程。但这没关系,因为我们当时主要是为了理解构建和评估的过程。

此前,在训练模型之前,我们会将数据拆分为两个集合:一个训练集和一个测试集。这两个集合分别用于训练和测试模型。

引入验证集

当引入验证时,数据实际上被拆分为三个集合。前两个集合仍然是训练集和测试集,但现在增加了一个额外的验证集。这个验证集将代替测试集来评估模型,从而使测试集保持原封不动。

交叉验证方法

除了标准验证,另一种流行的方法是交叉验证。交叉验证是一个在多次迭代中使用数据的不同部分来测试和训练模型的过程。

它的工作原理类似于验证,但略有不同。它不是使用一个固定的验证集来评估模型,而是将训练数据分割成多个部分,称为“折”。然后,模型在这些折的不同组合上进行训练。

以下是交叉验证的一个典型流程示例:

  1. 首先,数据被拆分为训练数据和测试数据。
  2. 然后,训练数据被进一步拆分为预定数量的折(例如,5折)。
  3. 第一个模型迭代将使用第1、2、3、4折进行训练,并使用第5折来获取模型指标。
  4. 下一个迭代将使用第1、2、3、5折进行训练,使用第4折来获取指标。
  5. 此过程重复进行,直到所有组合都完成。
  6. 最后,将所有迭代的评估指标进行平均,得到最终的验证分数。

如何选择验证技术

选择哪种验证技术主要取决于你正在处理的数据集。

交叉验证在处理较小的数据集时特别有用,因为它能最大化可用数据的效用,效果通常优于标准验证。

然而,在处理非常大的数据集时,交叉验证并非必需。数据量如此之大,以至于最大化效用不再是必须的,并且根据你拥有的计算资源,交叉验证甚至可能带来问题。

但是,如果计算资源有限或数据约束不是问题,那么交叉验证几乎总是会被应用。

总结

本节课中,我们一起学习了模型验证的核心概念。验证方案对于构建和选择有效模型至关重要。从事此类商业项目的数据专业人员有责任确定使用的最佳方案。这需要经验,以及对数据和可用工具的理解。掌握这些知识,你就在培养这些重要技能的道路上迈出了坚实的一步。

042:使用Python调整和验证决策树 🌳

在本节课中,我们将学习如何对之前构建的决策树分类器进行超参数调优,以优化模型性能。我们将重点介绍网格搜索方法,并使用Python代码实现决策树的调优与验证过程。


概述

上一节我们介绍了决策树分类器的构建。本节中,我们将在此基础上,学习如何通过调整模型的超参数来提升其性能。核心内容包括理解超参数调优的概念、掌握网格搜索方法,并最终在Python中实现一个经过调优的决策树模型。


超参数调优回顾

超参数调优是指在模型学习过程开始之前,调整那些直接影响模型训练方式的参数。不同的模型拥有不同类型的可调超参数。

对于基于树的模型,有两个重要的超参数:

  • max_depth:定义了决策树的最大深度。
  • min_samples_leaf:定义了叶节点所需的最小样本数。

我们将对单个决策树的这两个超参数进行调优。


网格搜索方法

最初探索超参数调优时,我们考虑了寻找超参数最优值的步骤。随机输入数值无法产生最佳结果,因此我们使用网格搜索。

网格搜索为每个待调优的超参数指定一系列值。它会系统地检查这些值的所有组合,根据选定的评估指标确定哪一组能产生最佳结果。

可以将其理解为对不同的超参数值进行“暴力”尝试。想象一下忘记PIN码,然后尝试从0000到9999之间的每一个数字。虽然耗时,但最终总能找到正确的组合。网格搜索就是这样工作的。


代码实现

现在让我们进入代码部分。您将在之前创建其他分类模型相同的框架下工作。我们从决策树笔记本中上次结束的地方开始。请注意,我们已经完成了特征工程,数据也已分割为X和Y数据,以及训练集和测试集。

我们将添加一个新函数。从sklearnmodel_selection包中导入GridSearchCV,以实现超参数调优。GridSearchCV中的CV代表交叉验证。

每次使用一组超参数时,都会根据验证集对其进行评分,从而保证测试数据不被“窥见”。在后续比较模型时,您将使用这些验证分数。

请注意,您不会将此调优后的决策树与现有模型进行比较。所有其他模型都是使用测试数据进行评分和比较的,这实际上是一种不正确的做法。当数据专业人员在工作中进行模型选择时,测试数据必须始终对正在处理的模型保持不可见,这些数据仅在模型开发过程的最后阶段使用。

如前所述,您将调优的参数是max_depthmin_samples_leaf

以下是实现步骤:

  1. 定义参数字典:创建一个字典,其中键是超参数的名称,值是将作为该超参数进行尝试的数字列表。

    # 示例
    tuned_parameters = {
        'max_depth': [6, 8, 10, 12, 14],
        'min_samples_leaf': [10, 20, 30, 40, 50]
    }
    
  2. 定义评估指标:虽然网格搜索基于F1分数,但您仍然希望了解其他分数。因此,创建一个名为scoring的集合,包含每个所需指标的名称。

    scoring = ['accuracy', 'precision', 'recall', 'f1']
    
  3. 创建模型与网格搜索对象:创建一个名为tuned_decision_tree的决策树分类器实例。然后调用GridSearchCV函数,传入决策树分类器对象、参数字典、评分方法、交叉验证折数,并指定搜索将重点关注的指标。

    tuned_decision_tree = DecisionTreeClassifier(random_state=0)
    clf = GridSearchCV(tuned_decision_tree,
                       tuned_parameters,
                       scoring=scoring,
                       cv=5,
                       refit='f1')
    
  4. 拟合模型:最后,将模型拟合到数据。

    clf.fit(X_train, y_train)
    
  5. 检查最佳参数与分数:通过从网格搜索对象获取best_estimator_属性来检查网格搜索识别出的超参数,您可以观察它找到的值。例如,当使用F1分数作为衡量标准时,max_depth为8且min_samples_leaf为20可能是最佳组合。

    print(clf.best_estimator_)
    

    获取best_score_属性可以确认在所有超参数组合中,不同交叉验证折上的最佳平均F1分数。请注意,此模型获得的分数约为0.5607。

  6. 提取并保存结果:最后的代码块是一个辅助函数,用于提取模型的分数。它生成一个包含模型名称以及您一直在使用的四个分数的数据框。在最后调用此函数,并将结果数据框保存为CSV文件以供后续使用。

    # 假设有一个函数 get_scores(model_name, clf)
    results_df = get_scores('Tuned Decision Tree', clf)
    results_df.to_csv('tuned_decision_tree_scores.csv', index=False)
    

目前,还没有其他分数可以与此分数进行比较。然而,请注意该模型的F1分数为0.5605。很快,您将继续创建其他更高级的基于树的模型,并找到分数与此模型进行比较。

有了这些数字,您将能够确定哪个模型不仅性能最佳,而且在业务需求的背景下也是最优的。


总结

本节课中,我们一起学习了如何对决策树模型进行超参数调优。我们回顾了max_depthmin_samples_leaf这两个关键超参数,详细介绍了使用网格搜索系统化寻找最优参数组合的方法,并完成了在Python中实现调优决策树的完整代码流程。通过这个过程,我们确保了模型评估的严谨性,为后续与其他更复杂模型的性能比较奠定了基础。

043:自助聚合(Bagging) 🧠

在本节课中,我们将要学习一种强大的机器学习技术——自助聚合(Bagging)。我们将探讨如何通过组合多个模型来提高预测的准确性和稳定性,并特别介绍如何将这种方法应用于决策树,从而构建出随机森林模型。


决策树的优势与局限

上一节我们介绍了决策树模型。决策树很有用,因为它们易于理解和解释,对使用的数据类型非常灵活,并且用途广泛。决策树可以是很好的预测器。

然而,你也知道它们容易过拟合,并且对训练数据的变化非常敏感。

我们如何解决这些问题呢?答案是利用群体的智慧。

群体智慧与集成学习

或许你对这个概念很熟悉,因为它也适用于日常情况。如果我有一个装满软糖豆的罐子,我请一位空间数学专家来检查并猜测里面有多少颗软糖豆,他们的估计通常不如我请1000个普通人做同样的事情,然后取他们猜测的平均值来得准确。

我们可以将同样的概念应用于建模,使用一个称为集成学习或简称为集成的过程。

集成学习涉及构建多个模型,然后聚合它们的输出来做出最终预测。就像在我们的软糖豆例子中一样,使用模型集成做出的预测非常准确,即使单个模型本身的准确度仅比随机猜测略高。

构建集成模型的一个最佳实践是为其中的每个模型使用非常不同的方法,例如逻辑回归、朴素贝叶斯模型和决策树分类器。这样,当模型出错时(它们总是会出错),这些错误将是不相关的。目标是让它们不会因为相同的原因而犯相同的错误。

构建集成模型的方法

以下是构建集成模型的一种方法:

你可以使用我刚才提到的三个模型构建一个集成。你将在相同的数据上训练每个模型,然后使用每个模型的单独预测来做出最终预测。对于分类任务,可以通过多数投票来保存结果;对于回归任务,可以通过平均结果来保存。

但是还有另一种构建集成的方法,这种方法对集成中的每个贡献模型使用相同的方法论。在这种集成中,构成它的每个单独模型被称为基学习器。为了使这种方法有效,你通常需要很多基学习器,并且每个基学习器都在训练数据的唯一随机子集上进行训练。

如果所有基学习器都在完全相同的数据上进行训练,那么错误之间就会存在太多的相关性,这将影响基学习器的强度。如果一个基学习器的预测仅比随机猜测略好,它就变成了一个弱学习器

自助聚合(Bagging)

为了解决这个问题,数据专业人员会进行一种称为Bagging的操作,以确保数据的随机子集和强学习器。Bagging这个词来源于Bootstrap Aggregating。让我们来分解一下。

从统计学中记住,Bootstrap指的是有放回抽样。在Bagging过程中也会发生这种情况。每个基学习器都通过有放回抽样从数据中抽取样本。这意味着不同的基学习器可以抽取到相同的观测值,并且单个学习器在训练期间可以多次抽取到同一个观测值。

Bagging中的聚合部分指的是将所有单个模型的预测聚合起来以产生最终预测。对于回归模型,这通常是所有预测的平均值。对于分类模型,通常是获得最多预测的类别,也就是众数

随机森林

当Bagging与决策树一起使用时,我们就得到了随机森林。随机森林是一个基于决策树的基学习器的集成,这些学习器在Bootstrap数据上进行训练。基学习器的预测被全部聚合以确定最终预测。

随机森林将Bagging的随机化更进一步。一个常规的决策树模型会寻找用于分割节点的最佳特征。而一个随机森林模型将通过从训练数据中可用的特征中随机抽取一个子集来生长它的每一棵树,然后在每棵树可用的最佳特征处分割每个节点。

这意味着随机森林模型中的每个基学习器都有不同的可用特征组合,这有助于防止集成中学习器之间出现相关错误的问题。

每个单独的基学习器都是一棵决策树。它可能是完全生长的(因此每个叶子是一个单独的观测值),也可能非常浅,这取决于你如何选择调整你的模型。集成许多基学习器有助于减少你通常从单个决策树中获得的高方差。


总结

本节课中我们一起学习了集成学习,特别是自助聚合(Bagging)技术。集成学习之所以强大,是因为它结合了许多模型的结果,有助于做出更可靠的最终预测。此外,与其他独立模型相比,这些预测具有更小的偏差和更低的方差。接下来,我们将更详细地探讨随机森林。还有很多内容即将到来。😊

044:探索随机森林 🌲🤖

在本节课中,我们将要学习随机森林模型的核心概念、工作原理及其优势。我们将深入探讨其构成要素,并解释为何它在数据科学中如此强大和常用。


上一节我们介绍了决策树的基本概念,本节中我们来看看如何通过集成多个决策树来构建更强大的模型——随机森林。

现在你已经对随机森林有了初步了解,让我们更仔细地审视它是什么以及它如何运作。理解这个方法很重要,因为它在数据工作中被广泛使用,并且它的许多组成步骤也被其他更高级的建模策略所采用。

简单回顾一下,随机森林是一个由多棵学习树组成的集成模型,其所有树的预测结果被汇总以确定最终预测。随机森林模型中的每棵树都使用自助采样法,从训练数据中有放回地随机抽取观测样本。请记住,这意味着模型中的任何树都可以使用相同的观测样本,并且同一个观测样本可以被同一棵树多次抽取。

自助采样法是随机森林模型的一个关键组成部分。它确保集成中的每个基学习器都在不同的数据上进行训练,同时允许每个学习器在一个与原始训练数据集大小相同的数据集上进行训练。

由于树的训练数据中存在重复的观测样本,因此每棵树都会缺失原始训练数据集中的一些观测样本。

随机森林模型的另一个重要原则是,集成中的所有树都是在数据集中可用特征的随机子集上进行训练的。没有一棵树能看到所有特征。这同样是为了引入另一个随机性元素,并确保每棵树都尽可能与其他树不同。

你了解到决策树的主要弱点之一是对新数据非常敏感,因此它们容易过拟合。因此,随机化每个基学习器使用的数据和特征意味着没有一棵树能对整个数据进行过拟合。这是因为没有一棵树能看到所有数据。事实上,这些树对数据是欠拟合的。它们具有高偏差,但集合在一起,它们可以成为比普通单一决策树更稳定的强大预测器。

此外,随机森林的可扩展性非常强。它们所依赖的所有基学习器都可以使用不同的处理单元并行训练,甚至可以跨越多台不同的服务器。


以下是随机森林模型需要调整的关键超参数:

  • 树的数量:集成中决策树的总数。
  • 最大深度:每棵树允许生长的最大深度。
  • 最小样本分裂:节点分裂所需的最小样本数。
  • 最小样本叶子:叶节点所需的最小样本数。
  • 最大特征数:寻找最佳分割时考虑的最大特征数量。

最后,就像决策树一样,随机森林模型也需要进行调整,以找到能产生最佳预测的超参数设置组合。毕竟,随机森林由许多决策树组成,数据专业人员希望它们都尽可能有效。


本节课中我们一起学习了随机森林的构建原理。我们了解到,它通过自助采样特征随机子集两种随机化方法,将多个高偏差(欠拟合)的决策树集成起来,从而降低整体模型的方差,有效防止过拟合,并获得了比单一决策树更稳定、更强大的预测能力。同时,其并行训练的特性也使其具备优秀的可扩展性。

045:调整随机森林模型 🌲⚙️

在本节课中,我们将基于对决策树生长方式的理解,学习如何调整随机森林模型的核心参数。这是优化模型性能的关键步骤。

决策树的生长与停止条件

上一节我们介绍了决策树的基本原理,本节中我们来看看一棵树是如何决定停止生长的。决策树会持续进行分裂,直到满足以下任一条件:

以下是决策树停止分裂的主要条件:

  • 节点纯度:当一个叶节点(leaf node)包含的所有观测数据都属于同一个类别时,该节点被视为“纯”的,分裂停止。
  • 达到预设限制:当树达到预设的最小叶节点样本数min_samples_leaf)或最大深度max_depth)时,分裂停止。
  • 达到性能阈值:如果分裂带来的性能提升低于某个阈值,分裂也会停止。这个阈值的具体值和评估指标可以由建模者指定。

这些控制模型如何拟合数据的预设条件,被称为超参数。调整它们可以显著影响模型性能。

决策树的关键超参数

我们之前演示过,决策树最重要的超参数之一是最大深度max_depth)。它指定了树可以拥有的层级数,最终决定了树能进行多少次分裂。请记住,每次节点分裂,数据都会被分割成更小的子集,模型就在绘制另一条决策边界。

我们还介绍了最小叶节点样本数min_samples_leaf),它定义了一个叶节点所需的最小样本数。有了这个限制,一次分裂只有在能保证生成的子节点都满足最小观测数时才会发生。

现在,引入一个新概念:最小分裂样本数min_samples_split)。这个参数可以用来控制节点成为叶节点的阈值,即一个节点必须包含多于min_samples_split个样本才有资格继续分裂。

随机森林的超参数

随机森林模型拥有上述所有超参数,因为它本身就是决策树的集成。这些超参数控制着其中每棵“学习树”的生长方式。

然而,随机森林还有一些额外的超参数,用于控制集成过程本身。

以下是控制随机森林集成的两个关键超参数:

  • 最大特征数max_features):这个参数控制着树的随机性。它指定了每棵树在决定如何分裂时,从训练数据中随机选取的特征数量。例如,如果你的数据集有特征A、B、C、D、E,并将max_features设为3,那么第一棵树可能使用特征A、C、E来决定分裂,下一棵树可能使用B、D、E,依此类推。
  • 评估器数量n_estimators):这个参数控制着模型将为集成构建多少棵决策树。例如,如果你将n_estimators设为300,模型将训练300棵独立的树。如果是构建回归树,模型的最终预测将是这300棵树预测结果的平均值;如果是分类树,最终预测将由300棵树中投票最多的类别决定。

对于随机森林模型,性能通常会随着集成中树的数量增加而提升,但只会达到一个临界点。超过这个点后,性能提升会趋于平缓,而增加新树只会增加计算时间。这是因为新树会与现有树变得非常相似,从而无法为模型贡献新的信息。

超参数调优实践

最后需要指出,许多数据专业人员并非手动设置每个超参数。实际上,在使用Scikit-learn等库时,模型即使不设置任何超参数也可能表现良好,因为它有有效的默认设置。

请记住,要充分利用网格搜索(Grid Search)等工具来帮助你迭代。数据专业人员知道如何通过实验不同的超参数组合,来构建能够做出最佳预测的模型。


本节课中我们一起学习了决策树的停止生长条件,并深入探讨了随机森林模型的核心超参数,包括控制单棵树的max_depthmin_samples_leaf,以及控制集成过程的max_featuresn_estimators。理解这些概念是有效调整和优化随机森林模型的基础。

046:用Python构建和交叉验证随机森林模型 🌲🤖

在本节课中,我们将学习如何使用Python构建一个随机森林模型,并利用网格搜索进行交叉验证和超参数调优。我们将从导入必要的库开始,逐步完成数据准备、模型构建、交叉验证和性能评估的全过程。


概述

上一节我们介绍了随机森林的基本逻辑及其关键超参数。本节中,我们将动手实践,使用Python的Scikit-learn库构建一个随机森林分类器。我们将通过网格搜索进行交叉验证,以找到最优的超参数组合,并评估模型的性能。


数据准备与导入库

首先,我们需要导入必要的Python库并准备数据。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score, f1_score
from sklearn.ensemble import RandomForestClassifier

请注意,我们导入的是RandomForestClassifier,因为我们要解决的是一个分类问题(预测客户是否会关闭银行账户)。如果预测的是连续型数据,则应导入RandomForestRegressor

在数据准备阶段,我们已经移除了没有预测价值的列(如行号、客户ID和姓氏),并删除了性别列,以避免模型基于性别进行预测。同时,我们对分类变量进行了哑编码,为建模做好了准备。

建模前的最后一步是使用train_test_split将数据划分为训练集和测试集。

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

我们将测试集大小设置为总数据的25%,并根据目标列进行分层抽样,同时将随机种子设为42,以确保与之前的朴素贝叶斯和决策树模型使用相同的数据划分,从而进行公平比较。


构建随机森林模型

现在,我们开始构建随机森林模型。集成模型的一个特点是训练时间通常比单一模型长得多,因为我们需要为指定的每一组超参数组合构建数十甚至上百棵树。

为了了解模型训练所需的时间,我们可以在代码单元格顶部使用%%time这个魔术命令。魔术命令是IPython内置的、用于简化常见任务的命令,总是以%%%开头。

%%time

接下来,我们定义要进行网格搜索的超参数空间。

以下是需要调优的5个超参数:

  • max_depth: 树的最大深度。None表示允许树生长而不限制深度。
  • min_samples_leaf: 叶节点所需的最小样本数。
  • min_samples_split: 内部节点再划分所需的最小样本数。
  • max_features: 寻找最佳分割时考虑的特征数。
  • n_estimators: 森林中树的数量。
param_grid = {
    'max_depth': [None, 10, 20, 30],
    'min_samples_leaf': [1, 2, 4],
    'min_samples_split': [2, 5, 10],
    'max_features': ['auto', 'sqrt'],
    'n_estimators': [75, 100, 150]
}

然后,我们实例化随机森林分类器,并为其指定一个随机种子以确保结果可复现。同时,我们指定模型需要记录的评估指标。

rf = RandomForestClassifier(random_state=42)
scoring = {'accuracy', 'f1', 'recall', 'precision'}

接着,实例化网格搜索对象。它需要两个位置参数:分类器和参数网格。我们告诉它使用上面定义的评分指标,并将交叉验证的折数CV设为5。

grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, scoring=scoring, cv=5, refit='f1')

refit参数设为'f1'非常重要。当我们指定了多个评分指标时,这告诉网格搜索:尽管我们想查看多个指标,但我们最关心的是F1分数。F1分数是精确率和召回率的调和平均数,它将两者结合为一个单一的指标。调用best_estimator_时,返回的将是五折交叉验证中平均F1分数最高的模型。

现在,将模型拟合到训练数据上。

grid_search.fit(X_train, y_train)

根据可用的计算能力、网格搜索中指定的超参数组合数量、数据集大小以及交叉验证的折数,这个过程可能需要很长时间。在本例中,%%time魔术命令显示拟合过程大约需要20分钟。


权衡与模型保存

在搜索大的超参数空间和获得良好的运行时间之间,总是存在权衡。搜索的超参数越多,模型性能可能越好,但拟合所需的时间也越长。

当模型需要很长时间来拟合时,你肯定不希望因为内核断开连接或关闭笔记本导致输出丢失而不得不重新运行。好消息是,有一种方法可以将拟合好的模型对象保存到指定位置,然后快速读回。我们将在下一个视频中学习具体如何操作。


总结

本节课中,我们一起学习了如何使用Python构建随机森林分类模型。我们回顾了数据准备的步骤,使用train_test_split划分了数据集,并通过GridSearchCV进行了五折交叉验证来调优多个关键超参数。我们还了解了在训练复杂模型时管理运行时间和保存模型的重要性。在下一节,我们将学习如何保存和加载训练好的模型。

047:使用验证数据集构建和验证随机森林模型 🧠🌲

概述

在本节课中,我们将学习如何使用一个独立的验证数据集来构建和验证随机森林模型。我们将从上一节结束的地方开始,介绍如何保存和加载已训练的模型,然后详细讲解如何将训练数据分割为新的训练集和验证集,并使用此验证集来评估模型性能。


从保存模型开始

上一节我们介绍了使用网格搜索进行交叉验证和超参数调优来创建随机森林模型。

本节中我们来看看如何利用一个独立的验证数据集来验证模型。但在此之前,我们先回顾一下上节课的遗留问题。我们发现了数据领域的一个常见问题:在搜索大范围超参数空间和获得良好运行时间之间需要权衡。

我们观察到,搜索的超参数越多,模型可能越好,但模型拟合所需的时间也越长。当模型需要很长时间来拟合时,反复运行和重新拟合它们是低效的。一旦找到一个满意的模型,你不会希望每次打开笔记本时都从头开始。

这就是 pickle 工具的用武之地。Pickle 是一个工具,它能将拟合好的模型对象保存到指定位置,并能快速读回。它还允许你使用在其他地方拟合的模型,而无需自己重新训练。

让我们接着上节课的内容,开始保存模型。

首先,指定一个文件路径,指向保存模型的目录。

然后创建一个 with open 语句,向其传递文件路径,加上你想用来保存此模型的名称,并以 .pickle 结尾。这会创建一个空的 pickle 文件。第二个参数 ‘wb’ 授予以二进制模式写入文件的权限,这是 pickle 的工作方式。

使用 asopen 的返回值分配给一个名为 to_write 的局部变量。

调用 pickle.dump 并将拟合的模型对象和 to_write 变量传递给它。

在下一个单元格中,从保存的位置读回 pickled 模型。语法上的唯一区别是使用 ‘rb’ 来指定我们将读取二进制文件,并使用 pickle.load 来分配一个新变量,该变量指向拟合的模型。确保这个新变量的名称与你上面用于拟合模型的名称相同,本例中是 rfc_cv

如果你注释掉拟合模型的那行代码以及保存模型的单元格,你可以关闭笔记本,重新打开它,并重新运行所有单元格,而无需等待模型重新拟合。

你也可以将预拟合的模型发送给其他人使用。

现在,使用 best_params_ 属性来识别在所有交叉验证折叠中平均 F1 分数最高的模型的超参数值。

要找到最佳模型的平均 F1 分数,使用 best_score_ 属性。

然后使用 make_results 函数生成所有结果的表格,并将其与总表连接起来以比较所有模型。

有趣的是,交叉验证的随机森林模型在所有五个验证折叠上的平均 F1 分数为 0.58,比单个调优的决策树稍好一些。它还具有更好的召回率、精确度和准确率。


使用独立验证集

现在,让我们使用一个独立的验证数据集来验证模型。

为此,将训练数据分割成一个新的训练集和验证集。使用 train_test_split。记住要对 y 数据进行分层。使用 80/20 的分割比例。

不要忘记,这只是对训练数据进行分割,而训练数据本身占所有数据的 75%。这意味着我们的新训练集将是数据的 75% 中的 80%,而新的验证集将是数据的 75% 中的 20%。测试数据保持不变。

接下来的部分有点棘手。GridSearchCV 希望交叉验证数据。实际上,如果 cv 参数留空,默认情况下它会将数据分成五折进行交叉验证。

因为你使用了一个独立的验证集,所以明确告诉函数如何执行验证非常重要。这包括告诉它训练集和测试集中的每一行。

使用列表推导式生成一个与我们的 X_tr 数据长度相同的列表,其中每个值要么是 -1,要么是 0。

使用此列表向 GridSearchCV 指示每个标记为 -1 的行在训练集中,每个标记为 0 的行在验证集中。将此列表称为 split_index

现在,从 sklearn.model_selection 包中导入一个名为 PredefinedSplit 的新函数。PredefinedSplit 提供预定义的训练/测试索引,以使用预定义方案将数据分割为训练集和测试集。

下一步与你之前所做的几乎相同。搜索所有相同的超参数,并保持语法与交叉验证时相同。

但现在,将新的 split_index 列表传递给 PredefinedSplit 并将其分配给一个变量。我们称这个变量为 custom_split。最后,将网格搜索的 cv 参数设置为 custom_split

现在,是时候拟合模型了。使用 %%time 魔法命令来获取模型训练所需的时间。

在这个示例场景中,模型训练只花了大约四分钟。在交叉验证期间,训练数据被分成五折。使用特定的超参数组合在数据的四折上生长一个树集成,并用被保留的第五折对其进行验证。这个过程对五个保留折中的每一个都发生一次。然后使用下一个超参数组合训练另一个集成,重复整个过程。这一直持续到没有更多的超参数组合需要运行为止。

但现在有一个独立的保留集用于验证。为每个超参数组合构建一个集成。每个集成在新的训练集上训练,并在验证集上进行验证。但这对于每个超参数组合只发生一次,而不是像交叉验证那样发生五次。这就是为什么训练时间只有原来的五分之一。


再次保存并评估模型

现在,再次保存模型。运行写入 pickle 的单元格。然后返回并注释掉拟合模型的代码行以及对写入 pickle 的调用。记得要有一个可以读回 pickled 模型的单元格。

检查结果。当你调用 best_params_ 时,请注意,具有最佳 F1 分数的集成所使用的超参数与交叉验证模型略有不同。

现在,F1 分数是 0.576,优于单个决策树模型,但不如交叉验证模型。两者都可能产生相似的结果,但请记住,交叉验证模型更可靠一些,因为它经过了更严格的验证。

事实上,如果使用不同的随机种子来创建验证集,我们可能运气好,甚至得到一个比交叉验证模型表现稍好的模型。

但请注意,这并不意味着它在测试数据上的预期表现会更好。

本笔记本的目的是演示使用交叉验证和独立数据集验证随机森林模型所涉及的不同过程。

在实践中,你不太可能同时使用两种方法。相反,根据时间要求、数据量以及要探索的不同超参数组合的数量来选择一种方法会更有效。

一如既往,数据专业人员所做的工作需要深思熟虑的权衡和适应性。


总结

本节课中我们一起学习了如何保存和加载机器学习模型,以及如何使用一个独立的验证数据集来构建和评估随机森林模型。我们比较了交叉验证与使用独立验证集在流程和结果上的差异,并理解了在实际工作中根据具体情况选择合适验证策略的重要性。

048:AdaBoost提升算法入门 🚀

在本节课中,我们将学习一种强大的集成建模方法——提升(Boosting),特别是其经典实现之一:自适应提升(AdaBoost)。我们将了解其工作原理、与随机森林的区别,以及它的优缺点。


上一节我们介绍了随机森林这种并行构建的集成方法。本节中,我们来看看另一种思路迥异但同样强大的集成技术——提升(Boosting)。

提升是预测建模领域中最强大的方法之一,被几乎所有依赖预测建模的行业所使用。许多Kaggle等竞赛的获胜模型都采用了提升算法,它是任何建模者工具箱中的必备工具。

提升是一种监督学习技术,通过顺序构建一系列弱学习器来形成一个集成模型。每一个后续的基础学习器都试图纠正前一个学习器的错误。请记住,弱学习器是指其预测仅比随机猜测稍好一点的模型,而基础学习器是集成中的任何一个独立模型。

这种方法与随机森林和袋装法有相似之处。和随机森林一样,提升也是一种集成技术,它也构建许多弱学习器,然后聚合它们的预测。但存在一些关键差异。

与随机森林并行构建基础学习器不同,提升是顺序构建学习器的。这是因为序列中的每个新基础学习器都专注于前一个学习器预测错误的样本。

提升模型与随机森林的另一个区别是,对于提升模型,你为弱学习器选择的方法并不仅限于基于树的方法。然而,在本课程中我们将使用基于树的实现,因为这是构建提升模型常见且有效的方式。

有多种不同的提升方法可用。在本课程的这一部分,我们将探讨两种最常用的方法。第一种称为自适应提升(AdaBoost)。

AdaBoost是一种基于树的提升方法,其中每一个后续的基础学习器会为前一个学习器错误预测的观测值分配更大的权重。

以下是其工作原理的演示:
AdaBoost在训练数据上构建第一棵树,该树为每个观测值分配相等的权重。
然后,算法评估哪些观测值被这第一棵树错误预测。
它会增加第一棵树预测错误的观测值的权重,并减少预测正确的观测值的权重。
这个过程不断重复,直到某棵树做出完美预测,或者集成达到最大树的数量(这是一个由数据专业人员指定的超参数)。

一旦所有树都构建完成,集成模型通过聚合集成中每个模型的预测来做出最终预测。由于AdaBoost可用于分类和回归问题,这最后一步根据处理的问题类型略有不同。

对于分类问题,集成使用一个加权投票过程。在最终聚合中,预测更准确的基础学习器拥有更重的权重。
对于回归问题,模型计算集成中所有树预测的加权平均值

关于提升,有一个缺点需要注意:你无法在许多不同的服务器上并行训练模型,因为集成中的每个模型都依赖于它前面的模型。这意味着,在计算效率方面,与袋装法相比,它不太能很好地扩展到非常大的数据集。然而,除非你处理的是特别大的数据集,否则这通常不是问题。

但提升有许多值得注意的优点,包括它是当今可用的更准确的方法之一。此外,就像随机森林一样,它基于弱学习器集成这一事实意味着高方差问题得到了减少,因为没有单棵树在集成中占过大的权重。

以下是提升的一些关键优势:

  • 减少偏差:与随机森林不同,提升还能有效减少模型的偏差。
  • 易于理解:模型原理相对直观。
  • 无需数据缩放:不需要对数据进行缩放或标准化。
  • 处理混合特征:可以同时处理数值型和类别型特征。
  • 容忍共线性:即使在特征间存在多重共线性的情况下也能良好运行。
  • 对异常值稳健:对异常值具有鲁棒性。

需要注意的是,对异常值的鲁棒性是所有基于树的方法的一个主要优势。这是因为无论一个值多么极端,模型都以相同的方式分割数据。

这里有一个例子:假设你有六头大象,3头是雌性,体重分别为2250、3000、3000公斤;3头是雄性,体重分别为4000、4500和5000公斤。如果你用这些数据生成一棵决策树,它会在3500公斤处(最重雌性和最轻雄性体重的中点)划出雄性和雌性的决策边界。现在,假设最后一头雄性大象不是5000公斤,而是10000公斤。你的模型仍然会在3500公斤处划分雄性和雌性。最后一头大象的体重翻倍并不影响决策边界。


本节课中我们一起学习了AdaBoost提升算法。我们了解到,提升是一种顺序构建弱学习器集成的强大技术,每个新模型都专注于纠正前序模型的错误。AdaBoost通过动态调整样本权重来实现这一点。虽然其顺序训练的特性可能影响大规模数据下的计算效率,但它在准确性、减少偏差和方差、以及对数据预处理要求低等方面表现卓越,是机器学习实践者不可或缺的工具。

049:梯度提升机 🚀

在本节课中,我们将要学习梯度提升机(Gradient Boosting Machine, GBM)的核心概念、工作原理、优势与局限性。梯度提升是一种强大的集成学习技术,通过顺序构建模型来提升预测性能。


从AdaBoost到梯度提升 🔄

上一节我们介绍了AdaBoost,它是一种通过调整样本权重、让后续模型专注于前序模型错误预测的集成技术。

本节中我们来看看梯度提升。梯度提升与AdaBoost不同,它不直接为错误预测分配权重,而是让序列中的每个基学习器去预测前一个模型的残差(预测误差)。


梯度提升的工作原理 🛠️

以下通过一个回归决策树的例子,逐步演示梯度提升的工作流程。

  1. 初始训练:我们拥有特征 X 和连续型目标变量 Y。首先在原始数据 (X, Y) 上训练第一个基学习器(例如决策树),我们称之为 Learner 1
  2. 计算残差:Learner 1 做出预测 Ŷ₁。其预测的残差 error₁ 通过从真实值中减去预测值得到:error₁ = Y - Ŷ₁
  3. 训练后续学习器:接下来,我们使用相同的特征 X,但将目标变量替换为前一个学习器的残差 error₁,来训练第二个基学习器 Learner 2。这意味着 Learner 2 的学习目标是预测 Learner 1 犯下的错误。
  4. 迭代过程:Learner 2 对残差进行预测,得到 error₁_hat。然后计算 Learner 2 的预测与真实残差 error₁ 之间的新残差 error₂。此过程可以重复进行,直到达到预设的基学习器数量。
  5. 集成预测:最终,对于任何新的输入 X,集成模型的预测是所有基学习器预测值的总和。例如,使用三个学习器时,最终预测为:Ŷ_final = Ŷ₁ + error₁_hat + error₂_hat

使用梯度提升的集成模型被称为梯度提升机(GBM)


梯度提升机的优势 ✅

以下是GBM被广泛使用的主要原因:

  • 高准确性:梯度提升模型在许多机器学习竞赛中因其卓越的准确性而屡获佳绩。
  • 良好的可扩展性:尽管基学习器是顺序构建的,无法像随机森林那样并行训练,但GBM依然能很好地处理大规模数据集。
  • 处理缺失值:GBM将特征值的缺失本身视为有价值的信息,在决定如何分割特征时,会像处理其他值一样处理缺失值,这使其易于处理混乱的数据。
  • 无需数据缩放:基于树模型的特性,GBM不需要对数据进行标准化或归一化。
  • 对异常值鲁棒:树模型对异常值不敏感,GBM继承了这一优点。

梯度提升机的局限性 ⚠️

尽管强大,GBM也存在一些缺点:

  • 超参数众多:GBM拥有大量超参数(如树的数量、深度、学习率等),调优过程可能非常耗时。
  • 可解释性差:GBM通常被视为“黑盒模型”。它可以提供特征重要性评分,但不像线性模型那样能给出明确的系数和方向性解释,这在需要模型可解释性的领域(如医疗、金融)可能是个问题。
  • 外推能力有限:GBM难以预测训练数据范围之外的新值。例如,如果训练数据中面包价格在1到3美元之间,一个训练良好的线性模型可以合理推断10个面包的价格,而GBM则可能无法做出可靠预测。
  • 容易过拟合:如果训练不谨慎(例如,树生长过深或学习率不当),GBM很容易对训练数据过拟合,导致在未见数据上泛化性能下降。

总结 📚

本节课中我们一起学习了梯度提升机(GBM)。我们了解了它与AdaBoost的核心区别在于通过拟合残差来顺序构建模型。我们探讨了GBM的工作流程、其在高准确性和处理复杂数据方面的显著优势,同时也指出了它在超参数调优、模型解释性和外推能力方面的挑战。掌握这些知识将帮助你在合适的场景下有效地应用这一强大的机器学习工具。


你正在出色地充实你的数据科学工具箱。我们一起探索的所有内容都在为你激动人心的职业生涯奠定基础。请继续保持出色的学习状态!😊

050:调整GBM模型 🎯

在本节课中,我们将学习如何调整梯度提升机(GBM)模型的关键超参数,以构建更准确、泛化能力更强的预测模型。我们将重点介绍XGBoost这一流行实现中的核心参数及其作用。


许多机器学习包都包含我们之前探讨过的提升模型的实现。由于最流行的提升模型使用基于树的学习器,因此它们大多具有与决策树相同的可调超参数。它们也与随机森林类似,拥有控制整个集成模型的额外超参数。本节视频将探讨其中一些超参数,以便您能够构建出与数据拟合良好且预测准确的模型。

从此刻起,我们将使用的GBM建模实现称为XGBoost。XGBoost代表极端梯度提升,在预测建模领域被广泛使用。作为数据专业人士,您很可能会经常遇到它。虽然Scikit-learn有自己的GBM实现且与之相似,但XGBoost是一个常用的梯度提升包,具有许多有用的优化功能。这些优化包括快速训练、有效的特征正则化以及可调的超参数,这些都能改进模型预测。

上一节我们回顾了集成模型的基础,本节中我们来看看如何具体调整GBM模型。

以下是XGBoost中几个关键的超参数及其调整方法:

1. 最大深度 (max_depth)
此参数在决策树和随机森林中均有使用,在XGBoost中功能相同,即控制每个基学习器(树)的生长深度。寻找最佳值的最佳方法是通过交叉验证。模型的最终max_depth值通常较低。请记住,树越深,模型学到的特征交互可能越特定于训练数据,但泛化到新信息的能力可能越差。由于集成效应,即使是浅树也很有威力。max_depth的典型值在2到10之间,但这取决于数据中的特征数量和观测值数量。

2. 估计器数量 (n_estimators)
此参数是集成模型将生长的估计器或基学习器的最大数量。最佳值应使用网格搜索确定。对于较小的数据集,更多的树可能比更少的树更好;对于非常大的数据集,情况可能相反。典型范围在50到500之间。

3. 学习率 (learning_rate)
这是一个非常重要的参数。您会记得,每次集成模型构建一个新的基学习器时,它都会根据前一个模型的误差来拟合数据。在基础实现中,所有树的预测结果会被求和以确定最终预测,此时每棵树的预测对最终预测的贡献被视为同等重要。在实践中,我们使用学习率来指示模型应给予每个后续基学习器预测多少权重。低学习率意味着每棵后续树对集成模型最终预测的贡献较小,这有助于防止过度校正和过拟合。这个概念另一个常见的名称是“收缩”,因为在最终的集成中,每棵连续树的预测被赋予的权重越来越小。如果您使用较低的学习率,您的模型通常需要更多的树来补偿。同样,最佳值应通过网格搜索确定。典型值范围从0.01到0.3。

4. 最小子节点权重 (min_child_weight)
我们考察的最后一个超参数与决策树中的min_samples_leaf非常相似,但名称不同。它被称为min_child_weight。如果一个节点的分裂会导致任何子节点的权重低于您在此超参数中指定的值,那么树将不会分裂该节点;相反,该节点将变为叶节点。这是一个正则化参数,因此过高的值会导致模型欠拟合数据。此设置的取值范围是0到无穷大。如果设置在0到1之间,算法会将其解释为数据的百分比。例如,0.1意味着一个节点不能分裂,除非其每个子节点拥有的训练观测值大于或等于10%。通常,大于1的值可视为子节点中观测值的数量。例如,值10意味着任何子节点包含的观测值不能少于10个。


我们已接近本课程的尾声,您已经学到了很多知识。请充分利用课程资源,并随时可以回看任何视频以持续练习。

在本节课中,我们一起学习了调整XGBoost GBM模型的四个核心超参数:max_depthn_estimatorslearning_ratemin_child_weight。理解并合理调整这些参数,对于构建一个既强大又不易过拟合的梯度提升模型至关重要。

051:使用Python构建XGBoost模型 🚀

在本节课中,我们将学习如何使用Python构建并调优一个XGBoost分类模型。我们将使用这个模型来比较之前所有模型的性能,并最终选择一个最佳模型。


数据准备与库导入

上一节我们介绍了多种机器学习模型,本节中我们来看看如何实现一个强大的集成模型。首先,我们需要导入必要的库并准备数据。

我们使用与之前模型相同的大部分库、包和函数,包括NumpypandasMatplotlibpickle、所有模型评估指标、网格搜索和训练测试分割函数。此外,我们有两个新的导入:XGBClassifierplot_importance,它们都来自XGBoost库。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pickle
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from xgboost import XGBClassifier, plot_importance

数据方面,我们继续使用银行客户流失数据集。请注意,某些列已被删除,包括customer_idgender。同时,geography列已进行了虚拟编码。


划分训练集与测试集

与之前保持一致,我们将特征和目标数据分别赋值给变量Xy

X = data.drop(columns=['Exited'])
y = data['Exited']

然后,使用train_test_split函数将数据分割为训练集和测试集。我们基于目标变量进行分层抽样,并设置与之前模型相同的测试集大小和随机种子。这有助于在评估模型性能时进行直接比较。

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

使用网格搜索调优模型

现在,我们开始建模。我们将使用网格搜索来调优一些关键的超参数。

以下是网格搜索将遍历的参数值,我们将其定义为一个名为cv_params的字典:

cv_params = {
    'max_depth': [3, 5, 7],
    'min_child_weight': [1, 3, 5],
    'learning_rate': [0.01, 0.1, 0.2],
    'n_estimators': [100, 200, 300]
}

接下来,实例化分类器。注意,objective参数被设置为binary:logistic。这意味着模型执行的是输出逻辑概率的二元分类任务。对于不同类型的问题(例如多分类或连续数据的线性回归),目标函数会有所不同。

xgb = XGBClassifier(objective='binary:logistic', random_state=42)

我们设置与随机森林相同的评估指标:准确率、精确率、召回率和F1分数。

scoring = {'accuracy', 'precision', 'recall', 'f1'}

最后,实例化网格搜索。记住将refit参数设置为'f1',这告诉网格搜索在完成搜索后,重新拟合具有最佳平均F1分数的模型。

grid_search = GridSearchCV(estimator=xgb, param_grid=cv_params, scoring=scoring, cv=5, refit='f1')

现在,将模型拟合到训练数据上。我们可以使用%%time魔法命令来输出单元格运行所需的时间。

%%time
grid_search.fit(X_train, y_train)

在这个示例场景中,运行耗时9分45秒。


保存模型与性能比较

模型训练完成后,我们使用pickle将其保存。

with open('xgb_model.pkl', 'wb') as f:
    pickle.dump(grid_search.best_estimator_, f)

也可以使用在其他笔记本中构建的模型。例如,要使用随机森林模型,可以使用另一个with open语句将其导入到此笔记本中。

with open('rf_model.pkl', 'rb') as f:
    rf_cv = pickle.load(f)

现在,通过比较新XGBoost模型和之前随机森林模型的best_score_属性来对比模型性能。在本例中,XGBoost以微小的优势(仅0.003)超越了交叉验证的随机森林模型。

接下来,使用之前创建的make_results函数为此模型生成结果表,并将其附加到总体结果表中。这样可以方便地比较所有模型的分数。

以下是按F1分数降序排列的结果表:

模型 准确率 精确率 召回率 F1分数
XGBoost 0.863 0.772 0.503 0.608
随机森林 0.862 0.769 0.498 0.605
逻辑回归 0.811 0.634 0.221 0.327
决策树 0.791 0.514 0.514 0.514
朴素贝叶斯 0.697 0.365 0.771 0.495

该表清楚地显示,在F1分数指标上,我们的XGBoost模型优于所有其他模型。


在测试集上评估模型

现在,是时候评估性能更优的XGBoost模型在测试集上进行预测时的表现了。

使用网格搜索的predict方法对X_test数据进行预测,并将结果赋值给变量。

y_pred = grid_search.predict(X_test)

然后,将这些预测值与y_test中包含的实际值进行比较,并生成评估指标。

test_accuracy = accuracy_score(y_test, y_pred)
test_precision = precision_score(y_test, y_pred)
test_recall = recall_score(y_test, y_pred)
test_f1 = f1_score(y_test, y_pred)

结果显示,模型在测试数据上的所有四个指标上都比在验证数据上表现得更好。虽然存在这种可能性,但如果你的模型在测试数据上表现稍差,也无需惊慌,毕竟测试数据是模型完全未见过的。


模型解释与业务建议

成功的数据专业人士知道,工作不会仅仅因为产生了一个具有有效性能指标的模型而结束。同样重要的是解释该模型,并根据发现提出建议。

例如,混淆矩阵在评估模型的变量和特征时非常有帮助。在我们的模型中,测试数据有2500人,其中509名客户离开了银行。我们的模型捕捉到了其中的256人。

混淆矩阵表明,当模型出错时,通常是第二类错误。换句话说,它给出了假阴性,未能预测客户会离开。另一方面,它犯的第一类错误(假阳性)要少得多。

这些结果是否可以接受,取决于为防止客户离开所采取措施的成本与保留客户的价值之间的权衡。在这种情况下,银行领导者可能决定他们宁愿有更多的真阳性,即使这意味着也会捕获更多的假阳性。如果是这样,也许仅基于F1分数优化模型是不够的,我们可能需要重新训练模型以专注于召回率。

可以肯定的是,我们的模型对银行有帮助。考虑一下如果决策者什么都不做会有什么结果:他们预计会失去509名客户。或者,他们可以给每个人激励以留住他们,但这将花费银行为我们测试集中所有2500名客户支付成本。最后,银行可以随机提供激励,比如抛硬币。这样做会激励到与我们模型选择的真响应者数量大致相同的人,但银行会浪费大量资金向那些不太可能离开的人提供激励。而我们的模型非常擅长识别这些客户。


特征重要性分析

另一种帮助解释我们模型的方法是检查最重要的特征。XGBoost为我们提供了一个非常有用的函数plot_importance,可以让我们观察模型的相对特征重要性。

导入该函数后,我们可以通过将网格搜索中的best_estimator_传递给它来输出条形图。

plot_importance(grid_search.best_estimator_)
plt.show()

在我们的模型中,估计薪资、余额、信用评分和年龄是预测客户是否会离开的首要因素。此时,返回去针对这些特征进行另一轮探索性数据分析可能很有用。你可能还想将gender列以及最终模型的预测列添加回原始数据中,这将允许你衡量模型在不同报告的性别身份之间错误分布的均匀程度。


总结

本节课中我们一起学习了如何构建、调优和评估一个XGBoost分类模型。我们从数据准备开始,使用网格搜索进行超参数调优,并将XGBoost的性能与之前的模型(如随机森林、逻辑回归等)进行了比较。我们发现XGBoost在F1分数上表现最佳。接着,我们在未见过的测试集上评估了模型,并讨论了模型结果的业务解释和特征重要性。

从线性回归、逻辑回归到朴素贝叶斯、决策树、随机森林和XGBoost,你现在已经掌握了一套强大的工具。它们将帮助你在激动人心且回报丰厚的数据职业领域中脱颖而出。🚀

052:《机器学习的基础知识》课程总结 🌳

在本节课中,我们将回顾并总结整个课程中关于树模型及其集成方法的核心知识。我们将梳理从决策树基础到高级集成技术的学习路径,并强调这些模型在实际数据科学工作中的重要性。


课程核心内容回顾 📚

在整个课程学习的所有模型中,基于树的建模技术将成为你数据旅程中最常使用的工具之一。

在本课程的这个部分,你了解了为什么基于树的模型通常比其他监督学习技术(如朴素贝叶斯和逻辑回归)更受青睐。

决策树基础

从那里开始,你探索了决策树。你学习了它们的工作原理、如何构建它们,以及如何使用它们来对未来事件进行预测。

决策树的核心是通过一系列if-then规则对数据进行分割。一个简单的伪代码表示其预测过程:

if feature_1 > threshold_1:
    if feature_2 <= threshold_2:
        return class_A
    else:
        return class_B
else:
    return class_C

超参数调优

接着,你考虑了决策树的超参数调优。你学习了最大深度(max_depth)叶节点最小样本数(min_samples_leaf),理解了改变这些超参数如何影响模型的训练过程,进而影响模型的性能。

超参数 max_depth 控制了树生长的最大深度,防止过拟合。公式上,它限制了决策树中从根节点到最远叶节点的路径长度。

集成学习

然后,你探索了一些更高级的基于树的建模主题,例如集成学习。其中两种技术——装袋法(Bagging)和提升法(Boosting)——使得多个决策树能够协同工作,产生比任何单一树都更好的模型。

你实现了最流行的装袋方法之一:随机森林(Random Forests),并观察了这种技术与单一决策树的比较结果。

以下是构建随机森林的关键步骤:

  1. 从原始数据集中进行有放回抽样,创建多个自助样本集。
  2. 为每个样本集训练一棵决策树,且在每次分裂时仅考虑特征的一个随机子集。
  3. 对所有树的预测结果进行投票(分类)平均(回归) 以得到最终预测。

提升方法

之后,你学习了几种提升方法,并理解了两种流行的途径:自适应提升(AdaBoost)梯度提升(Gradient Boosting)。在了解了它们的差异和独特优势后,你在Python中实现了它们,并再次见证了它们与随机森林和单一决策树的比较。

自适应提升的核心思想是增加被错误分类样本的权重。其模型更新公式可以简化为:
F_{m}(x) = F_{m-1}(x) + α_m * h_m(x)
其中,F_{m}(x) 是第m轮迭代后的集成模型,α_m 是第m个弱学习器的权重,h_m(x) 是第m个弱学习器。


集成方法的调优与影响 ⚙️

对于每一种集成方法,你都发现了超参数调优如何发挥作用。

虽然这对单一决策树的改进相对较小,但你观察到调优超参数(例如学习率(learning_rate)估计器数量(n_estimators))如何能够将一个集成学习模型从“良好”提升到“优秀”。

学习率 η(eta)在梯度提升中控制着每棵树对最终模型的贡献程度,更新规则为:
F_{m}(x) = F_{m-1}(x) + η * γ_{lm} * I(x ∈ R_{lm})
其中 γ_{lm} 是叶节点区域 R_{lm} 的最优值。


总结与展望 🚀

本节课中,我们一起学习了基于树的机器学习模型的核心知识体系。

这些模型是当今数据科学领域最前沿的技术之一。你通过这些工具获得的技能绝对能让你在潜在雇主面前脱颖而出。你所学的知识也将扩展你的数据科学教育,并作为一个发射台,助你真正腾飞进入数据世界。


本节课中我们一起学习了:

  1. 决策树的基本原理、构建与预测方法。
  2. 通过 max_depthmin_samples_leaf 等关键参数进行模型调优。
  3. 集成学习的强大之处,特别是装袋法提升法
  4. 随机森林的具体实现及其优势。
  5. 自适应提升(AdaBoost)梯度提升(Gradient Boosting) 的原理与比较。
  6. 集成模型中超参数调优(如学习率、估计器数量)的关键作用及其对模型性能的显著提升。

掌握这些内容,为你运用强大的树模型解决复杂的现实世界问题奠定了坚实的基础。

053:项目实战指南 🚀

在本模块中,我们将综合运用课程所学的知识,完成一个完整的机器学习项目。这个项目将帮助你巩固所学概念,并创建一个可以展示给潜在雇主的作品集。

项目概述与目标 🎯

很高兴再次与你相见。你可能在上一个课程中认识了我,我是Tiffany。现在,是时候完成一个作品集项目,并应用你在这门课程中学到的所有知识了。

与之前的课程一样,这个作品集项目将指导你完成一系列任务,并创建能够展示你技能的成果物。在面试中,你可能会被问到一些测试你对不同机器学习模型理解程度的问题。此外,在你的简历中拥有项目经验,可以帮助你在招聘经理面前脱颖而出,从而获得面试机会。在面试过程中,你可以依靠你的作品集来讨论数据科学,或者更具体地解释建模策略。

为了完成这个作品集项目,你将获得一些商业案例的详细信息。你需要选择其中一个案例,并按照指导说明,在你的PA策略文档中创建一个新条目,同时构建机器学习模型来解决该问题。完成这个项目后,你将拥有可以添加到作品集里的机器学习模型。

至此,你即将完成本课程,并且已经掌握了完成此项目所需的一切知识。你正在数据专业人士的职业道路上稳步前进。

项目核心任务 📋

在这个项目中,你将运用本课程学到的模型来解决一个数据问题,然后按照PACE工作流程提出商业建议。你将创建一个计划,并清晰地阐述你完成项目的整个过程。

以下是项目的主要步骤:

  1. 选择商业案例:从提供的案例中选择一个你感兴趣的问题。
  2. 制定项目计划:在你的PA策略文档中规划你的方法。
  3. 构建机器学习模型:应用合适的算法来解决问题。
  4. 评估与优化:分析模型性能并进行必要的调整。
  5. 形成商业建议:基于模型结果,提出可执行的建议。
  6. 整理项目文档:确保你的过程和结果清晰、可复现。

项目启动 🚦

准备就绪。那么,让我们开始吧。


在本节课中,我们一起学习了如何启动和规划你的机器学习作品集项目。我们明确了项目的目标、核心任务以及它对职业发展的重要性。接下来,你需要选择一个具体的商业案例,并开始应用你所学的知识,一步步构建解决方案。记住,清晰的过程记录和有效的沟通与模型本身同样重要。祝你项目顺利!

054:用独特解决方案打动面试官 🎯

在本节课中,我们将学习如何在技术面试中脱颖而出,特别是通过展示独特的解决方案和清晰的问题解决能力来打动面试官。课程内容基于谷歌团队领导者的面试经验。

概述

我是穆伊,在谷歌领导分析团队,负责管理数据科学家和产品分析师。多年来,我面试过超过500人。我始终寻找的是解决问题的能力。

面试的核心:展示解决问题的能力

上一节我们介绍了面试官的基本期望,本节中我们来看看如何具体展示你的能力。

面试时,我经常会询问你做过的一个项目。我们会深入探讨,我会询问细节。这是一个你花费了大量时间、反复推敲、并从不同角度审视过的项目。我希望在听你讲述的几秒钟内,我无法想出比你更好的答案。

因此,请务必选择你非常了解、几乎可以教给我的项目。如果你能给我带来一些新的、不显而易见的见解,那对我来说就是一个神奇的时刻。你真正需要展示的是你解决问题的能力。你接手了某个问题,深入思考,提出了原创性的方案,并且能够清晰地传达出来。

关键要素:问题界定与沟通

以下是面试中需要关注的两个核心要素。

1. 问题界定
我希望看到你如何界定一个问题。界定问题关乎于:什么是最佳方案?我如何衡量它?我如何找到数据来帮助我?你必须集中精力。我希望你的项目专注于某个有趣且重要的点。

2. 有效沟通
这一点至关重要,必须能够被有效传达。在我看来,最好的方式是可视化。你需要展示所有这些如何转化为我能理解的东西。如果你能提出一个别人没有做过的东西,或者用一种独特的方式解释它,这总会让你脱颖而出。

面试官寻找的特质

以下是我在面试中始终寻找的几个特质。

  • 解决难题的简单方案:针对核心难题的简单解决方案。如果问题太复杂,我可能无法处理。所以,我喜欢那些并非显而易见、但能真正解决难题的简单方案。
  • 独特的视角或方法:能够带来新颖见解或解释方式的能力。
  • 清晰的逻辑和表达:将复杂问题转化为易于理解内容的能力。

专业建议:拥抱不适感

这里有一个专业建议:如果你能适应感到不适的状态,那么你的成长将是无限的。这正是你应该追求的境界。这意味着你正在走出舒适区,去做那些真正重要的事情。

总结

本节课中我们一起学习了如何在技术面试中有效展示自己。关键在于选择你深入理解的项目,清晰地界定问题,并通过可视化等独特方式进行有效沟通,最终展示你解决复杂问题的原创能力。记住,拥抱挑战和不适是持续成长的关键。

055:《机器学习的基础知识》课程期末项目介绍 🎯

在本节课中,我们将学习如何整合本课程所学的知识,完成一个综合性的期末项目。我们将回顾监督学习和无监督学习模型的核心概念,并了解如何应用PACE工作流程来解决一个实际的商业问题。


在本课程中,你学习了监督式和非监督式机器学习模型,了解了它们的工作原理以及如何在Python中构建它们。

在之前的课程中,你练习了构建、解释和评估回归模型。到目前为止,你也一直在努力培养Python数据可视化和统计方面的技能。

现在,是时候整合所有这些知识来完成这个期末项目了。

以下是项目的主要组成部分:

  • 商业问题与数据集:你将获得一个商业问题和一个数据集。
  • PACE工作流程:你将遵循PACE工作流程来制定计划、构建机器学习模型、记录你的工作,并选择能最好解决问题的模型。
  • 模型类型:你构建的所有模型都将是本课程中学过的模型,可能包括朴素贝叶斯、决策树、随机森林、XGBoost,甚至K-Means聚类。

上一节我们介绍了项目的整体框架,本节中我们来看看模型评估的关键环节。

你还需要选择一个合适的评估指标来衡量模型的性能。

正如你在本课程中学到的,数据专业人员通过分析和发现数据中的模式,来确定解决商业问题所需的最合适的模型。

然后,他们需要向同事和利益相关者沟通他们的工作和建议。

请记住,构建这些模型需要一些耐心。你在技能培养方面做得非常出色,这些技能在你完成本项目时肯定会派上用场。

如果你需要复习任何内容,请随时返回观看其他视频或查阅课程材料。


本节课中我们一起学习了期末项目的目标、流程和关键组成部分。我们回顾了需要应用的机器学习模型类型,并强调了遵循PACE工作流程、进行模型评估和有效沟通的重要性。现在,你可以运用所学的全部技能来迎接这个综合挑战了。

056:《机器学习的基础知识》课程总结与职业建议 🎓

在本节课中,我们将对课程项目进行总结,并探讨如何将所学知识应用于未来的职业面试与持续成功。我们将回顾你已完成的成果,并讨论如何向潜在雇主展示你的技能与经验。


项目成果回顾 📊

在课程进展至此阶段,你已经涵盖了众多主题。这些主题包括理解数据职业领域、Python编程、数据可视化、统计学、建模等。你的作品集中包含了用于解决特定问题的机器学习模型,并且你的PACE策略文档也新增了条目,用于详细解释你在项目每个阶段的工作。

通过课程的每一步,你创建了多个可加入作品集的成果,这些成果展示了你的知识与技能。你有很多值得自豪的成就。


在面试中展示你的工作 💼

有多种方式可以在未来的面试中向潜在雇主和招聘经理突出展示你的工作并解释你所完成的内容。

正如之前提到的,你需要在面试中留出时间讨论你学到的工具、你培养的可迁移技能以及你在本课程中的经历。

作为一名数据专业人士,你可能需要在工作中学习和适应新工具,正如我们在本课程中所展示的那样。市面上有许多优秀的工具,不同的企业根据其需求会使用不同的工具和技能。

在申请工作时,请记住,你已经学到了许多可以跨不同工具应用的可迁移技能。


核心机器学习概念的面试应用 🤖

在本课程中,我们讨论了根据待解决的问题和可用数据来确定最合适模型的重要性。在此过程中,你发现可以使用不同的机器学习模型来帮助寻找业务解决方案。

你还认识到,在使用机器学习模型时,解释你的工作流程非常重要。

在面试中,你可能会被问到以下问题:

  • 如何使用监督学习模型来解决业务问题?
  • 如何使用不同的机器学习模型来帮助你找到业务解决方案?
  • 为什么在使用机器学习模型时解释你的过程很重要?

我鼓励你运用在本课程中学到的知识来开始回答这些问题。当然,面试中可能还会有其他讨论点。


期末项目总结与技能整合 🔗

在你刚刚完成的这个作品集项目中,你使用Python构建了不同的机器学习模型。这些模型帮助识别了针对独特业务挑战的潜在解决方案。

此外,你在PACE策略文档中记录了一个新条目,详细说明了你在该项目中的思考、考量和流程步骤。

我还想强调,这个项目建立在你随着课程进展所积累的知识之上。现在,你已经准备好承担数据专业人士的任务和职责了。


面向未来的准备:顶点课程与持续学习 🚀

提醒一下,你的面试官就像数据项目中的利益相关者一样,面临着一个业务挑战:他们有一个需要填补的职位空缺。思考一下,他们需要了解你的哪些信息才能做出解决该业务挑战的决定,就像你在每个作品集项目中一直在练习的那样。

在接下来的顶点课程中,你将整合整个课程的所有内容和技能,并将它们应用到一个项目中。这将是一个机会,让你运用早期课程中每个作品集项目的技能来解决一个新的业务问题。这将为你提供更多可以加入作品集的成果。


总结 📝

本节课中,我们一起回顾了你在《机器学习的基础知识》课程中取得的成就,包括构建的机器学习模型和更新的项目文档。我们探讨了如何在职业面试中有效地展示这些技能和经验,强调了解释工作流程和展示可迁移能力的重要性。最后,我们展望了顶点课程,它将是整合所有所学、解决新挑战的最终舞台。持续构建你的作品集,清晰阐述你的思考过程,这将为你的数据职业道路奠定坚实的基础。

057:《机器学习的基础知识》课程总结 🎓

在本节课中,我们将回顾并总结《机器学习的基础知识》这一章节的核心内容。我们学习了机器学习的基础概念、不同类型的模型、构建模型的完整工作流程,以及一些关键的建模技术。现在,让我们一起来梳理这些知识点。


课程内容回顾 📚

恭喜你,你已经完成了本课程最后一个教学部分,准备好进入你的毕业项目了。在最后的这个章节中,你学到了非常多的知识,现在可以带着这些新知识,在你的数据之旅中继续前进。无论你的下一步是继续深造,还是将所学应用于工业界,你现在都已经拥有了一个可以继续构建或使用的全面基础。

上一节我们介绍了机器学习的基础,本节中我们来回顾整个学习路径。

机器学习的基石

我们从这个章节开始,学习了机器学习的基础,重点是数据专业人员可以使用的不同类型模型。你看到了不同类型的业务需求如何需要不同类型的模型。此外,你还学习了推荐系统以及这类模型最常见的用例,以及不同的流行技术及其优缺点。

以下是本阶段的核心模型类型:

  • 监督学习模型:用于预测或分类任务。
  • 无监督学习模型:用于发现数据中的模式或结构,如聚类。
  • 推荐系统:用于向用户推荐物品。

构建你的机器学习工具箱 🧰

从那里开始,你开始构建自己的机器学习工具箱。不同的集成开发环境、Python文件类型和面向数据的Python包共同为你提供了处理任何数据驱动问题所需的工具。

PACE工作流框架

PACE工作流是你运用这些工具的框架。通过花时间遵循计划、分析、构建和执行这些步骤,你可以确保保持在正轨上,从而构建出能够提供有意义结果的模型。

以下是PACE工作流的四个阶段:

  1. 计划:仔细审视业务需求和可用数据,并确定适合的模型类型。
  2. 分析:应用你在课程早期学到的许多探索性数据分析原则。
  3. 构建:引入并构建新的模型,并应用评估指标来衡量模型性能。
  4. 执行:执行任何需要的验证技术,进一步评估模型,并进行必要的调整以使其发挥最佳性能。

在分析阶段,你还学习了一个称为特征工程的新技术子集,它允许你以多种方式操作和准备数据以供建模。

深入无监督学习与基于树的模型

接下来,你更深入地研究了无监督学习模型。K均值是最广泛使用的无监督学习技术之一。在课程的这个部分,你构建了一个K均值模型,并使用常见的评估技术来充分理解其结果。

最后,你学习了基于树的建模。基于树的技术是当前业界存在的一些最有效的模型。你了解了单棵决策树的工作原理,从概念上学习了它们的功能,并亲自构建了一个。在此基础上,你被介绍了两种集成技术:装袋法和提升法。

在基于树的建模中,你看到了使用高级机器学习技术最重要的一个方面:超参数调优。这对于在工业界构建模型至关重要,它允许你优化模型以适应你的特定需求。


总结与展望 🚀

本节课中我们一起学习了机器学习的基础知识,包括模型分类、PACE工作流、特征工程、无监督学习(如K均值)以及强大的基于树模型及其集成与调优技术。

在接下来的部分,你将把在整个课程中学到的一切应用到一个毕业项目中,这将成为你作品集中非常宝贵的一部分。我们很快再见。😊

posted @ 2026-03-26 12:28  布客飞龙III  阅读(39)  评论(0)    收藏  举报