前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Julia 数据科学应用》总结

《Julia 数据科学应用》总结

作者头像
iOSDevLog
发布2018-12-05 15:14:57
1.6K0
发布2018-12-05 15:14:57
举报
文章被收录于专栏:iOSDevLogiOSDevLog

Julia

Julia 入门


  • 数据类型在 Julia 中特别重要,使用数据类型,可以使我们开发出的程序和函数具有更好的性能,并在表达上更加精确。
  • 你可以将数据从一种数据类型转换为另一种数据类型,使用与目标数据类型同名的函数即可(例如,Int64()可以将一些类型的数据转换为 Int64 类型)。
  • 与 Python 和多数其他语言不同,Julia 的索引从1开始,不是从0开始。

思考题

1.你看过附录 B 中列出的 Julia 教程和参考资料了吗?

2.Julia 中的函数(做了代码性能优化)是否优于其他语言中的相应函数?

3.假设你想创建一个列表,保存在一段文本中遇到的不同的(唯一的)词以及词的数量,你应该使用哪种数据结构来保存它们,可以最容易地进行随后的数据存取?

4.在一个函数中,精确定义每个输入参数的数据类型有意义吗?会产生不良后果吗?

Julia 进阶


  • 在 Julia 中,字符串处理主要是通过正则表达式函数来进行的,比如 match()、matchall()和 eachmatch()。
  • 在 Julia 中,正则表达式的前缀是“r”。例如:r"([A-Z])\w+"是一个用来识别以大写字母开头的单词的正则表达式。
  • 在定义一个使用通用类型或抽象类型输入的函数时,你必须事先定义好输入类型(一般在函数的输入参数之前)。可以使用如下的方式:function F{T<:TypeName}(Array{T}),这里的 TypeName 就是输入类型的名称(一般第一个字母要大写)。
  • 在开发一个完整的解决方案时,为要实现的算法建立工作流程图,列出所有必需的函数,是一种好的做法。在运行包装器函数(主函数)之前,必须将所有辅助函数加载到内存中。

思考题

1.你可以使用同样的函数来处理类型完全不同的数据吗?如果可以,应该使用 Julia 语言的哪种特性?

2.考虑一下前面的 hdist()函数,为什么它不能使用‘a’,‘b’作为输入?它们的距离不能为1吗?[1]

3.是否可以将前面的 mode()函数扩展一下,使它能够处理像234(一个单独的数值,不是一个数组)这样的输入,并将这个输入做为输出返回?做这样的修改需要利用 Julia 语言的哪种特性?

4.写一个简单的函数,在一段给定的文本中计算单词的数量(假设在文本中没有换行符)。在完成之后,使用一些文本来测试它(你可以在博客文章或电子书中随机找几个段落)并评价函数的性能。

5.写一个简单的函数,在一段给定的文本中计算字符的数量,并计算出非空格字符的比例。

6.写一个完整的解决方案,以一个数值型数组作为输入(你可以假设数组中都是浮点数),给出由数组形成的文本中所有数字的分布(也就是说,其中有多少个0,多少个1,等等)。并计算其中哪个数字出现的次数最多?最简单的实现方法是写一个函数,统计出在一个给定字符串中字符 x 有多少个,然后在包装器函数中将所有的统计结果累加起来并进行输出。如果你需要的话,也可以使用其他的辅助函数。

