“机器学习MLDT”图书翻译稿

转自:http://ask.julyedu.com/article/294

Machine Learning_Hands-On for Developers and Technical Professionals-Wiley(2014)

【 译者按】承蒙机械工业出版社秦编辑的邀请,从今天起,开始“Machine Learning_Hands-On for Developers and Technical Professionals”的翻译工作。下面是粗略翻译的前言,随后的章节持续发布。欢迎大家批评指正,我认真修改翻译内容,力图呈现一本优质的机器学习图书供广大科技人员和在校研究生参考。最后,由于尚未公开发表,若转载此文请注明出处:
http://ask.julyedu.com/article/294

请大家对翻译质量提出宝贵意见,我将根据大家的意见认真修改、斟酌、完善。
我建了一个QQ群:481628926,有愿意做校对或者翻译其中章节的朋友,欢迎加入。
共同努力,力争完成2015-2016年度最好的中文机器学习译著!

      邹博
    2015年8月3日

===============================

前言
数据,数据,数据!想必在新闻、报刊、白皮书、电视等媒介的持续冲击下,人们无法摆脱大数据和数据科学的洗礼。现实需求推动了对数据的学习、分析和应用,这些数据来自于社交媒体、智能手机、硬件设备(亦称作“物联网”)、传感器等任何可以产生数据的设备。
大多数数据挖掘的宣传着重于数据规模和处理速度上。数据洪水(data flood)的预言告诉人们我们无法实时处理这些数据,硬件推销人员会进一步卖给我们需要的服务,以期能够满足处理速度的要求。从某种程度上来说,他们是对的,但是我们值得停下来思考片刻,并对手边的任务进行适当的再认识。
近年来,数据挖掘和机器学习在我们周围持续火爆,各种媒体也不断推送着海量的数据。仔细观察就能发现,实际应用中的那些机器学习算法与多年前并没有什么两样;它们只是在应用的数据规模上有些不同。历数一下产生数据的组织,至少在我看来,数目其实并不多。无非是Google、Facebook、Twitter、NetFlix以及其他为数不多的机构在使用若干学习算法和工具,这些算法和工具使得他们能够对数据进行测试分析。那么,真正的问题是:“对于其他人,大数据框架下的算法和工具的作用是什么呢?”
我承认本书将多次提及大数据和机器学习之间的关系,这是我无法忽视的一个客观问题;但是它只是一个很小的因素,终极目标是如何利用可用数据获取数据的本质内涵。请记住我是在探讨工具,关键点是选择哪个工具来胜任我们尝试完成的工作。迫于技术上的压力,可能会选择Hadoop,但是Hadoop并不一定总是完成任务最好的选择。

本书目的
本书是关于机器学习而非大数据的,书中会介绍多种用于分析数据本质的技术。读完本书,您将掌握许多有用的机器学习方法的实际运用,并分析、解释算法实现中如此组织代码的原因。本书针对具体实际问题选择哪种恰当的方法会提供推荐的建议。
本书没有固定的阅读顺序。您可以从头读到尾,或者选择性阅读您需要的内容。

“实践”意味着亲自动手
过去的几年里,我读过的许多关于机器学习的书都非常重视理论,这并不是什么坏事。如果您正在看一本使用复杂公式、深入讲解数学理论的书,我要为您的严谨喝彩。对于我而言,我更加关注使用何种机器学习方法及其工程实践。我的信条很简单:
 在头脑中思考一个问题;
 找到我需要学习的理论;
 找到和我要学习的理论最相关的例子;
 在我的实践工程中让它们发挥作用。
作为软件开发人员,我个人喜欢看很多示例。作为一名老师,我喜欢尽可能多的亲自实现它并且尽可能简单的将内容传授给我的学生:大概过程是指出关键点,在IDE环境中敲完正确的代码,然后让它产生作用。这是令人振奋并且很有成就感的事情,并且我在本书中也希望传达这样的思想。
每个人都有自己的学习方式。我相信本书涵盖了大多数的通用方法,所以,相信每个人都能从中获益。

