机器学习笔记1 - Hello World In Machine Learning

前言

Alpha Go在16年以4:1的战绩打败了李世石,17年又以3:0的战绩战胜了中国围棋天才柯洁,这真是科技界振奋人心的进步。伴随着媒体的大量宣传,此事变成了妇孺皆知的大事件。大家又开始激烈的讨论机器人什么时候会取代人类统治世界的问题。

其实人工智能在上世纪5、60年代就开始进入了理论研究阶段,人们在不断探索人工智能技术的同时,也担忧起机器人会不会替代人类。然而现实比理想残酷的多,由于当时各种条件的限制(理论基础、技术基础、数据基础、硬件性能等),人工智能相关的项目进度缓慢,也缺少实际成效,研发资金、社会关注度也越来越低,人工智能进入第一次低谷期。

到了80年代,卡内基梅隆大学为数字设备公司设计了一套名为XCON的“专家系统”。这是一种,采用人工智能程序的系统,可以简单的理解为“知识库+推理机”的组合,XCON是一套具有完整专业知识和经验的计算机智能系统。人工智能再一次被各国政府和科研机构看好,大量的资金投入到研发中,但是好景不长,几年后随着苹果和IBM公司研发出了性能强劲的PC机,导致“专家系统”变得没有竞争力,人工智能发展又一次进入寒冬。

随后若干年,人工智能的发展趋于平稳和低调。时间来到21世纪,随着互联网的普及,大量数据被积累下来;摩尔定律一次又一次的被证实,计算机硬件性能以极快的速度在增长;“云”的普及,让普通大众也能轻松拥有调度大量算力的机会,人工智能不再是科学家和专业人员在实验室才能研究的东西了。数据+算力+易得这几方面的因素结合之后,将人工智能再一次推向了高潮。

可能这一波热潮又是人工智能发展史上的一个波峰,未来人工智能还有很长的路要走。但目前的人工智能发展已经惠及到商业领域,在这样一种技术+商业的结合中,我个人还是很看好这次浪潮的。尤其是在看过《最强大脑》中,百度在图像、音频方面的人工智能技术发展到这样一个水平之后(图像识别已经超超越了人类大脑对图像的识别能力,声音识别也几乎和人类最高水平持平),很希望自己也可以有机会涉足到这个领域中。

机器学习基础入门知识

机器学习是人工智能的一个分支,主要是通过数据+算法来训练得出模型,再用模型来预测数据的一种技术。

刚开始接触机器学习,发现基础理论中好多都是大学里学过的数理知识(一直以来困扰我的“大学为什么要学这些东西”的谜团总算被解开了:)。我个人做了Web开发近十载,大部分是应用级的,很少涉及数理算法,看来今后还要慢慢拾起这些知识。不过刚开始入门可以循序渐进,先弄懂机器学习是怎么回事,动手做一个“Hello world”,然后再逐步深入原理层面的知识。

要涉足机器学习,最好会一种编程语言,这点上我们程序员有先天优势。目前用于机器学习的主流语言是PythonRR我个人还没研究过,个人觉得Python是一个比较好的选择,流行度高、上手难度低、科学计算类库丰富、语法精简,如果本身就有其他面向对象的编程语言基础,不到一周就可以基本掌握Python了。

机器学习从从业分布来看,可以分成基础算法研究(设计师)和应(ban)用(zhuan)两个领域,其中大部分人都是在应(ban)用(zhuan)这个领域。

如果从技术层面来看,机器学习分成监督学习无监督学习以及半监督学习。如何来区分呢?首先解释下机器学习中的几个名词。

  • 特性(Features) - 其实就是数据
  • 分类器(Classifier) - 其实就是算法
  • 标签(Labels) - 其实就是种类
  • 模型(Models) - 其实就是最终输出的分类公式

监督学习,就是在有标签的前提下,找到一种最合适的分类器,分析特性标签之间的关系。
无监督学习,就是没有标签的前提下,将数据进行聚类(Clusting)
半监督学习,就是部分特性标签,部分则没有的状况(大部分特性可能是没有标签的情况)下进行分类。

监督学习相对来说最简单,由已知特性标签,利用合适的分类器训练出模型,再以模型套用到数据中来预测出数据的标签。当然,分类器并不需要我们自己来发明创造,我们大部分人也没这个能力做这些事情,所有的理论研究、科学论证、代码实现都是现成的。Python中有很多相关类库,比如scikit-learn。应用层面的机器学习,其实就是通过不停的调参(收集更多的数据、变换算法、选取合适的特征数据等工作)来找到一种更精准的预测模型的工作。

Hello World In Machine Learning