Julia 数据科学应用概述


  • 数据科学项目的最终结果或者是一种数据产品(例如,数据驱动的应用程序,仪表盘程序),或者是具有可操作性的知识,可以为分析数据的组织机构提供价值。
  • 数据科学流程由7个独立的阶段组成,可以分成3个大的阶段。
  • 数据工程。
  • 数据准备:确保数据是标准化的,没有缺失值,字符串数据具有一致的大小写,不包含任何不必要的字符。
  • 数据探索:创造性地与数据进行交流,以使我们理解数据集的结构和数据集中变量的用途。这需要大量的可* 视化工作。
  • 数据表示:使用正确类型的变量来表示数据,并开发出能有效捕获数据中的信息的特征。
  • 数据建模。
  • 数据发现:通过使用统计检验和其他方法,准确捕捉到数据中的模式,这些模式经常隐藏在特征空间的结构之中。
  • 数据学习:对前一阶段中的所有发现进行智能分析和消化吸收,并训练计算机在新的陌生数据上重复这些发现。
  • 信息萃取。
  • 数据产品创建:使用前面阶段中创建的模型,开发易于使用的程序(一般是 API、APP 或仪表盘程序)。
  • 知识、交付物和可视化产品:可视化程度最高的一个阶段,包括与数据科学项目相关的所有信息沟通,方式有可视化产品、报告、集中展示等等。
  • 尽管数据科学流程的各个环节一般是按顺序进行的,但为了提高和改善最终结果,我们也经常需要对某个阶段进行回顾和重复。
  • 基于你获取的知识和提出的新问题,数据科学流程一个循环的结束经常意味着一个新循环的开始。
  • 对于数据科学流程的各个阶段,Julia 都有相应的扩展包,如果你在其中找不到合适的工具,你完全可以自己开发一个,不用担心对系统性能的影响。
  • 尽管 Julia 可以胜任数据科学流程的各个阶段,你也完全可以将它与其他编程语言结合起来使用,比如 Python 和 R,如果需要的话(参见附录 D)。
  • 数据科学流程是一个不断发展变化的过程。现有的步骤不是一成不变的。因此,我们要抓住数据科学的本质:将原始数据转换为可用的形式,为最终用户创造出具有真正价值的产品。

思考题

1.什么是数据工程?它是必需的吗?

2.数据准备阶段的重要性是什么?

3.数据科学与其他数据分析的主要区别是什么?

4.对于以下数据,你如何进行数据准备:“The customer appeared to be dissatisfied with product 1A2345 (released last May).”

5.数据探索阶段需要做什么工作?

6.数据表示阶段包括哪些过程?

7.数据发现包括哪些工作?

8.什么是数据学习?

9.什么是数据产品创建?

10.在知识、交付物和可视化产品阶段,需要做什么工作?和数据产品创建阶段有什么不同?

11.数据科学流程是一个线性流程吗?解释一下。

12.什么是数据产品?它为什么很重要?

13.举出几个数据产品的例子。

14.在流程的最后阶段创建的可视化产品与在数据探索阶段创建的可视化产品有什么不同?

15.流程的所有阶段都是不可或缺的吗?为什么?

Julia 数据工程


  • 数据工程是数据科学流程中的一个必备环节,尽管很花费时间,也很枯燥无味,但长远来看,能为你节省大量的时间。
  • 数据框是一种流行的数据结构,它可以有效地处理缺失值(以 NA 表示),缺失值可以通过 isna()函数识别出来。向数据框中加载数据非常容易,使用 readtable()命令即可,将数据框保存为分隔值文件也非常容易,使用 writetable()即可。
  • 要想使用 .json 文件中的数据,可以使用 JSON 扩展包和其中的 parse()命令。你可以使用这个扩展包中的 print()命令创建一个 .json 文件。从 .json 文件中提取出的数据是保存在字典对象中的。
  • 数据清洗是一个复杂的过程,根据数据类型的不同,包括以下步骤。
  • 数值型数据:去除缺失值,处理离群点。
  • 文本数据:去除不必要的字符,去除停用词(在进行文本分析时) 数据格式化(将每个变量转换为最合适的类型)非常重要,因为可以节省存储资源,并有助于在随后的阶段中避免错误。
  • 数据转换是数据工程中的常见操作,它的具体操作取决于数据的类型。
  • 数值型数据:标准化(使所有特征的值可以互相比较)、离散化(将连续型特征转换为离散型特征)、二值化(将一个离散型特征转换为一组二值变量),以及将二值特征转换为连续型特征(仅适用于二值分类问题)。
  • 文本数据:大小写标准化(使所有字符都大写或者都小写)和向量化(将文本转换为二值数组)。
  • 特征评价对理解数据集是非常必要的。根据你随后想建立的模型的类型,有多种策略可以完成特征评价,其中最重要的如下。
  • 区分指数——连续型特征。
  • 费舍尔判别比——连续型特征。
  • 相似度指数——离散型特征。
  • 杰卡德相似度——离散型特征。
  • 互信息——既适用于离散型特征,也适用于连续型特征。

思考题

1.在数据科学项目中,数据工程具有哪些重要性?

2.数据框与矩阵相比,有哪些主要的优点?

3.如何从 .json 文件中导入数据?

4.假如你必须使用大于计算机内存容量的数据文件来进行数据工程,那么你该如何进行这项工作?

5.数据清洗要做什么?

