笔记一:机器学习工作流程

根据Geron (2019) 的Machine Learning Project Checklist,机器学习项目的流程结构如下:

  • 确定问题的整体框架,了解全局。
  • 获得数据。
  • 探索数据,洞察出数据特点。
  • 预处理数据,让机器学习算法能更好的作用于其底层的数据模式。
  • 试用多种不同的模型,找出效果最好的几个。
  • 调试这些模型并将它们组合成最终解答。
  • 展示最终的解答。
  • 启动,检测,维护这个系统。

我们统计学生反正没有学最后这个步骤。

1 理解问题和背景

1.1 目的

首先了解项目的目的。清楚了目的可以尝试了解更多的相关背景及要求,比如:

  • 目前已有的解决方法有哪些(基准模型)?
  • 模型表现该如何衡量,以使得和研究/商业目的相一致?
  • 需要获得的模型表现的最低标准?
  • 有没有相关领域的专家能求助?

1.2 工作环境

Python的话.ipynb对数据科学来说比较方便,Markdown和代码相结合,运行结果能打印在屏幕上。虽然数据科学还是Python比较好,个人还是更熟悉和喜欢R.

.ipynb的IDE我只用过原始的Jupyter Notebook,Google的Colab,PyCharm和经典VS Code. 个人比较喜欢Jupyter Notebook和Colab.

1.3 获取数据

下载了数据要注意划分训练集和测试集。尽早划分很重要,我们是学习训练集的数据的特征,在测试集上测试模型效果。就是早点划分出测试集假装不知道,最后当成新的数据来测试模式能不能很好的推广。

又想起我们的毕业的数据咨询项目之一的网络安全特征工程。就是客户方和指导老师意见还不统一。。。客户方是说不关注推广性然后说不用分测试集,然后指导的老师之前说要分,后来讨论了下就说随便我们吧。

不平衡类的数据划分训练集和测试集还要注意。

2 探索性数据分析(EDA)

这里开始就是使用测试集数据来工作了。

给出的数据形式可能有很多种,包括离散对象,数值,文字,事件,测量甚至是事物的描述等。用探索性数据分析来处理数据能尽可能地挖掘出数据集有用的信息。通过检查数据集来发现数据特定的模式,发现异常值,进行假设检验等。

首先可以获得数据集各列变量的数据类型,使用描述性统计量来描述各列变量的特征(比如平均值,方差等)。

然后可以检查解释变量中是否存在高度相关的特征。高度相关的解释变量对一些模型会有影响。一般会选择只保留一组高度相关的变量中的一个。

  • 对于线性模型(线性回归或逻辑回归)来说,多重共线性会导致数据不稳定的结果。
  • 对于随机森林来说,高度相关的特征会影响模型的解释性。这篇博客解释的很好:决策树、随机森林中的多重共线性问题
  • 模型解释来说,基本上大家都更喜欢简单点的模型,更简单的模型也更好解释。
  • 一般来说,如果减少了特征的数量算法学习的速度会更快

具体的后面具体整理,总之通常更倾向于除掉这些变量或是用降维方法(如PCA)结合这些变量。

然后可以检查不同变量的分布(正态吗?左偏?右偏?)。一些模型或是预处理步骤会假定数据服从特定的分布。一般可以画出变量的直方图。

3 数据预处理

数据预处理最好是写函数来处理,这验证集/测试集/新数据就能直接用了。做为一个整体也方便增添,方便验证是否需要这个处理步骤。数据的整体可以直接使用一个“pipeline”来处理。就是一个数据处理的流程。Python中我们学用的是Scikit-learnPipeline是其中的一个类,把整个数据预处理和建模按步骤包装起来。官方文档:sklearn.pipeline.Pipeline — scikit-learn 1.1.2 documentation.

3.1 数据清理

这个过程处理数据中重复或者缺失的部分。也关注异常值的修正/去除。

重复数据可能会使我们拟合的模型有偏。就是有对于这些重复数据过度拟合的可能。但也需要注意它们是不是真实的数据,只是值是一样的。

最简单发现重复值的方法是直接查找每个特征的值都一样的不同行数据。但这样无法检测出拼写错误,缺失值,别名之类的问题。这些问题需要更复杂的人工步骤。

对于缺失值,大多数模型都无法适用。就我这几年在大学来说,实践中多数就是直接删除缺失值。不过我们有门必修课是不完整数据分析,是我成绩最好的课之一!大概讲了不同缺失值类型,缺失的模式,不同的插值方法之内的,总之是很严密的分析体系,说起来还好复杂,我得翻笔记才能有印象。我记得作业它不仅有数据处理题,还有好多复杂的证明题,当时我公式不知道打了多少。事实证明,花了再多时间再大精力,好久不碰的话就跟没见过一样!

3.2 特征选择

可选步骤。把没提供有用信息的特征去除。是数据降维的一部分,后面有详细整理。就之前提的去除高度相关的特征就是一种方式。

3.3 特征工程

特征工程是在给定数据,模型和任务的情况下提取加工出合适的特征供数据使用。有难度问题,是一门艺术。我觉得要靠背景知识和天赋。

Data-centric AI之特征工程(第一讲) | 亚马逊AWS官方博客 (amazon.com)

3.4 特征缩放

一些机器学习算法对数据的范围和量纲很敏感。缩放数据能改善这些算法的效果和训练时间。一般有标准化

\[z=\frac{x-mean(x)}{std(x)}, \]

或者归一化,即把数据缩放到统一范围,比如\([0, 1]\)或者\([-1, 1]\).

\[x' = \frac{x-min(x)}{max(x) - min(x)}, \]

\[x' = \frac{x-mean(x)}{max(x) - min(x)}. \]

4 模型探索

尝试不同类型的机器学习模型(线性的,非线性的,树类的,神经网络等)。这个时候,我们需要进一步把训练集划分成测试集和训练集。测试集可以用来对比不同机器学习模型的效果以及不同参数的效果来选择最好的。

简单来讲,对于所有数据,首先拿出一部分假装根本不知道来作为测试集。这部分数据在测试模型的推广泛化效果之前不会用到。剩下的数据是作为假装已知的数据,再从中拿出一部分数据来作为参数选择的测试集。数据少的话还有留一验证法和交叉验证法等。

刚上大三的时候我一直觉得测试集什么东西啊一点用都没有,为啥不直接用验证集呢。后来学的多了,再想想当时真是还啥都没学。当时我:“PCA就是Personal Computer Analysis.”还“概率这个东西它能不能是负数或者大于1呢。”真是年轻又有活力啊。具体来说自从疫情开始之后人就年纪大了,不年轻了,学也再也没有正常上过,唉。

具体验证的标准对于不同数据不同模型不同目的也有不同偏好。先以\(R^2\)为例子,其值接近于\(1\)说明数据中的变化由模型解释的部分越大,越接近于\(0\)则模型解释的数据变化越少。

用测试集选出表现最好的模型以及参数。

posted @ 2022-10-04 00:06  ZZN而已  阅读(189)  评论(1)    收藏  举报