“如何对待数学?”
就像论您最喜欢哪支足球队?吉他手吉米•佩奇(Jimmy Page)和杰夫•贝克(Jeff Beck)哪个更帅气(嘿,本人更喜欢贝克)?有些话题是没有标准答案的。比如这个问题:在开始做机器学习之前,我需要知道多少数学知识?
做机器学习和学习机器学习的理论是两个不同的概念。为了学习理论,显然需要一个好的数学背景。本书讨论机器学习的实践方法。现在已经有了很多可被开发者利用的机器学习工具,当前的重点不是为什么这些工具有用,而是如何让这些工具为我所用。前人已经完成了艰难的工作,他们值得我们给予尊重和掌声。

“但是您需要一个博士!”
同行的一些言语或许会葬送您的研究之路。在您开始做数据分析或者敢于声称自己是“数据科学家”的时候,会长期充斥着关于您应该具备什么样的知识层次这样的争论(我将马上剖析“数据科学家”这个术语)。个人而言,我相信如果您能够花费多年去完成一个学位,追求硕士学位然后是博士学位,您应该会在那条路上感到自由。我对待事情更加注重实用性,并且喜欢边阅读资料边动手实践。
学术环境很关键;现在有大量的在线课程、论文、网站以及关于数学、统计、数据挖掘方面的书籍,足够让您跟上最新最热的思想。我从中获取了很多资源。
但是,对于我,最直接的莫过于甩开袖子,获得书籍,尝试一些方法,并且检验它们的结果。如果您想重温一下线性回归的理论,我再次向您保证有很多资料可以阅读,本书也将涉及它们。
最后,大家能够成为“数据科学家”吗?或许本书更有可能的结果是:带给大家更多的机器学习实践技能。我将在第二章再次讨论这个话题。
所以,当办公室的其他人还在争论是否需要在项目组中增加几个博士的时候,您已经开始用代码实现一个决策树并且检验它是否切实可行了。

最终您会学到什么?
假定您将本书从头读到尾,您将学到机器学习的常用策略、机器学习的不同方法、以及如何将它们应用在实时和批处理的环境下。
或者,您也可以直接参考您需要的某一个章节。本书各章节之间联系并不紧密,每一章的内容和实例和其他章节并无太多相关性。
本书的目的是以实例的方式讲述通用的机器学习概念。在各种工具和软件库中选择适合您的那个,借助已有工具的方式能够让您快速学习掌握相关知识,同时对于深刻分析、理解当前数据不会有太大影响。

理论和实践学习的平衡
现在已经有很多关于机器学习和数据挖掘的书籍,难点在于如何找到理论和实践的平衡点。当筹划本书时,我会将重点放在实际和易用的例子上,提供逐步的指导,并且让您能看到如何把这些技术组合在一起。
我并没有说要轻视理论,恰好相反,理论是极其重要的。清楚您想学什么,或者更重要的是您想怎么学,将决定您如何阅读本书。
前两章介绍机器学习和数据挖掘的定义、实践中所使用的相关工具以及它们产生的效果,为接下来真正的机器学习算法做准备。主要章节(3到8章)聚焦于不同类型的机器学习理论上,类似游戏攻略,每章将给出代码片段的解释,再配合其他方法,保证您能够从中获得需要的知识。
最后,您将对比实时和批处理两种环境下的方法,并且考察如何将它们整合在一个大的算法框架中;您还将了解到Apache Spark和R语言,它是统计的根本语言。

