使用Julia及其生态系统的机器学习

Glass数据分析-第1部分

Julia速度很快,可以像解释语言一样使用,具有高度的可组合性,但不是面向对象的。它有一个快速发展的生态系统,可以帮助典型ML工作流程的各个方面。

图片由罗宾·范德·普洛格在Unsplash

教程概述

这是本教程的第一部分,介绍如何将Julia的特定语言特性和来自其生态系统的各种高质量包轻松组合在典型的ML工作流中使用。

  • 第一部分“分析谷歌眼镜数据集”集中讨论如何使用类似的包对数据进行预处理、分析和可视化ScientificTypesDataFramesStatsBase而且StatsPlots
  • 第二部分“使用决策树”关注ML工作流程的核心:如何选择模型以及如何使用模型进行训练、预测和评估。这部分主要依赖于包装MLJ(=毫克ydF4y2Baachinel收入在Julia
  • 第三部分“如果东西还没有准备好使用解释了如果可用的软件包不能提供所需的所有功能,那么用几行代码创建自己的解决方案是多么容易。

简介

每个ML工作流都从数据的分析和预处理开始,这些数据将用于训练模型。这些第一步包括理解它来自的应用程序域中的数据、检查数据质量和识别其统计属性(使用可视化和统计度量)。

在这个tutorial我们将使用' glass '数据集。这是一个用于教学目的的数据集。它和Weka工具包,并可从不同的网站下载。在这里).该数据集的特征包含关于玻璃的不同变体(如用于生产的材料和光学特征)的信息,目标变量是产生的玻璃变体(见下面摘录)。

' glass '数据集中的几行代码

数据以一种名为ARFF(属性-关系文件格式);Weka工具包使用的格式。因此,我们需要一个Julia包,它具有读取该格式的函数:ARFFFiles.jl.因为我们想要将数据转换为aDataFrame这个包DataFrames.jl也需要。ScientificTypes.jl为标准Julia类型增加了ml特定的特性,最后但并非最不重要的是我们需要Downloads.jl用于从网站下载数据的功能包。

所以使用这些软件包的代码,从上面提到的网站下载数据,从磁盘读取数据,并将其转换为DataFrame(和使用ScientificTypes)如下所示:

加载' glass '数据集并创建一个' DataFrame '

数据集的第一个概述

为了得到数据集的第一个概述,我们从它获取一些基本信息:

  • 深圳=大小(玻璃)给出了尺寸:(214年,10),即它有214行10列。
  • col_names =名字(玻璃)的列名DataFrame
10-element向量{}字符串:
“扶轮”、“Na”、“毫克”,“基地”、“如果”、“K”、“Ca”、“Ba”、“铁”,“类型”
  • 模式(玻璃)(从ScientificTypes)给出所有列的数据类型。类型是Julia数据类型,而scitypes抽象级别是由ScientificTypes.这里我们可以看到所有的特征连续目标变量是一个名义值(有7个不同的条目)。
模式(玻璃)——>
┌───────┬───────────────┬──────────────────────────────────┐
│名字│字体│类型
├───────┼───────────────┼──────────────────────────────────┤
国际扶轮│││连续Float64│
│Na│Continuous│Float64
│Mg ramramcontinuous│Float64 ramramcat
│Al连续││Float64│
Si│││连续Float64│
│K│连续│Float64
│Ca ramramcontinuous│Float64 ramramcat
│Ba│连续│Float64
│Fe│Continuous│Float64
│Type│Multiclass{7}│CategoricalValue{String, UInt32}│
└───────┴───────────────┴──────────────────────────────────┘

目标变量

现在让我们仔细看看目标变量的特征。glass_types =独特(glass.Type)对象中惟一值的列表类型专栏:

6-element向量{}字符串:
“构建风浮动”
“vehic风浮动”
“餐具”
“建造风力non-float”
“车头灯”
“容器”

我们假设,数据集中有6种不同的玻璃。但这只是事实的一部分。使用水平(glass.Type)ScientificTypes实际上有7种不同的玻璃类型:

7-element向量{}字符串:
“构建风浮动”
“建造风力non-float”
“vehic风浮动”
“vehic风non-float”
“容器”
“餐具”
“车头灯”

其中只有6个出现在glass数据集中(计数为> 0)“风vehic non-float”不发生。关于其存在的知识存储在ARFF-File中,并由ScientificTypes.在这个例子中,我们可以看到使用这个类型系统而不是仅仅依赖语言的本机类型系统的附加价值(在这个例子中,这可能会欺骗我们)。

在下一步中,调用countmap(从StatsBase)告诉我们,这些类型在目标变量中出现的频率。因此,我们对它们的分布有了一些了解:建筑中使用的玻璃窗户是最常见的类型,其次是用于大灯的玻璃类型:

type_count = countmap(glass.Type)——>Dict {CategoricalArrays。CategoricalValue{String, UInt32}, Int64}, 6个表项:
“车辆风浮”=> 17
“餐具”= > 9
“建风不浮”=> 76
“建造风浮”=> 70
“前照灯”= > 29
“容器”= > 13

一张图表当然比一串数字更能说明问题。让我们用条形图来想象一下情节包:

Bar (type_count, group = glass_types, legend = false,
Xlabel = "玻璃类型",xrotation = 20,
ylabel =“计数”)
不同玻璃类型的频率[图片来源:作者]

这里我们也注意到,额外的信息来自ScientifcTypes已经用过,由此可见“风vehic non-float”零计数。

详细功能

现在来看特征变量:第一个特征国际扶轮是所谓的折射率这是一种光学特性,它告诉我们光在材料中的传播速度。其他特征给出了不同元素的百分比,如钠(= LatinNatrium),镁(毫克)或艾尔umium是用来生产玻璃的。

这些价值合理吗?

让我们首先从技术角度检查这些特性的值是否合理。调用描述DataFrames在其他信息中,给我们一个关于数据集中值范围的印象:

通过' describe(glass) '获得的统计特征
  • 国际扶轮稍微在1.5左右变化。从上面提到的维基百科页面,我们了解到典型的国际扶轮不同种类的玻璃的数值在1.49到1.69之间。因此,国际扶轮“glass”数据集中的值似乎相当合理。
  • 其他特征是百分比。也就是说,它们必须在0 ~ 100之间,这对我们的数据来说是正确的。
  • 硅是玻璃最重要的成分(70%),其次是钠和钙。

我们可以再对百分比做一次质量检查。对于每种玻璃成分,它们加起来应该是100%。我们使用变换函数DataFrames并在每一行中添加所有的特征值Na....结果存储在一个名为sumpct

glass_wsum =变换(玻璃,
Between(:Na,:Fe) => ByRow(+) =>:sumpct)

看看这个新列和使用最大而且最低函数从StatsBase显示大多数行的和并不是100%,但是它们在该值附近有少量的变化。这可以用测量误差和舍入误差来解释。所以对我们来说没问题。

最大(glass_wsum.sumpct),最小(glass_wsum.sumpct)——>(100.09999999999998, 99.02)

统计数据和可视化

因为所有的特征属性都是类型连续,可以计算出一些统计数据,并绘制出它们的分布图,以获得更深入的了解。

峰度和偏态

为了初步了解实值变量的分布是怎样的,这两个方法峰度而且偏态计算。

  • 偏度是对分布的对称性(或更确切地说是非对称性)的度量。负值表示它的左尾较长(且相当平坦),质量集中在右侧。我们说的是没有多或left-tailed分布。另一方面,正值表示A右偏态分布。
  • 峰度是对分布的“尾度”的度量。它表示尾巴伸向左边或右边的距离。正态分布的峰度是3。所以其他分布的峰度经常与这个值和所谓的过度峰度计算。它表示考虑分布的峰度超过正态分布的峰度的程度。这也是我们从峰度函数的StatsBase包中。

下面的表达式为' glass '数据集的所有特征创建了这些度量的列表:

[(atr,偏态(玻璃(:,atr)),峰度(玻璃(:,atr)))
对于atr在col_names[1:end-1]]

这样的表达在茱莉亚语中被称为“理解”。它是一个数组,其初始值是通过迭代计算的。对于atr在col_names[1:end-1]的列名(从第一个到第二个但最后一个)上迭代玻璃.对于每个列名(atr)它创建一个包含三个元素的元组atr本身以及偏度(偏态(玻璃(:,atr)))和峰度(峰度(玻璃(:,atr))),从而生成以下输出:

9元素Vector{Tuple{String, Float64, Float64}}:
(“扶轮”,1.6140150456617635,4.7893542254570605)
(“Na”,0.4509917200116131,2.953476583500219)
(毫克,-1.1444648495986702,-0.42870155798810883)
(“基地”,0.9009178781425262,1.9848317746238253)
(“Si”,-0.7253172664513224,2.8711045971453464)
(“K”,6.505635834012889,53.392326556204665)
(“Ca”,2.0326773755262484,6.498967959876067)
(“Ba”,3.392430889440864,12.222071204852575)
(“铁”,1.7420067617989456,2.5723175586721645)

从这些数字中我们已经可以看出,例如K而且英航非常不对称和长尾。但在大多数情况下,如果我们把分布可视化,我们会得到更多的见解。

功能国际扶轮

让我们从特性开始国际扶轮.一个小提琴情节,它可以创建使用小提琴函数的StatsPlots软件包,很好地展示了它的分布情况。小提琴(玻璃。国际扶轮,legend = false)生成以下情节:

特征RI分布[作者摄]