假设我们现在需要区分皮球(以直径15cm-25cm之间的球为例)和甜瓜的图片,如果是传统的硬编码的方式来写代码的话,可能需要写几百上千个if-else才能完成一个基本的算法,而且可扩展性特别差,比如如果图片是黑白的或者图片中有干扰物品,那可能需要修改源代码,添加更多的if-else来增加准确度。更糟的是,真正执行的时候会遇到很多事先没有预料到的特殊情况。
但如果通过机器学习,这个事情可能就会变得很简单。大致步骤如下:

  1. 将图片转换成特征向量(这个进阶知识不在本篇中涉及)
  2. 决定一种合适当前场景的分类器
  3. 结合1中得到的特征2中得到的分类器训练出模型
  4. 模型中的公式预测数据,估算出其属于某个标签的可能性,最大可能性的那个即模型推算出的结果

数据准备

转换过程略,假设共N条数据,转换得到的特性如下:

直径(厘米) 形状 颜色 标签
24 round white melon
35 ellipse white melon
24 round orange ball
24 ellipse yellow melon
22 round yellow ball
... ... ... ...

实现代码

features = [
    [24, 'round', 'white'],
    [35, 'ellipse', 'white'],
    [24, 'round', 'orange'],
    [24, 'ellipse', 'yellow'],
    [22, 'round', 'yellow'],
    ...
]

labels = ['melon', 'melon', 'ball', 'melon', 'ball']

我们知道,计算机处理基础数据类型的速度,由快及慢为:boolintfloatstring...,因此,我们在处理数据的过程中,需要把原始数据抽象成计算机能最快处理的数据类型(因为机器学习运算量极大)。因此上面的代码经过转换之后:

# round:1, ellipse:2
# white:1, orange:2, yellow: 3
features = [[24, 1, 1], [35, 2, 1], [24, 1, 2], [24, 2, 3], [22, 1, 3]]

# melon:1, ball: 2
labels = [1, 1, 2, 1, 2]

这里顺便提一下,大部分机器学习中,都是以GPU的性能来衡量处理速度的,而不是我们一般使用的CPU,这是因为GPU的物理架构和CPU不一样,GPU是专门为了处理图像而设计的,它对浮点数的处理速度是CPU的数十倍乃至数百倍。而机器学习基本上可以看做是对浮点数的大量运算,因此GPU更适合在机器学习领域被使用。

算法选取

机器学习中,解决一个问题的算法并不是唯一的,同一个问题可以适用不同的算法来解决,一般都会在效率准确率之间做权衡。本例中我们使用决策树(Deccision Tree)作为Classifier,关于决策树,可参考https://baike.baidu.com/item/%E5%86%B3%E7%AD%96%E6%A0%91。

实现代码

from sklearn import tree
...
# 实例化classifier
clf = tree.DecisionTreeClassifier()

训练模型

scikit-learnclassifier中通过方法fit(features, labels)来训练模型。其返回值即我们所需的模型

实现代码

...
clf = tree.fit(features, labels)
...

预测数据

有了模型,我们就可以对今后的数据进行预测,以得出label值,从而达到对其归类的目的。

实现代码

...
# 假设现在有一个数据[23, 'round', 'white'],我们想知道他应该数据什么类型,先将其转换为[23, 1, 1], 然后调用模型的predict方法
print(clf.predict([[23, 1, 1]]))
...

得到的结果为:

# 代表机器学习测算得出结果是melon
[1]  

完整代码

from sklearn import tree

# round:1, ellipse:2
# white:1, orange:2, yellow: 3
features = [[24, 1, 1], [35, 2, 1], [24, 1, 2], [24, 2, 3], [22, 1, 3]]

# melon:1, ball: 2
labels = [1, 1, 2, 1, 2]

# 实例化classifier
clf = tree.DecisionTreeClassifier()
# 训练
clf = clf.fit(features, labels)

print(clf.predict([[23, 1, 1]]))

后记

上例中,如果通过真正的人工智能肉眼来看,[23, ‘round‘, ‘white‘]被推算为melon的准确度其实并不高,因为[23, ‘round‘, ‘white‘]归类为ball也完全是可以的。上文提到过,机器学习其实就是不停的寻找合适的数据和算法以提升准确率的过程。想要提升准确率,我们可以有以下思路:

  • 加大训练样本量(训练样本必须和训练效率做好权衡,另外,最好避免重复的特性浪费算力,比如有了直径这列,就不需要半径、周长这样的特性了,这三者代表的是一个意思)
  • 变换算法(可以选用更高级的算法或者多个算法组合,但必须在准确度和效率之间做好权衡)
  • 抽象出更多的特性数据(比如本例中,如果有办法抽象出质量这样的特性,那对于预测准确率会有极大的提升)

至此为止,我们机器学习的Hello World程序已经完成了,也基本了解了机器学习是怎么回事,是不是还挺有意思的?



本文在博客园和我的个人博客www.fujiabin.com上同步发布。转载请注明来源。

时间: 2024-08-29 20:54:12

机器学习笔记1 - Hello World In Machine Learning的相关文章

机器学习【1】(Python Machine Learning读书笔记)