6.在数据工程中,数据类型为什么特别重要?

7.你应对数值型数据进行怎样的转换,才能使所有的变量在取值上具有可比性?

8.在解决文本分析问题时,你认为 Julia 中的哪种数据类型是最有用的?

9.假设你有一些文本数据,你要对其进行数据工程。每条记录中都有一个字符串变量,其中或者包含关键字或关键短语,或者不包含。你应如何有效地保存这个文件,才能使你以后可以使用这个文件,并分享给其他同事?

10.你应如何评价 OnlineNewsPopularity 数据集中的特征?你应如何评价 Spam 数据集中的特征?

探索数据集


  • 数据探索包含很多不同的技术。其中最重要的是描述性统计(可以由 StatsBase 扩展包实现)、绘制统计图(Gadfly 扩展包)和假设形成与检验(HypothesisTests 扩展包)。 描述性统计
  • 使用 StatsBase 扩展包,你可以计算出变量 x 的一些最重要的描述性统计量,常用函数如下。
  • summarystats(x):这个函数的优点是可以将统计结果保存在一个对象中,以供我们随后使用。
  • describe(x):通过将统计结果显示在控制台中,这个函数可以使我们更好地理解变量。
  • 使用下面任何一种函数,都可以计算出两个变量之间的相关性。
  • cor(x,y):皮尔逊方法,适用于正态分布。
  • corspearman(x,y):斯皮尔曼方法,适用于任何类型的分布。
  • corkendall(x,y):肯德尔方法,同样适用于任何类型的分布。
  • 如果想创建一个相关性表格,其中包含数据集中所有变量之间的相关性,可以使用上面任何一种相关性函数,并将整个数据集转换为数组,作为唯一的参数传递给它。

统计图

  • 在 Julia 中,有好几种扩展包可以绘制统计图,其中最重要的是:Gadfly、Plotly、Bokeh、Winston 和 Vega。
  • 在使用 Gadfly 创建可视化产品之前,最好将所有的变量保存在数据框中。
  • 在所有的 Gadfly 统计图中,你可以在 plot()函数中使用如下参数为统计图做标记。
代码语言:javascript
复制
Guide.xlabel("Name of your X axis")

Guide.ylabel("Name of your Y axis")

Guide.title("Name of your plot")
  • 你可以使用 Gadfly 轻松地创建以下统计图。
  • 条形图:
代码语言:javascript
复制
plot(DataFrameYouWishToUse,
x="IndependentVariable",Geom.bar)。
  • 折线图:
代码语言:javascript
复制
plot(DataFrameYouWishToUse,
y="DependentVariable",Geom.line)。
  • 散点图:
代码语言:javascript
复制
plot(x=DataFrameName[:IndependentVariable],
y=DataFrameName[:DependentVariable],Geom.point)。
  • 直方图:
代码语言:javascript
复制
plot(x=DataFrameName[:VariableName], 
Geom.histogram)。
  • 不管数据集的维度如何,你都可以使用 tSNE 扩展包中的 t-SNE 算法对整个数据集进行可视化。
  • 你可以保存创建出的统计图,使用 Cairo 扩展包,可以将其保存在一个对象中。或者,你可以对统计图进行屏幕截图,也可以在 REPL 中运行命令,然后将其在浏览器中生成的结果保存为 HTML 文件。

假设检验

  • 如果你对变量之间的关系有些猜想,假设检验就是检验这些猜想的可靠性的一种非常好的方法。可以使用 HypothesisTests 扩展包中的工具进行假设检验。最常用的假设检验方法如下。
  • t-检验:pvalue(EqualVarianceTTest(x,y)),或者对于变量具有不同方差的情况,pvalue(UnequalVarianceTTest (x,y))。
  • 卡方检验:ChisqTest(X)。
  • 假设检验可以基于两种方式进行评价,每种方式都不能反映检验结果的价值。然而,它们可以表示出检验在科学上的有效性。这两种方式如下。
  • 显著性(alpha):假设检验发生第一类错误的概率。显著性水平经常使用阈值来定义,对应的 alpha 值为0.05(通常为最高值)、0.01和0.001(通常为最低值)。
  • 检验力:假设检验没有发生第二类错误的概率。检验力对应着假设检验得到正面结果(结果或者正确,或者不正确)的可能性。
  • 除了 t-检验和卡方检验,你还可以使用其他若干种检验方法,这在 HypothesisTests 的文档中有详细的介绍。