根据目标值着色的柱状图还显示了特征值与生成的玻璃类型之间的关系。为此,我们可以使用柱状图函数(也来自StatsPlots;参见图表下面的Julia代码):

RI值的直方图,按玻璃类型分组[图片由作者提供]

特性Na...

我们可以对其余的功能进行同样的处理Na....描述分布的一个很好的替代小提琴图是箱线图.有时候小提琴的情节更有洞察力,有时候盒子的情节更有洞察力。所以我们最好同时创造两者。如果我们将每个特征的所有三种图表类型并排绘制出来,我们可以很容易地进行比较,从而得到以下网格图:

Na, Fe特征的小提琴图,箱线图和直方图[图片来源:作者]

Julia代码用于生成这个网格图如下所示:

前三行具有类似的结构:每一行创建一个图表数组(首先是小提琴,然后是箱形图,最后是直方图)。为了达到这个目的,我们再次使用了“理解”:我们从2迭代到9,因为我们想要一个图的第2列到第9列玻璃数据帧。对于每一列,我们都创建了各自的图表(使用与上面的特性相同的方法)国际扶轮)使用适当的参数(每个图获得例如特性名称作为它的包含).

情节函数(绘制整个网格;第7行)将子图数组作为参数,并根据布局参数(这里是8 x 3的网格)。所以我们必须创建一个适当的数组,以正确的顺序包含子图(例如,对于每个材料,小提琴图,箱线图和直方图),应用以下步骤(代码在第5行):

  • hcat连接三个数组小提琴盒子而且组织这样就创建了一个8 × 3矩阵的图(每种类型的图都有一列)
  • 当Julia矩阵按列优先顺序处理时,我们将维数转换为permutedims创建一个3x8 -矩阵(因此三个图表Na在第一列,是毫克在第二列等等)
  • 最后,我们必须将矩阵“压平”成一个数组(根据需要)情节)使用vec

相关性

在处理数值属性时,知道它们是否以及相关性有多强总是很重要的,因为有些模型不能很好地处理强相关性属性。

除此之外,两个属性之间的强相关性表明其中一个属性可能是多余的,因为它没有携带太多额外的信息。这些知识可以用来减少特征的数量,从而使训练和评估模型的计算更加可行。

相关矩阵

这个函数天哪(从StatsPlots)以矩阵的形式给我们所需的信息,每对特征(所谓的相关矩阵):

和往常一样,可视化使数字更容易理解。在本例中,热图是合适的图类型(我们使用的热图StatsPlots).由于相关矩阵是对称的,它足以可视化它的下半部分(可以使用LowerTriangularLinearAlgebra包;参见图表下面的Julia代码)。颜色的比例: tol_sunset用于热图的是ColorSchemes包中。

相关矩阵热图[作者摄]
heatmap(lowertriangle (cor_mat), yflip = true,
seriescolor =: tol_sunset,
Xticks = (1:9, col_names[1:9]),
Yticks = (1:9, col_names[1:9]))

从热图(和相关矩阵)可以看出,不同玻璃属性之间最强的正相关是:

  • Ca / RI→0.810403
  • Ba / Al→0.479404
  • Ba / Na→0.326603
  • 0.325958 K / Al→

从数据上看,只有前两者才是真正的“强势”。

可以观察到明显的负相关:

  • Si / RI = -0.542052
  • Ba / Mg = -0.492262
  • 铝/毫克= -0.481798
  • 钙/镁= -0.443750

相关图和角图

下面的图更详细地展示了不同属性配对之间的相关性:

  • 相关情节在图的下半部分显示散点图(每个散点都有对应的SD线),在图的上半部分显示热图。散点图显示蓝色为正相关,红色为负相关,黄色为中性相关。
  • cornerplot(这里是它的紧凑形式)显示相同的散点图相关情节在图的下半部分。此外,它还在顶部和右侧空白处显示每个属性的直方图。
“玻璃”特征相关图[图片来源:作者]
“玻璃”特征的角落图[图片来源:作者]

每个图都是用一行Julia代码创建的,使用的函数来自StatsPlots如下:

@df玻璃corrplot(关口(1:9)
@df玻璃角图(cols(1:9),紧凑=真)

结论

上面的例子展示了如何仅使用几行代码就可以执行典型ML工作流的重要步骤。教程的第二部分继续这个旅程,重点关注训练、预测和评估等步骤。

不同Julia包的功能如何轻松组合以及它们在一起工作的效果如何也变得清晰起来,即使它们是独立开发的。本教程的第三部分将解释这种可组合性的内部工作原理。所以请继续关注!

当然,这些例子只能触及表面。有关更多信息,请参阅下面提供的参考资料。

进一步的信息

首席执行官adviion.de,讲师KIT.edu而在dhbw.de感兴趣领域:数据科学,机器学习,项目管理

Baidu
map