依旧是作为读书笔记发布,不涉及太多代码和工具,作为了解性文章来介绍机器学习. 文章主要分为两个部分,machine learning的概述和 scikit-learn的简单介绍,两部分关系紧密,合并书写,以致整体篇幅较长,分为1.2两篇. 首先,是关于机器学习.要点如下: 1.1 机器学习三种主要方式 1.2 四大过程 1.3 python相关实现(安装包) [1.1] 机器学习方式主要有三大类:supervised learning(监督式学习), unsupervised learning(

斯坦福机器学习视频笔记 Week6 关于机器学习的建议 Advice for Applying Machine Learning

我们将学习如何系统地提升机器学习算法,告诉你学习算法何时做得不好,并描述如何'调试'你的学习算法和提高其性能的"最佳实践".要优化机器学习算法,需要先了解可以在哪里做最大的改进. 我们将讨论如何理解具有多个部分的机器学习系统的性能,以及如何处理偏斜数据. Evaluating a Hypothesis 设想当你训练的模型对预测数据有很大偏差的时候,接下来你会选择怎么做? 这个需要花时间去实现,但是对你的帮助也会很大,使你不盲目的做一些决定来提升算法,而是直观地看出哪些是对提升算法是有效

Coursera机器学习-第十周-Large Scale Machine Learning

Gradient Descent with Large Datasets Learning With Large Datasets 我们已经知道,得到一个高效的机器学习系统的最好的方式之一是,用一个低偏差(low bias)的学习算法,然后用很多数据来训练它. 下面是一个区分混淆词组的例子: 但是,大数据存在一个问题,当样本容量m=1,000时还行,但是当m=100,000,000呢?请看一下梯度下降的更新公式: 计算一个θ值需要对1亿个数据进行求和,计算量显然太大,所以时间消耗肯定也就大了.

斯坦福第十课:应用机器学习的建议(Advice for Applying Machine Learning)

10.1  决定下一步做什么 10.2  评估一个假设 10.3  模型选择和交叉验证集 10.4  诊断偏差和方差 10.5  归一化和偏差/方差 10.6  学习曲线 10.7  决定下一步做什么 10.1  决定下一步做什么 到目前为止,我们已经介绍了许多不同的学习算法,如果你一直跟着这些视频的进度学习,你会发现自己已经不知不觉地成为一个了解许多先进机器学习技术的专家了. 然而,在懂机器学习的人当中依然存在着很大的差距,一部分人确实掌握了怎样高效有力地运用这些学习算法.而另一些人他们可能对

Attention Please!TWO HUNDREDS OF machine learning turorial summary

Machine Learning The First Column The Second Column Machine Learning 1 从机器学习入手 Machine Learning 2 机器学习很有趣! Machine Learning 3 机器学习规则:ML工程的最佳实践 Machine Learning 4 机器学习速成课程:第一部分 Machine Learning 5 第二部分;伯克利机器学习 Machine Learning 6 第三部分;伯克利机器学习 Machine Le

Machine Learning第十周笔记:大规模机器学习

刚刚完成了Andrew Ng在Cousera上的Machine Learning的第十周课程,这周主要介绍的是大规模机器学习,现将笔记整理在下面. Gradient Descent with Large Datasets Learning With Large Datasets 在前面介绍bias-variance的时候,我们曾提到一个比较各种算法孰优孰劣的实验,结论是"it's not who has the best algorithm that wins, it's who has the

Stanford机器学习笔记-7. Machine Learning System Design

7 Machine Learning System Design Content 7 Machine Learning System Design 7.1 Prioritizing What to Work On 7.2 Error Analysis 7.3 Error Metrics for Skewed Classed 7.3.1 Precision/Recall 7.3.2 Trading off precision and recall: F1 Score 7.4 Data for ma

[Python & Machine Learning] 学习笔记之scikit-learn机器学习库

1. scikit-learn介绍 scikit-learn是Python的一个开源机器学习模块,它建立在NumPy,SciPy和matplotlib模块之上.值得一提的是,scikit-learn最先是由David Cournapeau在2007年发起的一个Google Summer of Code项目,从那时起这个项目就已经拥有很多的贡献者了,而且该项目目前为止也是由一个志愿者团队在维护着. scikit-learn最大的特点就是,为用户提供各种机器学习算法接口,可以让用户简单.高效地进行数

[Machine Learning] 国外程序员整理的机器学习资源大全

本文汇编了一些机器学习领域的框架.库以及软件(按编程语言排序). 1. C++ 1.1 计算机视觉 CCV —基于C语言/提供缓存/核心的机器视觉库,新颖的机器视觉库 OpenCV—它提供C++, C, Python, Java 以及 MATLAB接口,并支持Windows, Linux, Android and Mac OS操作系统. 1.2 机器学习 MLPack DLib ecogg shark 2. Closure Closure Toolbox—Clojure语言库与工具的分类目录 3