思考题

1.如果识别出数据集中的两个变量高度相关,那么应该采取什么操作?

2.在假设检验中,满足什么条件,可以接受原假设?

3.在一个分类问题中,在什么条件下,你可以使用相关性来表示一个特征与分类变量一致的程度?

4.选择一个数据集进行探索,并记下所有有价值的发现。

5.对于不规则分布的变量,可以进行t-检验吗?

6.假设我们有一个由20位患者的数据组成的医疗数据集。使用标准的检验方法,可以对其中的变量得出统计上显著的结论吗?为什么?

7.要表示出数据集的特征空间,最好使用哪种统计图。

8.t-SNE 函数的主要用途是什么?

构建数据空间


  • 数据降维是数据科学中的一个基本环节,因为它可以压缩并精简数据集,使数据分析方法更加有效。降维后的数据集会占用更少的存储空间,并节约其他资源,这也是一个额外的收获。 数据降维有两种主要方法:仅使用特征(无监督)的方法,以及使用特征和目标变量组合的方法(监督式)。

无监督数据降维方法

  • 最常用的无监督数据降维方法是主成分分析(PCA)。这种统计方法适合于小型或中型的特征集。它使提取出的元特征能够最大化地解释原数据集中的方差。
  • 独立成分分析(ICA)是 PCA 的一种重要替代方法,它同样不使用目标变量。ICA 使互信息最大化,而不是方差。它同样可以生成元特征。

监督式数据降维方法

  • 监督式数据降维方法可以更进一步地分为基本方法(对单独的特征进行评价)与高级方法(对成组特征进行评价)。
  • 基本方法按照目标变量的类型,对每个特征都进行评价,选取出其中评分最高的。
  • 连续型目标变量:余弦相似度、皮尔逊相关性、其他相似性度量。
  • 离散型目标变量:费舍尔判别比、区别度指数、互信息。

高级方法

  • 连续型目标变量:基于遗传算法(GA)的方法。
  • 离散型目标变量:基于区别度指数或基于 GA 的方法。
  • 在进行数据降维时,没有一种方法可以包治百病。需要根据具体的数据和资源来做出选择。

思考题

1.给你一个包含1000000行和10000个特征的数据集。你会对这个数据集进行降维吗?如果会,你将使用什么方法?为什么?

2.你正在进行一个项目,其中有一个1000000行和500个特征的数据集。你会进行数据降维吗?如果会,你将使用什么方法?为什么?

3.在对初始的基因表达数据进行了大量优化工作之后,你得到了一个200行和5000个特征的数据集。你会对这个数据集做哪些数据降维操作?为什么?

4.给你一个10000行和20个特征的数据集,你会对这个数据集做数据降维吗?为什么?

5.一个统计学家研制成功了一种数据降维方法,通过检查所有可能的特征组合,可以保证找出最好的降维特征集合。你会在数据科学项目中使用这种方法吗?为什么?

6.与常用的统计方法(例如,PCA)相比,基于特征评价的数据降维方法的优点有哪些?

7.一位著名学者开发了一种方法,只要输入在统计上互相独立,就能够以极高的效率和表现来处理数据。要将数据集转换为可控的规模,你应该使用哪种数据降维方法?为什么?

8.给你一个1000000个特征和100000000行的数据集。很多特征彼此相关。你有充足的时间来挖掘这个数据集,目标是建立一个模型,使这个模型在降维后的数据集上具有最高的准确率。你应该使用什么方法?为什么?

数据抽样与结果评价


1.抽样

  • 抽样可以提供一个更容易处理的规模较小的数据集,同时(在某种程度上)保留初始数据集中的信息。 基本抽样不考虑数据集中的类别结构,对于相对均衡的数据集效果较好。在回归问题中,它是最常用的抽样方法。
  • 分层抽样要考虑每种类别中元素的数量,它生成的样本与初始数据具有同样的类别分布。这种抽样方法特别适合不平衡的数据集和 K 折交叉验证。 通过分类模型和回归模型的性能指标可以对模型结果进行评价。