章节概述
第一章阐述“什么是机器学习”,考察机器学习的定义和用途,并且指出您将遇到的算法方面的挑战。同时还讨论人类自身的“机器学习”过程,探讨下人类建立的模型是如何在将来产生作用的。
在任何实际编程之前,都应该做好计划。第二章“为机器学习做好计划”的重点就是完成这一步。计划包括一组分析和展示方法、数据处理过程、确定存储空间、数据私有性、数据质量和清洗(data cleaning);须知,没有任何一种方法能够胜任所有任务。第二章将通过一些简单的Linux命令帮助您整理需要处理的数据。
决策树是机器学习中的常用方法。在模型中使用观测结果或者样本标签以及众多的输入数据(信号、特征),机器学习的算法就能够预测新数据的可能结果。第三章考察决策树的设计,并使用Weka实现一个决策树实例。
贝叶斯网络表示了一组随机变量的条件独立性。第四章将构造一个简单的例子,展示贝叶斯网络是如何工作的,并且提供一些可用的代码。
受生物领域中枢神经系统工作方法的启发,神经网络模型被应用在深度学习系统中。第五章将考察机器学习的这一分支是如何起作用,并且阐述把输入样本传递给网络结构的具体过程。
如果您关注购物篮分析(basket analysis),您将会喜欢第六章涉及的关联规则学习,从而找到大数据集之间的联系。本章将细致的考察Apriori算法以及它是如何应用在当前的超市行业的。
支持向量机(SVM)是一个监督学习方法,用于分析数据和模式识别。第七章将给出文本分类等实例,展示SVM是如何工作的。
第八章讲解聚类——对象间的分组;例如,聚类能够在市场细分分析(Market Segmentation Analysis)的应用中工作的很好。在初始学习阶段,聚类算法是最好的逐步迭代减少分类误差的机器学习方法。
第九章和第十章是实例攻略。第九章的例子关注实时处理。您将使用Spring XD——它甚至可以称作“数据吸收引擎”(data ingesting engine),同时利用流式的推特应用程序接口(streaming Twitter API),只要有新的推特消息(Twitter),就把它们收集起来,从而准备好数据,在第十章做进一步处理。
第十章考察机器学习的批处理过程。使用第九章获得的数据,您可以搭建Hadoop的聚类模型并且运行多个作业。本章介绍使用Sqoop获得数据库中数据的常用方法,如何使用Mahout执行用户推荐, 以及如何使用Hadoop和Pig分析个性化用户数据。
第十一章介绍机器学习舞台上的新成员。这一章考察Apache Spark,并且介绍Scala语言,它可以针对内存数据执行类似于SQL的查询语句。
R语言是世界范围内统计工作的重要语言,第十二章将介绍和分析R语言。您可以使用它来实现本书前面章节涉及的机器学习算法。

本书的源代码
本书每一章阐述的所有代码都保存在Github库上供大家下载调试。Github的地址是https://github.com/jasebell/mlbook。您也可以访问Wiley个人网站找到代码: www.wiley.com/go/machinelearning。
本书的例子是使用Java实现的,如果您想使用其他语言实现,可以搜索下Github网站,或许能找到很多有趣的例子。
代码已经按照章节分好了,代码包中每章都有各自的文件夹。如果某一部分需要额外的库,文件夹中会有一个README注释文件。

使用Git
Git是一个在业界和开源软件社区广泛使用的版本控制系统。如果软件是团队开发,Git将非常重要。您可以使用它在代码的各个分支上工作,最后将分支合并在一起。
本书使用Git并不多,但是如果您希望使用本书的代码库,您需要克隆一份实例。
为了克隆本书的实例,可以使用下面的命令:
mkdirmlbookexamples cd mlbookexamples
$git clone https://github.com/jasebell/mlbook.git
您可以看到克隆进度,当它完成的时候,您能够改变文件夹,在新下载的目录中查阅代码实例。

第一章 什么是机器学习(前半部分)
让我们从最初开始,回顾一下它的历史,看一下机器学习到底是什么及其在工业界的适用场景。这一章也描述本书中要使用的一些软件,以便您可以提前安装好所需软件,为具体实践做好准备。

机器学习的历史
机器学习的定义是什么?在过去的六十年里,一些工业界先驱者们已经做了大量工作为我们指明了正确的研究方向。

