前些天完成了《机器学习实战》这本书的学习,也利用 Python3 实现了各个章节的代码,对传统的机器学习方法有了更进一步的了解,这里做一个总结。
代码传送门:
https://github.com/xyxxmb/Machine-Learning-In-Action
目录
第一部分:分类
【Ch1】机器学习基础
【Ch2】k - 近邻算法
【Ch3】决策树
【Ch4】基于概率论的分类方法:朴素贝叶斯
【Ch5】Logistic 回归
【Ch6】支持向量机
【Ch7】利用 AdaBoost 元算法提高分类性能
第二部分:利用回归预测数值型数据
【Ch8】预测数值型数据:回归
【Ch9】树回归
第三部分:无监督学习
【Ch10】利用 K-均值聚类算法对未标注数据分组
【Ch11】基于 Apriori 算法进行关联分析
【Ch12】使用 FP-growth 算法来高效发现频繁项集
第四部分:其他工具
【Ch13】利用 PCA 来简化数据
【Ch14】利用 SVD 简化数据
【Ch15】大数据与 MapReduce
补充:
【神经网络】
Ch1:机器学习基础
监督学习(分类、回归);无监督学习(聚类、密度估计)
Ch2:k - 近邻算法
简单来说,k - 近邻算法采用测量不同特征值之间的距离的方法进行分类。它是一种基于实例的学习,使用算法时必须有接近实际数据的训练样本数据。
优点:
- 精度高,对异常值不敏感,无数据输入假定;
- KNN 是一种在线技术,新数据可以直接加入数据集而不必进行重新训练;
- KNN 理论简单,容易实现。
缺点:
- 对于样本容量大的数据集计算量比较大,即计算复杂度高;
- 必须保存全部数据集,即空间复杂度高;
- KNN 每一次分类都会重新进行一次全局运算;
- 样本不平衡时,预测偏差比较大。如:某一类的样本比较少,而其它类样本比较多;
- K 值大小的选择;
- KNN 无法给出基础结构信息,无法知晓平均实例样本与典型实例样本具有什么特征,即无法给出数据的内在含义。
适用数据类型: 数值型和标称型。
应用领域: 文本分类;模式识别;聚类分析;多分类领域。
使用方法:
Ch3:决策树
决策树分类器就像带有终止块的流程图,终止块表示分类结果。开始处理数据时,首先需要测量集合中数据的不一致性,也就是熵(反映数据的无序程度),然后寻找最优方案划分数据集(选取信息增益(熵)最大的特征),直到数据集中的所有数据属于同一分类。构建决策树时,采用递归的方法将数据集转化为决策树。
优点:
- 决策树易于理解和解释,可以可视化分析,容易提取出规则;
- 计算复杂度不高,对中间值的缺失不敏感,可以处理不相关特征数据;
- 测试数据集时,运行速度比较快;
- 决策树可以很好的扩展到大型数据库中,同时它的大小独立于数据库大小。
缺点:
- 容易出现过拟合问题。
- 对缺失数据处理比较困难。
- 忽略数据集中属性的相互关联。
- ID3 算法计算信息增益时结果偏向数值比较多的特征。
适用数据类型: 标称型和数值型。
改进措施(主要解决过拟合问题):
- 对决策树进行剪枝,可以采用交叉验证法和正则化的方法;
- 使用基于决策树的 combination 算法,如 Bagging,Random Forest 等。
决策树流行算法: ID3、C4.5、CART
应用领域: 企业管理实践,企业投资决策,由于决策树很好的分析能力,在决策过程应用较多。
使用方法:
总结:Ch2 和 Ch3 都是确定的分类算法,数据实例最终会被明确的划分到某个分类当中。
Ch4:基于概率论的分类方法:朴素贝叶斯
使用概率,提供一种利用已知值来估计未知概率的方法。通过特征间的独立性假设(朴素一词的由来),降低对数据量的要求。
优点:
- 对大数量训练和查询时具有较高的速度。即使使用超大规模的训练集,针对每个项目通常也只会有相对较少的特征数,并且对项目的训练和分类也仅仅是特征概率的数学运算而已;
- 支持增量式运算,即可以实时的对新增的样本进行训练;
- 朴素贝叶斯对结果解释容易理解;
- 对数据较少的情况下仍然有效;
- 可以处理多类别问题。
缺点:
- 因为要将文本转化为词向量(文档中的每个词在词库中只表示出现与不出现,即 [0,1,1,0,0,1],如果要表示一个词出现了多次,需要用到词袋模型,即 [0,1,3,2,0,0,2]),因此对于输入数据的准备方式较为敏感;
- 由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好。
适用数据类型: 标称型。
改进措施:
- 下溢出问题:对概率取对数;
- 词袋模型在解决文档分类问题上比词集模型好;
- 移除提用词(对分类基本上没有帮助的词,如助词、语气词等)。
应用领域: 欺诈检测;一封电子邮件是否是垃圾邮件;一篇文章应该分到科技、政治,还是体育类;一段文字表达的是积极的情绪还是消极的情绪;人脸识别等。
使用方法:
Ch5:Logistic 回归
寻找一个非线性函数 Sigmoid 的最佳拟合参数,求解过程可以由最优化算法(如梯度上升或随机梯度上升(占用更少资源,在线学习)) 来完成。
优点: 计算代价不高,易于理解和实现。
缺点:
- 容易产生欠拟合;
- 分类精度可能不高。
适用数据类型: 数值型和标称型。
改进措施:
用随机梯度上升训练算法代替梯度上升训练算法,实现在线学习。
应用领域:
- 用于二分类领域,可以得出概率值,适用于根据分类概率排名的领域,如搜索排名等;
- Logistic 回归的扩展 softmax 可以应用于多分类领域,如手写字识别等;
- 信用评估;
- 测量市场营销的成功度;
- 预测某个产品的收益;
- 特定的某天是否会发生地震。
使用方法:
Ch6:支持向量机
一种二值决策分类“机”,泛化错误率低和较好的推广性使其被认为是监督学习中最好的定式算法。它试图求解一个二次优化问题来最大化分类间隔。支持向量机采用 SMO 算法每次只优化两个 alpha 值来加快 SVM 的训练速度。核方法(或核技巧)会将数据(有时是非线性数据)从一个低维空间映射到一个高维空间,将一个在低维空间中的非线性问题转化为在高维空间的线性问题,如径向基函数(度量两个向量距离的核函数)。
优点:
- 解决小样本下机器学习问题;
- 解决非线性问题;
- 无局部极小值问题(相对于神经网络等算法);
- 可以很好的处理高维数据集,计算开销不大,结果易解释;
- 泛化能力比较强。
缺点:
- 对于核函数的高维映射解释力不强,尤其是径向基函数;
- 对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题;
- 对缺失数据敏感。
适用数据类型: 数值型和标称型。
应用领域: 文本分类、图像识别、主要二分类领域。
使用方法:
Ch7:利用 AdaBoost 元算法提高分类性能
通过组合多个分类器(可以不同)的分类结果,获得了比简单的分类器更好的效果。选择不同的分类器可以缓解同一分类器可能放大的过拟合问题。
有三种集成方法:Bagging、Boosting 和 Random Forset。Bagging
通过随机抽样 S 次(有放回的抽样),得到 S 个与原数据集大小相同的数据集,作用到 S 个分类器上,最后根据投票决定分到哪一个类;Boosting 在 Bagging 上更进一步,它在数据集上顺序应用了多个不同的分类器。
Boosting 中最流行的的一个算法是 AdaBoost,以弱学习器作为基分类器,并且输入数据,使其通过权重向量进行加权。在第一次迭代中,所有数据等权重,在后续迭代中,前次迭代中分错的数据的权值增大,这种针对错误的调节能力正是 AdaBoost 的长处。
优点:
- 很好的利用了弱分类器进行级联;
- 可以将不同的分类算法作为弱分类器;
- AdaBoost 具有很高的精度;
- 相对于 Bagging 算法和 Random Forest 算法,AdaBoost 充分考虑的每个分类器的权重;
- 泛化错误率低,易编码,可以应用在大部分分类器上,无参数调整。
缺点:
- AdaBoost 迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定;
- 数据不平衡导致分类精度下降;
- 训练比较耗时,每次重新选择当前分类器最好切分点;
- 对离散点敏感。
适用数据类型: 数值型和标称型。
应用领域:模式识别、计算机视觉领域,用于二分类和多分类场景。
使用方法:
补充(非均衡分类问题):
非均衡分类问题是指在分类器训练时正例数目和反例数目相差很大的一类问题,该问题在错分正例和反例的代价不同时也存在(比如错分导致死亡)。因此,ROC曲线、正确率和召回率有利于度量分类器的指标。
调节正例和反例的数目可以采用欠抽样(删除多的样本)和过抽样(赋值少的样本)的方法,另外一种方法就是在分类的过程中将错误的代价也考虑在内。
Ch8:预测数值型数据:回归
回归与分类的不同点在于,回归预测连续型变量,分类预测离散型变量。在回归方程中,求得最佳回归系数的方法是最小化误差的平方和。使用岭回归可以保证 X^T*X 的逆不能计算时,仍然能求得回归参数。
岭回归是缩减法的一种,相当于对回归系数的大小施加了限制。另一种很好的方法是 lasso 算法,难以求解,但可以使用简便的逐步线性回归来求得近似结果。
缩减法还可以看做对一个模型增加偏差(模型预测值与数据之间的差异)的同时减少方差(模型之间的差异)。
优点: 结果易于理解,计算不复杂。
缺点: 对非线性的数据拟合不好。
适用数据类型: 数值型和标称型。
使用方法:
Ch9:树回归
输入数据和目标变量之间呈现非线性关系,一种可行的方法是使用树对预测值分段,包括分段常数和分段直线。若叶节点使用的模型是分段常数则称为回归树,若叶节点使用的模型是分段直线则称为模型树。
CART 算法可以用于构造二元树并处理离散型或数值型数据的切分,该算法构造的回归树或模型树倾向于产生过拟合问题,可以采用预剪枝(在树的构建过程中就进行剪枝)和后剪枝(当树构建完毕再进行剪枝)。预剪枝更有效,但用户需要定义一些参数。
优点: 可以对复杂的和非线性的数据建模。
缺点: 结果不易理解。
适用数据类型: 数值型和标称型。
使用方法(R2为相关系数):
Ch10:利用 K-均值聚类算法对未标注数据分组
聚类是一种无监督的学习方法(没有目标变量)。聚类将数据点归到多个簇中,其中相似数据点属于同一簇,而不相似数据点属于不同簇中。
K-均值算法是广泛使用的聚类算法,其中 K 是用户指定的创建簇的数目。算法以 K 个随机质心开始,计算每个点到质心的距离。每个点会被分配到最近的簇质心,然后更新簇质心。以上过程重复数次直至簇质心不再改变。
K-均值算法易受到初始质心的影响,为了获得更好的聚类效果,可以采用二分 K-均值聚类算法。二分 K-均值聚类算法首先将所有点作为一个簇,然后使用 K-均值算法(k=2)对其划分。下一次迭代时,选择有最大误差的簇进行划分。该过程重复直到 K 个簇创建成功为止。
优点: 容易实现。
缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢。
适用数据类型: 数值型。
使用方法:
Ch11:基于 Apriori 算法进行关联分析
两种方式找到大数据集之间的关系。第一种使用频繁项集,它会给出经常出现在一起的元素项;第二种是关联规则,每条关联规则意味着元素项之间的“如果...那么”关系。
Apriori 算法保证在有限的时间内找到频繁项集。其原理是说如果一个元素项是不频繁的,那么那些包含该元素的超集也是不频繁的。Apriori 算法从单元素项集开始,通过组合满足最小支持度要求的项集来形成更大的集合。支持度用来衡量一个集合在原始数据中出现的频率。
每次增加频繁项集的大小,Apriori 算法都会重新扫描整个数据集。当数据集很大时,会显著降低频繁项集发现的速度。下一章的 FPgrowth 算法只需对数据库进行两次遍历,能够显著加快频繁项集的发现速度。
优点: 易编码实现。
缺点: 在大数据集上可能较慢。
适用数据类型: 数值型或标称型。
应用领域: 商店中商品的关联;网站的访问页面的关联;查看选举人及法官的投票历史等。
使用方法:
Ch12:使用 FP-growth 算法来高效发现频繁项集
FP-growth 算法是一种用于发现数据集中频繁模式的有效方法,利用
Apriori 原理,只对数据集扫描两次,运行更快。在算法中,数据集存储在 FP 树中,构建完树后,通过查找元素项的条件基及构建条件 FP 树来发现频繁项集。重复进行直到FP树只包含一个元素为止。
优点: 一般要快于 Apriori 算法。
缺点: 实现比较困难,在某些数据集上性能会下降。
适用数据类型: 标称型。
应用领域: 在多种文本文档中查找频繁单词;购物交易;医学诊断;大气研究等。
使用方法:
Ch13:利用 PCA 来简化数据
降维往往作为预处理步骤,其中独立成分分析、因子分析和主成分分析比较流行,主成分分析(PCA)最为广泛。
PCA 可以从数据中识别其主要特征,它是通过沿着数据最大方差方向旋转坐标轴来实现的。选择方差最大的方向作为第一条坐标轴,后续坐标轴则与前面坐标轴正交。协方差矩阵上的特征值分析可以用一系列的正交坐标轴来获取。
优点: 降低数据的复杂性,识别最重要的多个特征。
缺点: 不一定需要,且可能损失有用信息。
适用数据类型: 数值型。
Ch14:利用 SVD 简化数据
SVD 是一种强大的降维工具,可以利用 SVD 来逼近矩阵并从中获得主要的特征。通过保留矩阵的 80%~90% 的能量,就可以得到重用的特征并去除噪声。
优点: 简化数据,去除噪声,提高算法的结果。
缺点: 数据的转换可能难以理解。
适用数据类型: 数值型。
应用领域: 推荐引擎(协同过滤、相似度计算)、图像压缩等。
Ch15:大数据与 MapReduce
MapReduce 是一种并行处理框架。在 MapReduce 中,作业被分为 map 阶段和 reduce 阶段。先使用 map 阶段并行处理数据,之后将这些数据在 reduce 阶段合并,是一种多对一的模式。mapper 和 reducer 之间传输数据的形式是 key/value 对。一般地,map 阶段后还需要根据 key 值进行排序。
Hadoop 是一个流行的可运行 MapReduce 作业的 java 项目,它同时也提供非 java 作业的运行支持,叫做 Hadoop 流。
神经网络
优点:
- 分类准确度高,学习能力极强。
- 对噪声数据鲁棒性和容错性较强。
- 有联想能力,能逼近任意非线性关系。
缺点:
- 神经网络参数较多,权值和阈值。
- 黑盒过程,不能观察中间结果。
- 学习过程比较长,有可能陷入局部极小值。
应用领域: 目前深度神经网络已经应用与计算机视觉,自然语言处理,语音识别等领域并取得很好的效果。
至此,总结完成。后续有了更深地理解也会进行补充完善。