2.分类

  • 评价分类模型的指标有好几种,最重要的是准确度(基本准确度和加权准确度)、精确度、召回度、F1、总成本(基于成本矩阵)和 ROC 曲线(及其相关指标)。多数指标都与特定分类问题的混淆矩阵相关。
  • 混淆矩阵是一个 qxq 的矩阵,表示分类器预测标签的正确程度以及错误预测的位置(q=类别数量)。对角线上的元素对应于正确分类。
  • 准确度是一个基本性能指标,表示正确分类数量与总预测数量的比值。它的值在0和1之间(越高越好),在平衡的数据集上效果很好。
  • 加权准确度是准确度的一个变种,它考虑了每种类别的重要性,并据此对指标值进行了转换。它适合不平衡的数据集,或我们对其中一种类别的预测结果更加重视的数据集。权重可以任意定义。
  • 精确度是表示分类器预测某种类别的可靠程度的一种指标。
  • 召回度是表示某种类别的元素被正确辨别出的比例的一种指标。
  • F1 是精确度和召回度的调和平均数,表示分类器在一个特定类别上的性能。
  • 成本矩阵是一个 q×q 矩阵,表示每种误判的成本(对角线上都是0)。它与加权准确度非常相似,可以用来计算一个分类器在某个数据集上出现误判的总成本。成本可以随意定义。
  • ROC 曲线可以表示出一个分类器的整体性能,适用于只有两个类别的分类问题。
  • AUC(曲线下面积的缩写)是一种二元分类器的性能指标,它基于 ROC 曲线,值在0和1之间(越高越好)。
  • Gini 系数是另一种基于 ROC 曲线的性能指标,它表示一个二元分类器优于随机猜测的程度。它的值在−1和1之间(越高越好),如果值为正,则说明分类器优于随机分类。

3.回归

  • 回归模型使用预测值与实际值之间距离的一些变种来进行评价。最常用的评价指标是均方误差(MSE)和误差平方和(SSE)。
  • 平方误差是一个向量,其中包含回归模型对各个数据点的预测误差的平方。误差就是实际值与预测值之间的差异。
  • MSE 是回归问题中平方误差的算术平均数。
  • RMSE 是回归问题中 MSE 的平方根。
  • SSE 是回归问题中平方误差的总和,它等价于以向量表示的预测值和实际值之间的距离的平方。

4.K 折交叉验证(KFCV)

  • KFCV 是一种评价策略,它将分类模型或回归模型运行多次,以使我们对模型性能有比较全面的认识,确保评价结果不会因某一个特殊的训练集或测试集而确定。
  • 执行 KFCV 时,要将数据集划分为 K 个大致相等的子集,在随后的 K 次实验中,每次使用一个子集作为测试集。
  • KFCV 中 K 的值要根据数据集规模来确定。规模比较大的数据集需要的 K 值较小,对于规模比较小的数据集,最好使用比较大的 K 值。
  • 留一法是一种特殊的 KFCV,这时 K 等于数据集中数据点的数量。它适合于非常小的数据集,在数据科学中不经常使用。

思考题

1.你能对具有连续型目标变量的数据集进行分层抽样吗?

2.对于严重不平衡的数据集,应该使用何种抽样方法?为什么?

3.哪种抽样方法产生的样本偏离最小?

4.能够给出一个总成本(基于误判成本)的标准定义,使它的值位于0和1之间吗?如何实现?

5.可以在三分类问题上应用 ROC 曲线吗?

6.对于任何问题都可以进行 KFCV 吗?给出一个例子来支持你的答案。

