一个完整的机器学习项目在Python中的演练(二)

简介: 磐石大家往往会选择一本数据科学相关书籍或者完成一门在线课程来学习和掌握机器学习。但是,实际情况往往是,学完之后反而并不清楚这些技术怎样才能被用在实际的项目流程中。

磐石

大家往往会选择一本数据科学相关书籍或者完成一门在线课程来学习和掌握机器学习。但是,实际情况往往是,学完之后反而并不清楚这些技术怎样才能被用在实际的项目流程中。就像你的脑海中已经有了一块块”拼图“(机器学习技术),你却不知道如何讲他们拼起来应用在实际的项目中。如果你也遇见过同样的问题,那么这篇文章应该是你想要的。本系列文章将介绍一个针对真实世界实际数据集的完整机器学习解决方案,让您了解所有部分如何结合在一起。

本系列文章按照一般机器学习工作流程逐步进行:

  1. 数据清洗与格式处理
  2. 探索性数据分析
  3. 特征工程和特征选取
  4. 机器学习模型性能指标评估
  5. 微调最佳模型(超参数)
  6. 在测试集上评估最佳模型
  7. 解释模型结果
  8. 总结分析

通过完成所有流程,我们将看到每个步骤之间是怎么联系起来的,以及如何在Python中专门实现每个部分。该项目可在GitHub上可以找到,附实现过程。第二篇文章将详细介绍第三个步骤,其余的内容将在后面的文章中介绍。

特征工程和特征选择

