《机器学习实战》共分为四个部分:
第一部分——分类
共七章,第一章介绍机器学习的基础;第二章讲述最简单的分类算法:k-近邻算法;第三章引入决策树;第四章将讨论如何使用概率论建立分类器;第五章讨论Logistic回归;第六章介绍支持向量机;第七章介绍元算法:AdaBoost。
第二部分——利用回归预测数值类型数
介绍了预测数值型数据——回归和树回归
第三部分——无监督学习
第四部分——其他工具
前两部分是监督学习(supervised learning),第三部分是无监督学习。
第一部分 分类
监督学习——只需要给定输入样本值,机器就可以从中推演处指定目标变量的可能结果。
两种类型的目标变量:
标称型——目标变量的结果只在优先目标集中取值,如真与假、动物分类集合{爬行类、鱼类、扑入类、两栖类、植物、真菌}
数值型——目标变量可以从无限的数值集合中取值,如0.100、42.001、1000.743等(数值型目标变量主要用于回归分析)
第一章 机器学习的基础
1.1 何谓机器学习
单地说,机器学习就是把无序的数据转换成有用的信息。
机器学习的主要任务就是分类。使用某个机器学习算法进行分类,首先需要做的事算法训练,即学习如何分类。为了测试机器学习算法的效果,通常使用两套独立的样本集:训练数据和测试数据。
1.3机器学习的主要任务
它的主要任务是将实例数据划分到合适的分类中。另一个任务是回归——主要用于预测数值型数据。
分类和回归属于监督学习,因为这类算法必须知道预测什么,即目标变量的分类信息。
无监督学习——数据没有类别信息,也不会给定目标值。在无监督学习中,将数据集合分成由类似的对象组成的多个类的过程被称为聚类;将寻找描述数据统计值的过程称之为密度估计。此外,无监督学习还可以减少数据特征的维度,以便我们可以使用二维或三维图形更加直观地展示数据信息。
用于执行分类、回归、聚类和密度估计得机器学习算法:
监督学习的用途
1. k-近邻算法——先行回归
2. 朴素贝叶斯算法——局部加权线性回归
3. 支持向量机——Ridge回归
4. 决策树——Lasso最小回归系数估计
无监督学习的用途
1.K-均值——最大期望算法
2.DBSCAN——Parzen窗设计
1.4如何选择合适的算法
选择实际可用的算法,必须考虑下面两个问题:
- 使用机器学习算法的目的,想要算法完成何种任务,比如是预测明天下雨的概率还是对投票者按照兴趣分组;
- 需要分析或手机的数据是什么。
如果不想预测目标变量的值,则可以选择无监督学习算法。进一步分析是否需要将数据划分为离散的组。如果这是唯一的需求,则使用聚类算法;如果还需要估计数据与每个分组的相似程度,则需要使用密度估计算法。
其次需要考虑的事数据问题。主要了解数据的特性有:特征值是离散型变量还是连续性变量,特征值中是否存在缺失的值,何种原因造成缺失值,数据中是否存在异常值,某个特征发生的频率如何(是否罕见的如同海底捞针),等等。
一般来着发现最好算法的关键环节是反复试错的迭代过程。
1.5 开发机器学习应用程序的步骤
- 收集数据:
通过不同方法收集样本数据; - 准备输入数据
保证数据格式符合要求,为机器学习算法准备特定的数据格式; - 分析输入数据
人工分析以前的到的数据(这一步主要是确保数据集中没有垃圾数据); - 训练算法
机器学习算法从这一步才是这正开始学习 - 测试算法
- 使用算法
1.6 Python语言的优势
1.Python的语法清晰
2.易于操作纯文本文件
选择Python实现机器学习算法的编程语言,是因为它具有其他编程语言不具备的优势,如易于理解、丰富的函数库(尤其是矩阵操作——NumPy库函数)、活跃的开发者社区等。
可执行伪代码
Python具有清晰地语法结构,也称作可执行伪代码。Python语言处理和操作文本非常简单,非常易于处理非数值型数据。Python比较流行
Python语言使用广泛,代码范例也很多,便于读者快速学习和掌握。在科学和金融领域,Python余压得到了广泛应用。Python的科学工具可以与绘图工具Matplotlib协同工作。Python开发环境还提供了交互式shell环境,允许用户开发程序是查看和检测程序内容。
1.7 NumPy函数库基础
机器学习算法涉及很多线性代数只是,使用Python语言构造机器学习应用时,会经常使用NumPy函数库。
NumPy函数库是Python开发环境的一个独立模块,而且大多数Python发行版没有默认安装Numpy函数库,因此在安装Python之后必须单独安装NumPy函数库。
WIN10 64bit python2.7 安装 numpy scipy matplotlib
Windows10可以通过点击菜单栏里的IDLE(Python Guy)进入Python shell开发环境,前提已成功安装了Python。
在Python shell开发环境中输入谢列命令:
>>> from numpy import *
上述命令将Numpy函数库的所有模块引入当前的命名空间。然后在Python shell开发环境中输入下述命名:
>>> random.rand(4,4)
array([[ 0.78314482, 0.7239554 , 0.3108891 , 0.51277561],
[ 0.78408743, 0.37782528, 0.23968518, 0.85503523],
[ 0.4666761 , 0.38926782, 0.75106318, 0.06438148],
[ 0.59958743, 0.35981518, 0.16095452, 0.84342553]])
上述命令构造了一个4x4的随机数组,计算机不一样,生成的随机数也会不一样。
NumPy矩阵与数组的区别
NumPy函数库中存在两种不同的数据类型(矩阵matrix和数组arry),都可以用于处理行列表示的数字元素。虽然他们看起来很相似,但是在这两个数据类型上执行相同的数学运算可能得到不同的结果,其中NumPy函数库中的matrix与MATLAB中matriccs等价。
调用mat()函数可以将数组转化为矩阵,输入下述命令:
>>> randMat = mat(random.rand(4,4))
>>> randMat.I
matrix([[ 0.98017444, 0.21122576, -2.36904023, 2.28842775],
[ 0.82414424, -2.75841087, 0.27908233, 2.61223953],
[-0.9695299 , 0.97877418, 0.48761212, 0.23723141],
[-0.18363084, 2.07333355, 1.715797 , -4.37572914]])
.I操作符实现了矩阵求逆的运算。
执行下面的命令存储逆矩阵:
>>> invRandMat = randMat.I
接着执行矩阵乘法,得到矩阵与其逆矩阵相乘的结果:
>>> randMat*invRandMat
matrix([[ 1.00000000e+00, -1.12760617e-17, -3.63418003e-16,
2.52530441e-16],
[ -5.86254723e-17, 1.00000000e+00, -2.92120779e-17,
-3.70375431e-17],
[ -3.75560507e-17, -9.71493500e-17, 1.00000000e+00,
-5.85783766e-17],
[ -5.59998459e-17, -4.54482523e-17, -5.99937790e-17,
1.00000000e+00]])
结果应该是单位矩阵,除了对角线元素是1,4X4矩阵的其他元素应该全是0。实际输出结果略有不同,矩阵里还留下了许多非常小的元素,这是计算机处理误差产生的结果,输入下述命令,得到误差值:
>>> myBye = randMat*invRandMat
>>> myBye - eye(4)
matrix([[ 0.00000000e+00, -1.12760617e-17, -3.63418003e-16,
2.52530441e-16],
[ -5.86254723e-17, 0.00000000e+00, -2.92120779e-17,
-3.70375431e-17],
[ -3.75560507e-17, -9.71493500e-17, 0.00000000e+00,
-5.85783766e-17],
[ -5.59998459e-17, -4.54482523e-17, -5.99937790e-17,
-1.11022302e-16]])
函数eye(4)创建4X4的单位矩阵。
以上基本为第一部分的第一章,第一本分的前七章主要研究分类问题。学习机器学习算法,必须了解数据实例,每个数据实例由多个特征值组成。分类是基本的机器学习任务,它分析未分类的数据,以确定如何将其放入移植群组中。为了构建和训练分类器,必须先输入大量已知的数据,我们将这些数据成为训练样本集。
参考文献
《机器学习实战》