无监督式机器学习


  • 无监督式学习是一种没有目标变量的数据分析过程。
  • 无监督式学习可以从数据集中挖掘出深层次的知识,帮助我们更好地理解数据集,使监督式学习更加可控,并经常可以获得更好的效果。
  • 无监督式学习有很多类型,包括聚类、关联规则发现和混合分解。
  • 聚类是至今为止最常用的无监督式学习方法,已经被研究得非常充分。
  • 聚类方法可以使用很多种方式进行分类,最常用的是分割聚类和层次聚类,这种分类的重点在于聚类过程的目标。其他分类方法关注的是聚类算法的其他方面,比如确定聚类和随机聚类。
  • 分割聚类生成一定数量的互斥的子集(划分),每个子集中的数据点都尽可能相似,而与其他子集中的数据点尽可能相异。多数分割聚类算法都使用子集数量作为参数。
  • 绝大多数分割聚类方法本质上都具有随机性,分割聚类不但可以进行数据探索,还可以为分类问题找出目标变量。Julia 的 Clustering 扩展包实现了分割聚类方法。
  • K-均值方法是最常用的分割聚类算法,它根据数据点之间的距离将数据集划分成 K 个簇。它的速度特别快,在比较简单的数据集上效果非常好。要在 Julia 中应用 K-均值算法,可以使用代码:kmeans(data,K),这里的 data 是数据集(用行来表示特征),K 是簇的数量。
  • DBSCAN 是一种更加强大的分割聚类算法,它使用密度这个概念来处理难度更大的数据集。它的速度不如 K-均值那么快,但整体性能更好,而且不需要事先确定簇的数量。在 Julia 中运行 DBSCAN 可以使用如下代码:dbscan(D,d,K),这里的 D 是数据点两两之间的距离矩阵,d 是一个最小密度值,超过这个值的数据点就被认为是密集的,K 是计算密度时需要考虑的附近数据点的数量。
  • 层次聚类是另外一种聚类的方式,它将数据点逐渐组合在一起,直至形成一个独立的簇。最后得到一个树结构,可以在二维平面上将所有有意义的分组都表示出来。
  • 层次聚类主要用于数据探索。在 Julia 中,你可以使用 QuickShift-Clustering 扩展包来完成层次聚类,代码如下:quickshift(data),其中 data 是数据集(用行表示特征,和前面一样)。你可以使用代码 quickshiftplot(Z,data,labels)来查看结果中的树结构,其中 Z 是 quickshift()函数的输出,labels 是聚类算法分配的标签(quickshiftlabels(Z)的输出)。
  • 所有聚类方法都会使用某种相异度指标,比如欧氏距离。在 Julia 的 Distances 扩展包中,提供了若干种距离度量方式。
  • 通过几种不同的度量方式,可以对聚类系统的输出进行验证,最常用的度量方式是 Silhouette 和信息变异度。现在 Julia 中只完整实现了 Silhouette(参见本章笔记本文件)。
  • Silhouette 是一种基于距离的度量方式,它的值在-1和1之间,表示与其他簇相比,数据点与其属于的簇之间的相近程度,值越高越好。通过 Julia 自定义函数 sil():sil(Labels,D)可以计算出这个指标,这里的 labels 是一个向量,其中包含聚类模型分配的标签,D 是数据点两两之间的距离矩阵。
  • 要想更加有效地进行聚类,需要注意以下几点。
  • 控制特征数量,使其总数较少(在不损失大量信息的情况下尽可能地减少特征数量)。
  • 对聚类过程中使用的所有特征和元特征进行标准化。
  • 创建可视化图形,来理解各个簇以及簇之间的联系。
  • 检查簇中心点,获得关于簇的性质的额外信息。

思考题

1.在聚类中,距离为什么非常重要?

2.对于特别复杂的数据集,你应该使用哪种聚类方法?

3.为什么不能使用第9章中介绍的度量方式来评价聚类系统的输出?

4.所有类型的数据都可以被聚类吗?在聚类之前,你需要注意什么?

5.分割聚类与 t-SNE(第7章)有什么不同?

6.数据科学中必须要进行聚类吗?为什么?

7.数据维度是如何影响聚类的效果的?有什么应对方法?

8.在一个已经标准化的数据集中,如何强调一个特征,使其在聚类过程中发挥更大的作用?

