机器学习现场指南

2020-06-13 09:42:28

我们都必须处理数据,我们试图学习机器学习并将其应用到我们的项目中。但每个人似乎都忘记了一件事……。这远不是完美的,还有很多事情要做!别担心,我们会从头到尾讨论👀的每一个小步骤。

我们都是从脑海中的数据集或目标开始的。一旦我们发现、收集或搜集了我们的数据,我们就会把它拉出来,然后目睹无情的数字细胞、更多的数字、类别,也许还有一些单词😨!一个天真的想法掠过我们的脑海,用我们的机器学习能力来处理这种错综复杂的混乱……。但是,快速搜索一下就会发现,在培训😱模型之前,我们需要考虑的任务有很多。

一旦我们克服了不守规矩的数据带来的冲击,我们就会想方设法与我们强大的克星🤔作战。我们首先试图将我们的数据输入Python。纸面上相对简单,但这个过程可能会稍微有点……。全力以赴。不管怎样,只需要一点点努力(我们很幸运)。

我们没有浪费任何时间就开始清理数据,以去除虚假的东西,揭露美丽的东西。我们的方法开始很简单-观察和删除。它起了几次作用,但后来我们意识到。它真的没有公平对待我们!不过,为了处理混乱,我们找到了一个强大的工具来增加我们的武器库:图表!通过我们的图表,我们可以感觉到我们的数据,其中的模式和缺失的地方。我们可以插入(填充)或删除丢失的数据。

最后,我们将面对备受期待的😎挑战--数据建模!通过一点研究,我们会发现哪些策略和模型是最常用的。要破译我们应该使用哪种策略和模型有点困难,但我们还是设法度过了这一关,并弄清楚了一切!

如果不做一些令人印象深刻的事情,我们就无法完成一个项目。所以,最终的产品、网站、应用程序甚至是一份报告都会带我们走得更远!我们知道第一印象很重要,所以我们修复了gihub存储库,并确保每件事都得到了很好的记录和解释。现在我们终于可以向世界其他地方炫耀我们的辛勤工作了!😎!

数据有各种形状和大小,因此我们用来将所有内容放入代码中的过程往往各不相同。

数据清理最难的部分不是编码或理论,而是我们的准备工作!当我们第一次开始一个新项目并下载我们的数据集时,打开代码编辑器并开始键入……是很诱人的。但这对我们没有任何好处。如果我们想要抢占先机,我们需要为数据中最好和最坏的部分做好准备。要做到这一点,我们需要从BASIC开始,通过手动检查电子表格。一旦我们了解了数据的基本格式(文件类型以及任何细节),我们就可以开始将其全部导入Python。

当我们幸运地只有一个电子表格时,我们可以使用Pandas Read_CSV函数(让它知道我们的数据放在哪里):

虽然我们正在讨论一系列的场景,但我们通常一次只处理几个场景。

我们的前几个问题(导入数据的特定部分/重命名列)很容易使用几个参数来处理,比如要跳过的行数、要导入的特定列和我们的列名:

每当我们的数据分布在多个文件中时,我们都可以使用Pandas Concat函数将它们组合在一起。Concat函数将DataFrame列表组合在一起:

我们解析以连接电子表格列表(我们像以前一样导入)。当然,列表可以以任何方式获得(因此,花哨的列表理解或每个文件的随意列表都同样有效),但请记住,我们需要的是数据帧,而不是文件名/路径!

如果我们没有CSV文件,Pandas仍然可以工作!我们可以只用READ_CSV替换READ_EXCEL、READ_SQL或其他选项。

在所有数据都在Pandas数据框中之后,我们需要仔细检查我们的数据格式是否正确。实际上,这意味着检查每个系列数据类型,并确保它们不是泛型对象。这样做是为了确保我们可以利用Pandas内置的数字、类别和日期/时间值功能。要查看这一点,只需运行DataFrame.dtype。如果输出看起来合理(即数字是数字,类别是类别等),那么我们应该可以移动。当我们需要更改我们的数据类型时!这可以使用Pandas DataFrame.astype.如果这不是这样的话';如果不工作,则应该有另一个更多Pandas函数用于特定转换:

