这是我在学习 《Hands-On Machine Learning with Scikit-Learn and TensorFlow》时的笔记的第一部分,包括机器学习的一些基本概念。具体包括机器学习的含义、使用原因、简单分类以及面临的挑战。
由于我的水平有限,错误在所难免,如发现错误请在留言内指教,谢谢!本文在我的新博客的链接:http://www.myblog.link/2018/02/09/The-Machine-Learning-Landscape/
什么是机器学习
使计算机能够从数据中进行学习(learn from data)
- 机器学习是给计算机学习的能力而不需要显式地编程。
- 我的理解是:传统的方法需要手动地编写代码,告诉计算机对输入数据进行如何的处理,从而得出输出数据,即问题的解;而使用机器学习算法,计算机会通过对训练数据进行学习,自行得出如何处理输入数据的方法。比如在下文提到的监督学习里,给定许多输入和输出的组合作为训练集,机器学习算法会自己找出输入与输出之间的联系,从而在得到新的输入时可以判断出对应的输出。
为什么要使用机器学习
机器学习适用于:
-
现有的解决方案需要大量的手动调整或者长长的规则列表的问题:机器学习算法通常能够简化代码并且表现得更好。
比如进行垃圾邮件识别,传统方法可能需要手动编写各种规则,而机器学习只需要从样本中进行学习。
-
使用传统方法没有很好的解决方案的复杂问题:机器学习技术可以找到解决方案。
比如语音输入的识别,传统方法很难得到好的效果,而机器学习是现在的最好的技术。
-
变化的环境:机器学习系统可以适应新的数据。
比如上文的垃圾邮件识别,传统方法应对新的垃圾邮件特征时需要手动修改规则,而机器学习可以持续地学习适应变化。
-
对复杂问题和大量数据得到见解。
对于许多机器学习算法,人们可以查看机器学习系统学习到的内容,这可以用来加深人类对于该问题的理解。
机器学习系统的分类
监督/无监督学习
机器学习系统可以通过其训练时得到的监督的种类与数量,主要分为以下4类:
-
监督学习(Supervised learning)
在监督学习中,提供给机器学习算法的训练数据带有期待的结果,即标签(labels)。
典型的例子有:
- 分类问题(classification):如垃圾邮件分类,给定的训练数据包含邮件样本及其对应的分类(是否为垃圾邮件),需要学会对新的邮件进行分类。
- 回归问题(regression):给定一些特征,根据这些特征预测一个目标数值。比如给定二手车的一些特征,预测其价格。
注意一些回归算法也可以用来解决分类问题,例如逻辑回归(Logistic Regression);反之亦然。
常见算法:
- k邻近(k-Nearest Neighbors)
- 线性回归(Linear Regression)
- 逻辑回归(Logistic Regression)
- 支持向量机(Support Vector Machines, SVMs)
- 决策树和随机森林(Decision Trees and Random Forests)
- 神经网络(Neural networks ,也有无监督的)
-
无监督学习(Unsupervised learning)
在无监督学习中,提供给机器学习算法的训练数据没有标签。
典型的例子有:
- 聚类(clustering):如给出博客的访问者数据,将其分类为几个相似的群体。
- 可视化(visualization):给定一些复杂的无标签的数据,用二维或者三维图像将其表示出来,尽量使得输入中的不同的聚类不重叠。
- 降维(dimensionality reduction):为了减少数据的复杂程度,将多个特征合并为一个特征,以减少后续算法的资源消耗。
- 异常检测(anomaly detection):使用正常数据进行训练,使得其可以判断一个新的数据是否正常。可以用来在使用其它机器学习算法之前去除数据中的异常值。
- 相关规则学习(association rule learning):在大量数据中发现有趣的属性关联。比如超市中购买不同的物品的人群之间的联系。
常见算法:
- Clustering
- k-Means
- Hierarchical Cluster Analysis (HCA)
- Expectation Maximization
- Visualization and dimensionality reduction
- Principal Component Analysis (PCA)
- Kernel PCA
- Locally-Linear Embedding (LLE)
- t-distributed Stochastic Neighbor Embedding (t-SNE)
- Association rule learning
- Apriori
- Eclat
-
半监督学习(Semisupervised learning)
训练数据部分包含标签,通常是大部分无标签的数据+小部分有标签的数据。
典型例子:Google Photo,会将相同的人的照片识别出来,这样只需要对该组其中一张进行标签,则会识别该组的所有照片。
大部分半监督学习算法组合了监督学习算法和无监督学习算法,如deep belief networks (DBNs)先基于无监督学习组件restricted Boltzmann machines (RBMs)进行无监督学习,然后再进行监督学习。
-
增强学习(Reinforcement Learning)
一种很特殊的学习方法。学习时agent观察环境,选择并且执行操作,得到相应的奖励或者惩罚,从而更新策略。例子:AlphaGo的部分逻辑。
批处理/在线学习
另一种分类方式是根据机器学习系统是否能够从到来的数据流中增量地学习来进行分类:
-
批处理学习(Batch learning)
学习时使用整个训练数据集进行学习,学习完毕后上线,不再进行新的学习。如果要使用更多训练数据更新模型,需要用所有数据(不只是新增的)重新训练出新的模型,然后替换原有模型,这可能会消耗大量的资源。
-
在线学习(Online learning)
在线学习中,连续地提供数据实例,系统则会进行增量学习。这样有利于从连续的流中获取数据,需要迅速地或者自动地适应变化的系统。对于批处理学习的情况,如果其训练数据巨大无法一次完成训练,则可以将其拆成许多小部分,使用在线学习的方式依次进行训练。这样的做法通常是在上线前离线完成的,但仍是在线学习。或许在线学习应该被称为增量学习(incremental learning)比较合适。
在线学习中的一个重要的参数是学习速率(learning rate),其表示适应变化的数据的速度。学习速率越高,适应新数据越快,也就越快地忘记老数据,容易受新数据中错误数据的干扰。在线学习的很重要的挑战就是如何应对错误数据,比如黑客产生的恶意的数据,或者设备故障。
基于实例VS基于模型 学习
根据如何将已知的训练数据推广(generalize)到未知的数据,可以分成以下两类:
-
基于实例的学习
对于新的数据实例,根据其关于已知的数据实例的相似程度,来判断结果。比如对于一封新的邮件,判断他是与一封已知的垃圾邮件更相似,还是与一封已知的正常邮件更相似。k邻近(k-Nearest Neighbors)就是一种基于实例的学习算法。
-
基于模型的学习
对于这种学习方式,让系统产生一个模型来判断新数据。其开发步骤如下:
- 研究数据
- 选择模型的类型
- 使用数据训练模型(例如令学习算法找出最小化代价函数值的模型参数)
- 将该模型应用于新的数据
机器学习的主要挑战
训练数据数量不足
机器学习需要大量的数据
- 非常简单的问题——数千样本
- 复杂的问题——数百万样本
对于复杂问题,训练数据量甚至比算法更重要
- The Unreasonable Effectiveness of Data
- 如果数据量小而且不易获得更多数据,仍然需要关注算法
没有代表性的训练数据
没有代表性的数据会损失精确度
- 小规模样本:采样噪音(sampling noise):偶然地采集到无代表性的数据
- 大规模样本:抽样偏差(sampling bias):抽样方式不正确
低质量的数据
需要花时间进行数据清洗
- 剔除或修复明显错误的样本
- 部分样本的某个特征缺失: 忽视这个属性?忽视这些样本?填充缺少的值?都试试?……
不相关的特征
输入的特征须跟结果有关系
- 预测国家的幸福指数,将国家名称的拼写作为特征,发现名字里带w的国家满意程度高???
特征工程(feature engineering):
- 特征选择(feature selection):选取最有用的特征
- 特征提取(feature extraction):将多个特征组合生成为一个更有用的特征(可用降维算法)
- 收集新数据,创造新特征
过拟合训练数据
过拟合:训练数据上表现得很好,但是推广(generalize)到未知的数据时表现得不好
使用噪音多的数据训练复杂的算法,会使算法陷入噪音的模式之中,产生过拟合。解决方案:
- 简化模型:选择参数更少的模型、减少训练特征的属性、约束模型(如使用超参数(hyperparameters)限制参数的取值范围)
- 收集更多的数据
- 减少训练数据中的噪音
低拟合训练数据
低拟合:选择的模型对于问题来说过于简单。解决方法:
- 选择有更多参数的更强大的模型
- 选择更好的特征
- 减少模型的约束
测试和验证
将数据分为训练集与测试集(一般是80%:20%),训练集用于训练模型,测试集用于测试训练效果。
- 训练集效果好,测试集效果不好,则过拟合
- 但如果用多个超参数训练多个模型,然后使用测试集判断最优模型,这样上线后最终效果往往并不好,因为多次使用测试集评估不同超参数的各个模型,选出的是最适合测试集的参数
使用训练数据对于多个超参数训练多个模型,然后使用验证集(validation set)判断最优模型,最后使用测试数据测试最优模型的效果
- 为避免浪费测试数据,可以使用交叉测试(cross-validation):将训练集分为互补的子集,每个模型使用这些子集的不同组合来进行训练,用剩下的子集进行验证,选出最优的模型种类和超参数,然后用所有训练数据重新训练,最后用测试集进行测试