特征工程和特征选择虽然是完成机器学习项目中很小的一个环节,但它模型最终的表现至关重要。在特征工程与特征选择阶段做的工作都会准时在模型的表现上得以体现。首先,让我们来了解一下这两项任务是什么:

  • 特征工程:特征工程是一项获取原始数据并提取或创建新特征的过程。也就是说可能需要对变量进行转换。例如通过取自然对数、取平方根或者对分类变量进行独热(one-hot)编码的方式以便它们可以在模型中更好的得以利用。通常来说,特征工程就是通过对原始数据的一些操作构建额外有效特征的过程。(可参考:https://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/
  • 特征选择:特征选择是一项选择数据中与任务最相关的特征的过程。在特征选择的过程中,我们通过删除无效或重复的数据特征以帮助模型更好地学习和总结数据特征并创建更具可解释性的模型。通常来说,特征选择更多的是对特征做减法,只留下那些相对重要的特征。(可参考:https://machinelearningmastery.com/an-introduction-to-feature-selection/

因为机器学习模型只能从我们提供的数据中学习特征,所以确保数据包含我们任务的所有相关信息至关重要。如果我们没有给模型提供正确的数据,那么机器学习模型将不会达到我们所期望的表现。

在本项目中,我们将按照以下步骤完成特征工程

  • 独热(one-hot)编码分类变量(borough(自治区)和 property use type(财产使用类型))
  • 对数值变量做自然对数转换并作为新特征添加到原始数据中

独热(one-hot)编码对于在模型训练中包含分类变量是必要的。例如:机器学习算法无法理解“办公室”这种建筑类型,因此如果建筑物是办公室,则必须对其进行将其记录为1,否则将其记录为0。

添加转换的特征可以使我们的模型学习到数据中的非线性关系。取平方根、取自然对数或各种各样的数值转换是数据科学中特征转换的常见做法,并通过领域知识或在多次实践中发现最有效的方法。这里我们将对所有数值特征取自然对数并添加到原始数据中。

下面的代码实现了数值特征选择并对这些特征进行了取对数操作,选择两个分类变量并对这些特征进行独热(one-hot)编码、然后将两列特征连接在一起。这一系列操作可以通过pandas库很快捷的实现。

完成上述操作之后,我们有110列(features)、总共超过11,000个对象(buildings)。但是,这些特征并非所有都能够对预测能源之星得分(ENERGY STAR Score)有用,所以接下来我们将通过特征选择去除一些变量。

特征选择

在上面做特征工程的过程之后得到的数据中的110列特征,许多都是多余或重复的,因为它们彼此高度相关。

例如,下图是Site EUI与Weather Norm EUI相关系数为0.997的情况。

那些相互之间有很强关联性的特征被称为共线(collinear)https://en.wikipedia.org/wiki/Multicollinearity,而且消除这些“特征对”中的一个变量通常可以使机器学习模型更鲁棒并且具有更强的可解释性。(需要注意的一点是,现在是在讨论特征与其他特征的相关性,而不是与目标的相关性。)

有许多方法可以计算特征之间的共线性(collinearity),其中最常见的是方差膨胀因子(VIF)。在本项目中,我们将使用相关系数来识别和删除共线特征。如果它们之间的相关系数大于0.6,我们将放弃一对特征中的一个。

也许你会认为这个值(0.6)是随便定义的,其实并不是,而是通过多次尝试不同的阈值比较后得到的。使用0.6这个值可以产生了最好的模型。机器学习是一个经验性领域,通常是通过试验发现性能最好参数组合。选择特征后,我们剩下64列特征和1列目标特征(能源之星得分)。

建立基线

我们现在已经完成了数据清洗,探索性数据分析和特征工程,开始建立模型之前还需要做最后一步:建立一个初步的基线(baseline)。这实际上是设置一项可以用来核对我们最终模型的实际表现的预估表现。我们可以通过拿最终模型表现与预估模型表现做比较反过来评测此次项目的整体思路。如果机器学习模型的最终表现没有超越我们的预估表现,那么我们可能不得不得出如下结论:

  • 使用机器学习的方法无法解决此问题。
  • 或者我们可能需要尝试其它不同的方法。

对于回归问题,一个合理的基线是通过预估测试集中所有示例的运行结果为训练集中目标结果的中值。这种方式建立的基线为对比模型表现结果设定了一个相对较低的门槛。

我们将使用的度量标准是平均绝对误差(mae)–计算出预测的平均绝对误差。其实存在很多种回归问题的度量指标,但我喜欢Andrew Ng的建议去选择一个指标然后一直在以后模型评估中使用它。平均绝对误差(mae)是一个不错的选择,它不仅容易计算并且可解释性强。

在计算基线之前,我们需要将我们的数据分成一个训练集和一个测试集:

  1. 训练集的作用就是通过给模型提供有标签的数据来训练模型能力,换句话说就是训练集既能“提供问题”又能“提供答案”。旨在让模型学习特征与目标之间的映射。
  2. 测试集的作用是用来评估训练好模型。评估过程中不允许模型查看测试集的标签,只能使用特征进行预测。我们可以通过对比测试集的预测值与标签真实值来评估模型的表现。换句话说就是测试集只“提供问题”给模型不“提供答案”。

我们将使用70%的数据进行训练,30%用于测试:

计算基线并得出预估表现值(mae):

通过计算得出预估模型表现为66,在测试集中的误差约为25左右(分值:1-100)。这是一个很容易达到的性能。

结论

在前两篇的分析中,我们走过了一个完整机器学习项目的前三个步骤。在明确定义问题之后,我们:

  1. 清洗并格式化了原始数据
  2. 执行探索性数据分析以了解数据集
  3. 转换出了一系列我们将用于模型的特征
  4. 建立了可以判断整个机器学习算法的基线。

接下来将展示如何使用Scikit-Learn评估机器学习模型,选择最佳模型和微调超参数来优化模型。

 

目录
相关文章
|
2天前
|
JSON 搜索推荐 API
Python的web框架有哪些?小项目比较推荐哪个?
【10月更文挑战第15天】Python的web框架有哪些?小项目比较推荐哪个?
10 1
|
5天前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
【10月更文挑战第12天】本文介绍了如何使用Python和Scikit-learn进行机器学习的基础知识和入门实践。首先概述了机器学习的基本概念,包括监督学习、无监督学习和强化学习。接着详细讲解了Python和Scikit-learn的安装、数据处理、模型训练和评估等步骤,并提供了代码示例。通过本文,读者可以掌握机器学习的基本流程,并为深入学习打下坚实基础。
11 1
|
6天前
|
机器学习/深度学习 API 计算机视觉
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(下)
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(下)
14 2
|
7天前
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
69 3
|
6天前
|
机器学习/深度学习 存储 算法
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(上)
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(上)
16 1
|
7天前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
本文介绍了如何使用Python和Scikit-learn进行机器学习的基础知识和实践。首先概述了机器学习的基本概念,包括监督学习、无监督学习和强化学习。接着详细讲解了Python和Scikit-learn的安装、数据处理、模型选择与训练、模型评估及交叉验证等关键步骤。通过本文,初学者可以快速上手并掌握机器学习的基本技能。
32 2
|
7天前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
20 1
|
8天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
22 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
6天前
|
机器学习/深度学习 算法框架/工具 Python
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
23 0
|
12天前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024