如果我们需要分析单独的数据组(即,我们的数据可能按国家/地区划分),我们可以使用Pandas GROUPBY。我们可以使用GROUPBY选择特定数据,并分别对每个组运行函数:

其他更小众的技巧,如多层次索引,在特定场景中也会很有帮助,但是,理解和使用起来更加棘手。

数据是有用的,数据是必要的,然而,它需要干净和切中要害!如果我们的数据无处不在,它对我们的机器学习模型根本没有任何用处。

每个人都被丢失的数据弄得发疯,但隧道的尽头总是有一道亮光。

我们所说的最终目标,是指我们致力于预测、分类或分析的任何变量,这样做的目的是缩小我们的范围,而不是陷入无用的信息之中。

一旦我们知道我们的主要客观特征是什么,我们就可以尝试找到模式、关系、丢失的数据等等。一个简单而直观的方法是绘制图表!快速使用熊猫绘制出数据集中的每个变量,并尝试查看每个变量的位置。

一旦我们确定了数据中的潜在问题或趋势,我们就可以尝试修复它们。通常,我们有以下选项:

要从识别丢失的数据到选择如何处理它,我们需要考虑它如何影响我们的最终目标。对于丢失的数据,我们删除任何似乎对最终结果没有重大影响的东西(即,我们找不到有意义的模式),或者缺少太多数据而无法得出价值的地方。有时,我们还决定删除非常少量的丢失数据(因为这比填充它更容易)。

如果我们已决定删除信息,则可以使用Pandas DataFrame.drop。它可以从数据帧中删除列或行。它非常易于使用,但请记住,默认情况下,Pandas不会修改/删除源数据帧中的数据,因此必须指定inplace=True。注意,Axis参数指定是否要删除行或列,这可能很有用。

当不删除完整的列,或者特别针对丢失的数据时,依赖几个漂亮的Pandas函数通常很有用。要删除空值,可以使用DataFrame.dropna。但请记住,默认情况下,dropna会完全删除所有缺少的值。但是,设置参数HOW TO ALL或设置阈值(阈值,表示需要多少空值才能删除)可以弥补这一点。

如果我们有少量不规则的缺失值,我们可以用几种方法来填充它们。最简单的是DataFrame.fulna,它将缺失值设置为某个预设值。更复杂但灵活的选项是使用DataFrame.interpolate进行插值。插值基本上允许任何人简单地设置他们想要用来替换每个空值的方法。这些方法包括上一个/下一个值、线性和时间(最后两个是根据数据推断的)。当使用时间时,时间是一个自然的选择,并且。

如上所述,Interpolate需要传递到纯粹包含缺少数据的列的DataFrame中(否则将抛出错误)。

每当我们看到经常丢失的数据或具有使用不同时间尺度的多个数据源时,重采样都很有用(例如,确保以分钟和小时为单位的度量可以合并)。直观地理解重采样可能有些困难,但当您对特定时间范围内的测量值进行平均时,重采样是必不可少的。例如,我们可以通过指定要获取每个月的平均值来获得月值:

#34;M&34;代表月份,可以替换为表示年份和其他选项的";Y&34;。

尽管数据清理过程可能相当具有挑战性,但如果我们记得最初的意图,它将成为一项更符合逻辑、更直接的任务!如果我们仍然没有所需的数据,我们可能需要回到第一阶段并收集更多数据。请注意,丢失数据表明数据收集有问题,因此仔细考虑并记下发生的位置是很有用的。

完成时,Pandas Unique和VALUE_COUNTS函数对于决定直接删除哪些特性以及绘制/研究哪些特性非常有用。

视觉化听起来很简单,确实如此,但很难……。不是太复杂。对于我们来说,把情节看作是一件琐碎的事情太容易了。然而,这些坏家伙做了一件非常非常好的事情-直观地展示了我们数据的内部运作!只需记住:

因此,当被困在想法中,或者不太确定要做什么时,我们的基础知识总是可以依赖于识别有用的模式和有意义的关系。这看起来可能有点🥶,但它确实很有用。

我们的目标不是画花哨的六边形图,而是描绘正在发生的事情,所以任何人都可以简单地解释一个复杂的系统!

要开始绘图,只需在任何系列或数据帧上使用Pandas.lot()!当我们需要更多时,我们可以深入研究MatPlotLib、Seborn或交互式绘图库。

