A. Geron, Hands on Machine Learning with Scikit-learn and TensorFlow.
机器学习就是从数据中学习。
EPT定义:从经验(E)中学习去完成任务(T),任务完成的表现用P衡量,如果说随着经验E的增加,完成任务T的表现P也会得到提升,那么这个计算机程序就可以说是从数据中学习了(learn from data)。
在你设计一个机器学习算法的时候,以上分类完全可以有互相重叠。
几种比较重要的监督学习算法:
[注]:有些神经网络结构可以是无监督的,比如autoencoders 和 restricted Boltzmann machines. 神经网也可以是半监督的,比如说 在deep belief network 和 unsupervised pretraining(无监督预训练)中.
无监督学习的训练数据是没有label的。
有一些比较重要的无监督学习算法:
半监督学习的算法可以处理部分labeled的训练数据,通常是大量的未加标签的数据和少量的加标签了的数据。
举个例子,集体活动时候,手机里拍了很多照片,你不需要给每个人贴上标签:张三、李四。。。,手机会自动识别不同照片里面的相同的人(clustering),但是它不知道这是谁,你需要给某张照片里面人加上了名字之后所有照片里面都会完成标注。有时候你也需要给两个看起来很像的人添加少量的标签以区分开来。
大多数半监督学习的算法都是无监督学习和监督学习算法的一个组合。比如说 deep belief networks(DBNs)是一个个的restricted Boltzmann machines(RBMs)堆叠起来,RBM以无监督学习的方式一个个接受训练,之后整个系统使用监督学习的方式来微调。
强化学习和以上算法有很明显的不同。学习系统称为agent,可以观察环境,选择实施哪些动作actions,并且获得奖励(或者惩罚)作为反馈;算法系统是自己学会什么是最优的策略(policy), 这个策略的目的是最大化奖励积累。
Another criterion used to classify Machine Learning systems is whether or not the
system can learn incrementally from a stream of incoming data.
学习系统并非增量式的学习,系统使用所有可用的数据来训练模型。这样耗费时间和计算资源,因此通常是在offline的情况下操作的。
系统首先训练好之后,在使用中就不在进行学习了,只是把之前学习的东西应用下去。 This is called offline learning.
如果有新的数据更新进来,那么要将原有的数据和新的数据在一起,重新训练模型,再投入使用中去。实际应用中,你可以间隔一段时间再重新训练模型以适应新数据的加入,比如垃圾邮件检测的问题你,你没必要每次多一个垃圾邮件就训练一次垃圾邮件检测模型,每周一次训练或者更长都可以的,这是考虑到训练的资源消耗问题。
在线学习是一种步进式(incrementally)的学习。你可以一步步的输入数据,或者单个的,或者一组组的(mini-batched)。每个学习的阶段都很快且资源消耗小,因此系统可以在线实时响应很快的学习新数据。
对于数据集比较大,无法一下子在主内存中处理的问题,在线学习是比较适合的,(这也被叫做out-of-core学习)。也就是说计算资源有限的时候在线学习是个不错的选择。
步进式学习里面一个很重要的参数是学习率,它决定系统应该以多快进度学习新数据。如果学习率过大,系统学习接受新数据很快,但是会很快的忘记旧数据中学习到的东西。反过来说,如果学习率太慢,系统又会有很大的惯性,就是前面的数据对后面训练的影响很大,学的也慢,但是这样对输入数据的噪声不敏感。 对于在线学习,数据质量很重要,后面数据不好,学习的结果就会变得很差劲,客户不开心啊。所以要经常监测系统,甚至需要回复到之前学习的状态,监测输入数据的质量也很必要!
大多数机器学习的任务是预测,训练完了之后,再对新数据进行预测。在训练数据上具有好的表现是不够的,最终的目的是在未见过的数据上表现良好!
Trivial, simple, learning by heart.
Use measure of similarity to make predictions.
为输入数据的样例建立一个模型,训练模型的参数,用模型来做预测。
“garbage in, garbage out…”
_ (以上是数据不好。)
(以下是算法不够好。)_
训练数据过拟合(whe the model is too complex relative the amout and noiseness of the training data):
训练数据表现好,泛化差。
解决方法:
- 简化模型,比如减少模型参量,减少训练数据的属性数量,或者对模型参数的取值加以限制。
- 获取更多的训练数据;
- 降低训练数据的噪音(修正数据错误,移除异常值)
underfitting : 现实比模型要复杂,因此fitting总存在偏差。
how to fix:
- 换用更有效的模型,比如拥有更多模型参数
- feeding better features to the learning alogorithm(feature engineering)
- 降低对模型参数的约束(比如降低正则化超参数)
将数据集分为 training set 和 test set (一般习惯将数据集20%-80%分作为测试集和训练集), 用训练集的数据训练模型,用测试集的数据测试模型。 在测试集上计算模型,可以得到对_泛化误差_的估计。
现将数据集分成k个互斥的子集,每次选其中k-1个子集作为训练集,剩下一个作为测试集。可以进行k次训练和测试,最终返回k此训练和测试结果的平均值作为输出的模型。