监督式机器学习


  • 监督式学习包括分类和回归方法,是应用最广泛的数据科学方法,因为多数有价值的成果都来自于这种方法。
  • 现在有多种监督式学习方法。在本章中我们要重点介绍的是:基于树的方法、基于网络的方法和统计回归。
  • 基于树的方法:基于树形机器学习系统的方法包括决策树、回归树和随机森林。
  • 决策树是一种简单而有效的分类系统,它使用多个二元选择,通过特征来对数据进行分类,直至得到一个可能性足够高的目标标签。决策树使用简单,解释性好。
  • 回归树是决策树的回归应用。
  • 随机森林是一组共同工作的树,可以解决分类问题或回归问题。随机森林的性能优于其中任何一颗单个的树,有助于确定数据集中某个特征的值。
  • 基于网络的方法:这些方向需要建立一个网络(图),网络的每个部分都带有通过训练阶段建立的模型的信息。它们通常要比基于树的方法复杂,它们都需要用图来表示泛化能力。最常用的基于网络的模型是神经网络,极限学习机也在不断取得进展。
  • 人工神经网络(ANN)是一种高级的监督式学习方法,它模拟大脑组织的功能,从数据中提取出有用的特征,并以此来预测未知数据点。它既可以用于分类问题,也可以用于回归问题。ANN 可以用 Julia 中的多个扩展包来实现,其中最好的是 BackpropNeuralNet。与其他分类器不同,ANN 需要对目标变量进行特殊的预处理,才能与算法兼容。
  • 极限学习机(ELM)与 ANN 非常相似,但是它的训练阶段要快捷得多,因为它将整个训练过程简化成了一个简单直接的可以使用分析方法解决的最优化问题。还有,它的性能也非常好,参数(隐藏层的数量,每层节点数量)调整也相当容易。ELM 可以在 Julia 中使用 ELM 扩展包实现。
  • 统计回归(也称为广义回归模型):这是一种经典的回归方法,它使用可用特征的各种线性组合或非线性组合,将表示预测值和实际值之间差异的误差函数最小化。统计回归速度非常快,也非常容易解释。能实现的统计回归的最好的扩展包是广义线性模型扩展包(GLM)。
  • 其他监督式学习系统包括支持向量机(SVM)、直推式系统、深度学习系统和贝叶斯网络。
  • 提升决策树与随机森林有些相似,是一种基于树进行分类的组合式方法。在 Julia 中,DecisionTree 扩展包非常好地实现了这种算法。
  • SVM 是一种非常聪明的监督式学习方法(特别对于二元分类),它可以改变特征空间,找出分类的最佳边界。
  • 直推式系统是一种基于距离或相似度的监督式学习方法,通常用于分类问题。它通过找出已知数据点和未知数据点之间的直接联系来进行预测,省略了泛化阶段。它不建立模型,一般来说速度很快,但难以解释。
  • 深度学习系统是当今最为复杂的监督式学习系统。它是传统 ANN 的增强版本,具有更多的层和输入节点,它需要大量数据才能收到好的效果。深度学习主要用于传统方法难以发挥作用的专门的领域,比如图像分析。尽管它需要较长的训练时间并且消耗大量资源,但是它可以很好地模拟人类大脑的功能,是目前最高级别的主流 AI 技术。
  • 贝叶斯网络是一种基于网络的监督式学习方法,它基于图论和贝叶斯统计对问题进行建模。通常来说,它要比其他方法更消耗时间,但效果非常好,特别是当特征彼此独立的时候。

思考题

1.你有一个包含200个数据点和100个特征的数据样本,其中多数特征都是独立的。你应该使用哪种监督式学习系统?为什么?

2.对于一个结构良好的数据集,其中特征的信息非常丰富,并且在统计上彼此独立,那么最好的分类系统应该是什么?

3.对于一个海量的数据混乱的数据集,最合适的分类方法是什么?

4.一个鲁棒性非常好的监督式学习系统不需要进行数据工程吗?解释一下。

5.如果在你的项目中,可解释性非常重要,那么最合适的监督式学习系统是什么?

6.对于回归问题,统计回归与神经网络之间的关系是什么?

7.监督式学习中的直推式系统的主要局限性是什么?如何克服?

8.既然深度学习方法这么好,为什么不是所有人都应该使用?

9.你正在处理一个每分钟都在更新的数据集。为了确保预测及时,应该使用哪种监督式学习系统?

10.除了预测,你还可以使用深度学习网络做些什么别的事情?如何做?

11.如何计算出 ELM 预测的正确概率?