data.lot(x=";Column 1 Name";,y=";Column 2 Name";,Kind=";bar";,figsize=(10,10))data.lot(x=";Column 1 Name";,y=&";Column 3 Name";,Sub_y=True)data.hist()data.groupby(";group";).boxlot()。

在90%的情况下,这些基本功能就足够了(更多信息请点击这里),搜索一下就会发现如何绘制特别有异国情调的图形😏。

现在终于到了有趣的东西派生的结果了。训练一个科学工具包学习模型似乎是如此简单,但没有人深入到细节!所以,让我们在这里诚实地说,不是每个数据集,也不是每个模型都是相等的。

根据我们的数据,我们的建模方法会有很大的不同。有三个特别重要的因素:

我们的问题类型归结为,我们是试图预测一个类别/标签(称为分类)、一个值(称为回归),还是对数据进行分组(称为聚类)。如果我们试图在一个数据集上训练一个模型,其中我们已经有了我们正在尝试预测的示例,我们称我们的模型是有监督的,如果没有监督的话。可用的数据量以及它的复杂程度预示着一个模型将会多么简单。具有更多特征(即列)的数据往往更复杂。

解释复杂性的意义在于了解哪些模型对我们的数据来说太好或太差。

模型的拟合优劣告诉我们这一点!如果一个模型很难解释我们的数据(太简单),我们可以说它不符合,如果它完全过度(太复杂),我们可以说它过度拟合。我们可以把它看作是从什么都不学到记住所有东西的一个光谱。我们需要取得平衡,以确保我们的模型能够将我们的结论概括为新的信息。这通常被称为偏差-方差权衡。请注意,复杂性也会影响模型的可解释性。

复杂的模型需要更多的时间来训练,特别是在大数据集的情况下。所以,升级计算机,通宵运行模型,然后暂停一段时间😁!

在训练模型之前,重要的是要注意到我们将需要一些数据集来测试它(这样我们就知道它的表现有多好)。因此,我们经常将我们的数据集划分为单独的训练集和测试集。这允许我们测试我们的模型对新的未知数据的泛化能力有多好。这通常是有效的,因为我们知道我们的数据很好地代表了现实世界。

实际的测试数据量并不太重要,但是经常使用80%的训练和20%的测试。

交叉验证是指将数据集拆分成几个文件夹(即原始数据集的子集或部分)。这往往比使用单个测试/验证集更健壮,抗过度拟合!几个SkLearning函数有助于交叉验证,但通常直接通过网格或随机搜索(下面讨论)来完成。

有些因素我们的模型无法解释,因此我们设置了某些超参数。这些参数因模型而异,但我们可以通过手动试错或网格或随机搜索等简单算法找到最佳值。对于网格搜索,我们尝试所有可能的值(蛮力😇),并从某些分布/选择中随机搜索随机值。这两种方法通常都使用交叉验证。

SkLearning中的网格搜索通过参数字典工作。每个条目键代表要调优的超参数,值(列表或元组)是要从中选择的值:

创建网格后,我们可以使用它来训练模型,并提取分数:

这里重要的是要记住,我们需要的是训练数据,而不是测试数据。即使使用交叉验证来测试模型,我们最终也会尝试在训练数据上获得最佳匹配,然后在测试集上继续测试每个模型:

SkLearning中的随机搜索的工作原理与此类似,但稍微复杂一些,因为我们需要知道每个超参数所处的分布类型。虽然从理论上讲,它可以更快地产生相同或更好的结果,但情况不同,情况也会有所不同。为简单起见,最好坚持网格搜索。

使用SkLearning,它就像找到我们想要的型号名称,然后只需为它创建一个变量一样简单。有关详细信息,请查看文档链接!例如。

线性回归是用直线来拟合我们的数据,它是最基本、最基本的模型。线性回归有几种变种,如套索和岭回归(这是防止过拟合的正则化方法)。多项式回归可以用来拟合高次曲线(如抛物线和其他曲线)。Logistic回归是另一种可以用于分类的变种。

就像线性/逻辑回归一样,支持向量机(SVM)试图将直线或曲线拟合到数据点。然而,SVM的目标是最大化边界与每个点之间的距离(而不是让直线/曲线穿过每个点)。