阿兰•图灵 Alan Turing
图灵在1950年的论文《计算机与智能》(“Computing Machinery and Intelligence”)中,提出一个问题:“机器能够思考吗?”(完整论文可以在这里下载:www.csee.umbc.edu/courses/471/papers/turing.pdf)这篇论文描述了“图灵实验”,该实验涉及三个参与者:一个担任法官的人,另一个作为选手的人,以及一台尽力让法官认为自己是人类的计算机。法官将自己的问题输入终端程序来与另外两个参与者对话。选手和计算机都要做出回答,法官据此判断哪个是计算机,哪个是人。如果法官无法判断回答来自于选手或者计算机,那么,计算机就算挑战成功。
这个测试原则一直到今天还在使用,人工智能领域每年的重要赛事罗布纳奖(Loebner Prize)就采用图灵测试。赢得该奖非常简单:让法官相信正在与他们对话的是人类而不是一个机器。

亚瑟•塞缪尔(Arthur Samuel)
在1959年,亚瑟•塞缪尔给出了机器学习的定义:“机器学习是不使用确定性编程算法为计算机提供学习能力的研究领域”。 塞缪尔专注于让计算机学会游戏策略的方法,由于在IBM期间设计完成了能够自主学习的计算机程序而广受赞誉。
塞缪尔选择的游戏是西洋跳棋,因为这个游戏很简单但是需要程序学习游戏策略。他使用α-β估值剪枝(删减那些不需要估值的结点)和最小最大策略(minimax,对于最差情况的最小损失)程序能够降低移动数目的搜索,从而降低程序运行中所需要的昂贵内存。
塞缪尔由于在人工智能领域的共享广为人知,但他也因为是历史上最早几位使用Hash表的程序员而受到尊敬,塞缪尔对IBM产生了重大的影响。

汤姆•M•米切尔(Tom M Mitchell)
汤姆•M•米切尔是卡内基梅隆大学(Carnegie Mellon University)机器学习主席,《机器学习》(“Machine Learning”)一书(McGraw-Hill, 1997)的作者。他给出的机器学习定义经常被人们所引用:
对于某给定的任务T,在合理的性能度量方案P的前提下,某计算机程序可以自主学习任务T的经验E;随着提供合适、优质、大量的经验E,该程序对于任务T的性能逐步提高。
这里最重要的是你现在有了一组定义机器学习的对象:
任务(Task,T),一个或者多个
经验(Experience,E)
性能(Performance,P)
即:随着任务的不断执行,经验的累积会带来计算机性能的提升。

总结定义
机器学习是人工智能的一个分支。我们使用计算机设计一个系统,使它能够根据提供的训练数据按照一定的方式来学习。随着训练次数的增加,这个系统可以在性能上不断学习和改进,通过优化该学习模型,能够基于先前学习得到的参数来预测相关问题的输出。

机器学习的算法类型
在机器学习中你可以使用多种不同的算法,所需输出决定了使用何种算法。当学习不同章节时,你将看到不同类型的算法是如何在实践中应用的。典型地,机器学习算法可以分成两大类:监督学习和非监督学习。

监督学习
监督学习算法工作在一组带标记的训练数据上。对于训练数据中的每一个样本,都存在输入对象和输出对象。比如对推特数据(Twitter)的分类。(Twitter数据在本书的后面章节将经常使用。)假定你从Twitter上获得了下列数据,这些组成你的输入数据对象:
真心喜欢圣文森特(St Vincent)的新唱片!
售卖鲁布托高跟鞋(Louboutins),谁感兴趣?
我已成功让我的Hadoop集群工作在一组数据上。
为了你的监督学习分类关联每一条推特的输出结果,你必须手工添加每一个标记。为了清晰,我已经在每一行的开始加上了合适的输出结果。
音乐:真心喜欢圣文森特的新唱片!
服装:售卖鲁布托高跟鞋,谁感兴趣?
大数据:我已成功让我的Hadoop集群工作在一组数据上。
显然,当分类器运行时,为了让分类器理解这些数据,你需要为大量的更多的数据手工加入合适的标记。无论如何,你所需要的是能够用于后面分类的训练数据集。
有一些关于监督学习必须考虑的问题。偏差方差困境(bias-variance dilemma)就是其中之一:使用不同的训练集,机器学习模型的执行精度如何?高偏差模型只在噪声低的训练集上是适用的,而高方差模型常常是依赖增加模型的复杂度来解决训练数据的噪声问题。最好的办法就是对这两类模型的折中,因此,关键问题成为如何选择这个折中以及何时应用何种模型。