图分析


  • 图非常适合于某种问题的建模,它也可以用于很多种数据集。
  • 图没有维度,因为它是数据的一种抽象表达,重点在于数据之间的联系。联系可以是数据点之间、特征之间、类别之间或任何其他数据之间的内容。
  • 图可以是有向的,也可以是无向的,分别对应于节点之间的联系是单向的还是双向的。
  • 图的定义可以通过边列表(包括每种联系的方向)以及相应的权重(如果有的话)来实现,或者通过连接矩阵(或邻接矩阵)来实现。
  • 对于一个给定的图 g,我们可以计算出若干统计量,最重要的统计量如下:
  • 节点数量——num_vertices(g)。
  • 边的数量——num_edges(g)。
  • 节点集合——vertices(g)。
  • 边的集合——edges(g)。
  • 是否有向图——Graphs.is_directed(g)。
  • 节点 x 的度——out_degree(x,g)。
  • 节点 x 的邻居——Graphs.out_neighbors(x,g)。
  • 图的度——图中所有节点的度的最大值。
  • 环检测需要找出是否有一条路径,从一个点开始并在同一个点结束。环检测有很多应用,对于特征选择尤其重要。你可以使用函数 test_cyclic_by_dfs(g)来在图 g 上执行环检测。
  • 没有环的有向图称为有向无环图,简称 DAG。
  • 连通子图是一组彼此可达的节点的集合(也就是说,对于集合中任意两点 A 和 B,都有一条路径可以从 A 到达 B)。通过函数 Graphs.connected_ components(g),可以找出图 g 中所有连通子图。 团是图中一个彼此相连的节点集合。因为在图中经常存在若干个团(特别是社交网络中),所以我们一般考虑其中最大的那个,称为最大团。
  • 最大团是图中最大的团。根据我们所检查的图中不同部分,通常有多个最大团。通过函数 Graphs.maximal_cliques(g),我们可以找出图 g 中所有最大团。
  • 图中连接节点 x 和其他节点的最短路径一般是非常重要的,因为使用它可以有效地在图中进行移动。要想在图 g 中为节点 x 找出这些最短路径及其距离,可以使用 Dijktra 算法,它使用函数 Graphs.dijkstra_shortest_paths(g,ww,x)来实现,这里的 ww 是对应于图中各条边的权重向量,表示某种相异度或距离。函数会生成一个对象,其中包含若干条与节点 x 的最短路径相关的信息。这个对象最重要的属性如下。
  • Parents:与节点 x 相关的每个节点的父节点列表。对于某个检查节点来说,这个父节点是到达 x 节点要经过的最近的节点。请记住节点 x 的父节点就是它自己。 Dists:由对应于每条路径的距离所组成的列表。
  • 最小生成树(或 MST)是一个无环图,它可以连接一个图中的所有节点,并且总体权重最小。可以使用两种算法计算出一个图中的 MST:Prim 算法和 Kruskal 算法。后者在 Julia 中更易于使用,可以通过函数 kruskal_minimum_spantree(g,ww)来实现。这个函数的输出是两个对象:E 和 W,分别表示 MST 的边列表和相应边上的权重。
  • 你可以使用 LightGraphs 扩展包来保存和加载图,如下所示。
  • 保存图 g:save(fn,g,gn),这里的 fn 是要保存图 g 的数据文件的名称,gn(可选参数)是在数据文件中用来引用图的名称。
  • 加载图 g:load(fn,gn),这里的 fn 是保存图的数据文件的名称,gn(可选参数)是要取出的图的名称。这个函数的输出是一个 LightGraphs 图对象。如果你没有使用第二个参数,就会得到一个字典,里面包含所有保存在数据文件中的图。
  • 如果你想图可以同时被 Graphs 扩展包和 LightGraphs 扩展包所使用,那么可以将图从一种类型转换为另一种类型。这可以通过自定义函数 G2LG()和 LG2G()来实现,这两个函数可以将图对象在 Graphs 类型和 LightGraphs 类型之间进行转换。
  • Julia 在图分析领域中可以发挥重要的作用,理由是它的高性能,并且可以容易地实现和理解图分析任务所用的算法。

思考题

1.为什么图在数据科学中的用处非常大?

2.如何使用图分析来提高特征集合的可靠性?

3.所有问题都可以用图来建模和分析吗?为什么?

4.可以使用 MST 作为分类系统吗?解释一下。

5.可以在数据集上直接使用现有的图分析工具吗?为什么?

6.编写程序在给定图中找出最大生成树。(提示:如果你使用一个图分析扩展包中的函数作为基础,那么程序就会非常小。)

7.保存图(gg)的数据文件中包含了图的所有信息吗?为什么?

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Julia 入门
    • 思考题
    • Julia 进阶
      • 思考题
      • Julia 数据科学应用概述
        • 思考题
        • Julia 数据工程
          • 思考题
          • 探索数据集
            • 统计图
              • 假设检验
                • 思考题
                • 构建数据空间
                  • 无监督数据降维方法
                    • 监督式数据降维方法
                      • 高级方法
                        • 思考题
                        • 数据抽样与结果评价
                          • 思考题
                          • 无监督式机器学习
                            • 思考题
                            • 监督式机器学习
                              • 思考题
                              • 图分析
                                • 思考题
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档