支持向量机的主要优点是能够使用不同的核。核是一个计算相似度的函数。这些核允许线性和非线性数据,同时保持良好的效率。核将输入映射到更高维空间,从而形成边界。这个过程对于大量的特征通常是不可行的。那么神经网络或另一个模型可能会是更好的选择!

所有的话题都是关于深度学习和神经网络的,它们是复杂的、缓慢的和资源密集型的模型,可以用于复杂的数据,但是当遇到大型的非结构化数据集时,它们是非常有用的。

使用神经网络时,一定要注意过度拟合,一种简单的方法是跟踪误差随时间的变化(称为学习曲线)。

深度学习是一个非常丰富的领域,所以这里要讨论的内容实在太多了。实际上,Scikit Learning是一个机器学习库,几乎没有深度学习能力(与PyTorch或TensorFlow相比)。

决策树是一种简单快捷的关系建模方法。它们基本上是一棵决策树,帮助确定数据点属于哪个类或标签。决策树也可以用于回归问题。虽然简单,但为了避免过度拟合,必须选择几个超参数。所有这些通常都与树的深度和要做出的决策有关。

我们可以使用k-均值将未标记的数据分组到几个簇中,通常,存在的簇的数量是一个选择的超参数。

K-Means的工作原理是试图优化(减少)一些称为惯性的准则(即函数),它可以看作是试图最小化从一组质心到每个数据点的距离。

随机森林是在数据的随机子集(自举)上训练的多个决策树的组合,这一过程被称为装袋,允许随机森林与复杂数据获得良好的拟合(低偏差和低方差)。

一名选民可能会投票给一个糟糕的候选人,但我们希望大多数选民在知情的情况下做出积极的决定。

对于回归问题,我们平均每个决策树的输出,而对于分类,我们选择最受欢迎的一个。这可能不总是有效的,但我们假设它通常会有效(特别是对于具有多列的大型数据集)。

随机森林的另一个优点是,不重要的功能不应该因为民主-ESC自举过程而对性能产生负面影响!

超参数选择与决策树相同,但也与决策树的数量相同。基于上述原因,树越多,过度拟合就越少!

像AdaBoost或XGBoost这样的集成模型是通过将一个模型叠加到另一个模型上来工作的。这里的假设是,每个后续的弱学习者都会纠正前一个模型的缺陷(因此称为Boosting)。因此,模型的组合应该提供每个模型的优势而不存在潜在的陷阱。

迭代方法意味着以前的模型性能影响当前模型,较好的模型优先考虑;Boosted模型的性能略好于袋装模型(也称为随机森林),但也略有可能过度拟合;SkLearning提供AdaBoost进行分类和回归。

这是流程🧐的最后但可能是最重要的部分。我们已经投入了所有这些工作,所以我们需要不遗余力地创造一些令人印象深刻的东西!

有多种选择。Streamlight对于面向数据的网站来说是一个令人兴奋的选择,Kotlin、Swift和DART等工具可用于Android/iOS开发。带有VueJS等框架的JavaScript也可用于额外的灵活性。

在尝试了其中的大部分之后,老实说,我会推荐坚持使用Streamlight,因为它比其他的容易得多!

在这里,重要的是从一个愿景(越简单越好)开始,试着找出哪些部分是最重要的。然后尝试具体地工作。继续到完成!对于网站,将需要像Heroku这样的主机服务,这样世界其他地方就可以看到我们所有辛勤工作的🤯😱令人惊叹的最终产品。

即使上面的选项都不适合这个场景,一份包含我们所做的工作、我们所学到的知识以及任何建议/经验教训的报告或文章,以及一个文档齐全的GitHub存储库也是必不可少的!确保自述文件是最新的。

如果您喜欢这本书,您可能还会喜欢“完整的编码实践者手册”,它介绍了您需要了解的每一个实用的编码工具。如果您在考虑要承担哪个项目时迷失了方向,请考虑查看我的“从零到英雄”的指南,该指南介绍了如何通过网络抓取来选择项目和收集您自己的数据集。

国家癌症研究所,Dane Deaner,ThisisEngineering RAEng,Adam Nowakowski和Guilherme Caetano在Unspash上的照片。拟合优度图表是SkLearning文档的修改版本