无监督学习
与监督学习相反的方法即无监督学习,它是能够找到一组数据隐含关系的算法。使用无监督学习时答案没有对错之分,可以直接运行机器学习算法并且查看得到的模式和输出。
无监督学习或许比实际的学习更接近数据挖掘的本质。比如,如果你正在做数据的聚类算法,那就很有必要花费更多的时间来比较下聚类这种无监督学习和人工神经网络这种使用先验信息训练的有监督学习算法。

人的作用
输出将会改变,数据将会改变,需求也会改变。机器学习绝非以不变应万变的理论,它需要人类的双手和智慧来完成这些算法。别忘了塞缪尔的国际跳棋程序也仅仅是人类把程序实现,教给计算机如何下棋。计算机需要人类才能运行,才能建立基本的知识。请切记这一点。
通过本书我将探讨“清楚理解正在试图解决的问题”本身的重要性。提出问题是任何数据工程的基石,后面将通过开放式讨论和计划来探讨这个话题。(在第二章可以获得更多的内容“机器学习计划”。)
只有很少的情况,你能够把数据丢给机器学习算法,从而让算法立刻获得数据的内在联系。

机器学习的用途
那么,使用机器学习能够做什么呢?答案是:能够做的领域非常多。本节将用途划分并且描述当前机器学习是如何使用的。

软件
在软件中广泛使用机器学习来提升用户体验。一些软件自带的算法库能够在用户使用后学习用户的行为,在使用软件一段时间后,能预测用户的想要做什么。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要对时间序列数据进行处理。一种常见的方法是使用滑动窗口将时间序列划分为多个子序列,然后对每个子序列进行特征提取。在这里,我们可以使用滑动窗口的方式,将每个患者的数据划分为多个子序列,并对每个子序列进行特征提取。 接下来,我们使用机器学习算法进行训练和预测。由于是多标签时序二分类问题,我们可以使用多标签分类算法,如Multi-Label k-Nearest Neighbor (MLKNN)、Multi-Label Decision Tree (MLDT)、Multi-Label Random Forest (MLRF)等。在这里,我们以Random Forest为例,给出代码实现。 ```python import pandas as pd from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, f1_score, hamming_loss # 读取数据 data = pd.read_csv('data.csv') # 数据预处理 data.fillna(method='ffill', inplace=True) # 使用前向填充缺失值 data.dropna(inplace=True) # 删除剩余的缺失值 # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(data.drop(['id', 'label'], axis=1), data['label'], test_size=0.2, random_state=42) # 训练模型 rf = RandomForestClassifier(n_estimators=100, random_state=42) rf.fit(X_train, y_train) # 预测测试集 y_pred = rf.predict(X_test) # 评估模型 print('Accuracy:', accuracy_score(y_test, y_pred)) print('F1-score:', f1_score(y_test, y_pred, average='weighted')) print('Hamming Loss:', hamming_loss(y_test, y_pred)) ``` 在这个示例中,我们使用Random Forest作为分类器,使用train_test_split将数据分成训练集和测试集。在训练之前,我们使用前向填充缺失值,然后删除剩余的缺失值。在预测过程中,我们使用predict函数预测测试集的标签,并使用accuracy_score、f1_score和hamming_loss评估模型。 当然,这只是一个简单的示例,实际应用中还需要根据数据的特点进行一定的调参和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值