精华内容
下载资源
问答
  • 机器学习算法汇总大全 机器学习算法汇总大全机器学习算法汇总大全机器学习算法汇总大全机器学习算法汇总大全
  • 我们先带着大家过一遍传统机器学习算法,基本思想和用途。把问题解决思路和方法应用建议提前到这里的想法也很简单,希望能提前给大家一些小建议,对于某些容易出错的地方也先给大家打个预防针,这样在理解后续相应...

    作者:寒小阳
    时间:2016年1月。
    出处:http://blog.csdn.net/han_xiaoyang/article/details/50469334
    声明:版权所有,转载请联系作者并注明出处

    1.引言

    提起笔来写这篇博客,突然有点愧疚和尴尬。愧疚的是,工作杂事多,加之懒癌严重,导致这个系列一直没有更新,向关注该系列的同学们道个歉。尴尬的是,按理说,机器学习介绍与算法一览应该放在最前面写,详细的应用建议应该在讲完机器学习常用算法之后写,突然莫名奇妙在中间插播这么一篇,好像有点打乱主线。
    老话说『亡羊补牢,为时未晚』,前面开头忘讲的东西,咱在这块儿补上。我们先带着大家过一遍传统机器学习算法,基本思想和用途。把问题解决思路和方法应用建议提前到这里的想法也很简单,希望能提前给大家一些小建议,对于某些容易出错的地方也先给大家打个预防针,这样在理解后续相应机器学习算法之后,使用起来也有一定的章法。

    2.机器学习算法简述

    按照不同的分类标准,可以把机器学习的算法做不同的分类。

    2.1 从机器学习问题角度分类

    我们先从机器学习问题本身分类的角度来看,我们可以分成下列类型的算法:

    • 监督学习算法

    机器学习中有一大部分的问题属于『监督学习』的范畴,简单口语化地说明,这类问题中,给定的训练样本中,每个样本的输入 x x x都对应一个确定的结果 y y y,我们需要训练出一个模型(数学上看是一个 x → y x → y xy的映射关系 f f f),在未知的样本 x ′ x' x给定后,我们能对结果 y ′ y' y做出预测。

    这里的预测结果如果是离散值(很多时候是类别类型,比如邮件分类问题中的垃圾邮件/普通邮件,比如用户会/不会购买某商品),那么我们把它叫做分类问题(classification problem);如果预测结果是连续值(比如房价,股票价格等等),那么我们把它叫做回归问题(regression problem)。

    有一系列的机器学习算法是用以解决监督学习问题的,比如最经典的用于分类问题的朴素贝叶斯、逻辑回归、支持向量机等等;比如说用于回归问题的线性回归等等。

    • 无监督学习

    有另外一类问题,给我们的样本并没有给出『标签/标准答案』,就是一系列的样本。而我们需要做的事情是,在一些样本中抽取出通用的规则。这叫做『无监督学习』。包括关联规则和聚类算法在内的一系列机器学习算法都属于这个范畴。

    • 半监督学习

    这类问题给出的训练数据,有一部分有标签,有一部分没有标签。我们想学习出数据组织结构的同时,也能做相应的预测。此类问题相对应的机器学习算法有自训练(Self-Training)、直推学习(Transductive Learning)、生成式模型(Generative Model)等。

    总体说来,最常见是前两类问题,而对应前两类问题的一些机器学习算法如下:

    机器学习算法

    2.2 从算法的功能角度分类

    我们也可以从算法的共性(比如功能,运作方式)角度对机器学习算法分类。下面我们根据算法的共性去对它们归个类。不过需要注意的是,我们下面的归类方法可能对分类和回归有比较强的倾向性,而这两类问题也是最常遇到的。

    2.2.1 回归算法(Regression Algorithms)

    回归算法
    回归算法是一种通过最小化预测值与实际结果值之间的差距,而得到输入特征之间的最佳组合方式的一类算法。对于连续值预测有线性回归等,而对于离散值/类别预测,我们也可以把逻辑回归等也视作回归算法的一种,常见的回归算法如下:

    • Ordinary Least Squares Regression (OLSR)
    • Linear Regression
    • Logistic Regression
    • Stepwise Regression
    • Locally Estimated Scatterplot Smoothing (LOESS)
    • Multivariate Adaptive Regression Splines (MARS)

    2.2.2 基于实例的算法(Instance-based Algorithms)

    基于实例的算法
    这里所谓的基于实例的算法,我指的是我们最后建成的模型,对原始数据样本实例依旧有很强的依赖性。这类算法在做预测决策时,一般都是使用某类相似度准则,去比对待预测的样本和原始样本的相近度,再给出相应的预测结果。常见的基于实例的算法有:

    • k-Nearest Neighbour (kNN)
    • Learning Vector Quantization (LVQ)
    • Self-Organizing Map (SOM)
    • Locally Weighted Learning (LWL)

    2.2.3 决策树类算法(Decision Tree Algorithms)

    决策树类算法
    决策树类算法,会基于原始数据特征,构建一颗包含很多决策路径的树。预测阶段选择路径进行决策。常见的决策树算法包括:

    • Classification and Regression Tree (CART)
    • Iterative Dichotomiser 3 (ID3)
    • C4.5 and C5.0 (different versions of a powerful approach)
    • Chi-squared Automatic Interaction Detection (CHAID)
    • M5
    • Conditional Decision Trees

    2.2.4 贝叶斯类算法(Bayesian Algorithms)

    贝叶斯类算法
    这里说的贝叶斯类算法,指的是在分类和回归问题中,隐含使用了贝叶斯原理的算法。包括:

    • Naive Bayes
    • Gaussian Naive Bayes
    • Multinomial Naive Bayes
    • Averaged One-Dependence Estimators (AODE)
    • Bayesian Belief Network (BBN)
    • Bayesian Network (BN)

    2.2.5 聚类算法(Clustering Algorithms)

    聚类算法
    聚类算法做的事情是,把输入样本聚成围绕一些中心的『数据团』,以发现数据分布结构的一些规律。常用的聚类算法包括:

    • k-Means
    • Hierarchical Clustering
    • Expectation Maximisation (EM)

    2.2.6 关联规则算法(Association Rule Learning Algorithms)

    关联规则算法
    关联规则算法是这样一类算法:它试图抽取出,最能解释观察到的训练样本之间关联关系的规则,也就是获取一个事件和其他事件之间依赖或关联的知识,常见的关联规则算法有:

    • Apriori algorithm
    • Eclat algorithm

    2.2.7 人工神经网络类算法(Artificial Neural Network Algorithms)

    人工神经网络类算法
    这是受人脑神经元工作方式启发而构造的一类算法。需要提到的一点是,我把『深度学习』单拎出来了,这里说的人工神经网络偏向于更传统的感知算法,主要包括:

    • Perceptron
    • Back-Propagation
    • Radial Basis Function Network (RBFN)

    2.2.8 深度学习(Deep Learning Algorithms)

    深度学习
    深度学习是近年来非常火的机器学习领域,相对于上面列的人工神经网络算法,它通常情况下,有着更深的层次和更复杂的结构。有兴趣的同学可以看看我们另一个系列机器学习与计算机视觉,最常见的深度学习算法包括:

    • Deep Boltzmann Machine (DBM)
    • Deep Belief Networks (DBN)
    • Convolutional Neural Network (CNN)
    • Stacked Auto-Encoders

    2.2.9 降维算法(Dimensionality Reduction Algorithms)

    降维算法
    从某种程度上说,降维算法和聚类其实有点类似,因为它也在试图发现原始训练数据的固有结构,但是降维算法在试图,用更少的信息(更低维的信息)总结和描述出原始信息的大部分内容。
    有意思的是,降维算法一般在数据的可视化,或者是降低数据计算空间有很大的作用。它作为一种机器学习的算法,很多时候用它先处理数据,再灌入别的机器学习算法学习。主要的降维算法包括:

    • Principal Component Analysis (PCA)
    • Principal Component Regression (PCR)
    • Partial Least Squares Regression (PLSR)
    • Sammon Mapping
    • Multidimensional Scaling (MDS)
    • Linear Discriminant Analysis (LDA)
    • Mixture Discriminant Analysis (MDA)
    • Quadratic Discriminant Analysis (QDA)
    • Flexible Discriminant Analysis (FDA)

    2.2.10 模型融合算法(Ensemble Algorithms)

    模型融合算法
    严格意义上来说,这不算是一种机器学习算法,而更像是一种优化手段/策略,它通常是结合多个简单的弱机器学习算法,去做更可靠的决策。拿分类问题举个例,直观的理解,就是单个分类器的分类是可能出错,不可靠的,但是如果多个分类器投票,那可靠度就会高很多。常用的模型融合增强方法包括:

    • Random Forest
    • Boosting
    • Bootstrapped Aggregation (Bagging)
    • AdaBoost
    • Stacked Generalization (blending)
    • Gradient Boosting Machines (GBM)
    • Gradient Boosted Regression Trees (GBRT)

    2.3 机器学习算法使用图谱

    scikit-learn作为一个丰富的python机器学习库,实现了绝大多数机器学习的算法,有相当多的人在使用,于是我这里很无耻地把machine learning cheat sheet for sklearn搬过来了,原文可以看这里。哈哈,既然讲机器学习,我们就用机器学习的语言来解释一下,这是针对实际应用场景的各种条件限制,对scikit-learn里完成的算法构建的一颗决策树,每一组条件都是对应一条路径,能找到相对较为合适的一些解决方法,具体如下:

    sklearn机器学习算法使用图谱

    首先样本量如果非常少的话,其实所有的机器学习算法都没有办法从里面『学到』通用的规则和模式,so多弄点数据是王道。然后根据问题是有/无监督学习和连续值/离散值预测,分成了分类聚类回归维度约减四个方法类,每个类里根据具体情况的不同,又有不同的处理方法。

    3. 机器学习问题解决思路

    上面带着代价走马观花过了一遍机器学习的若干算法,下面我们试着总结总结在拿到一个实际问题的时候,如果着手使用机器学习算法去解决问题,其中的一些注意点以及核心思路。主要包括以下内容:

    • 拿到数据后怎么了解数据(可视化)
    • 选择最贴切的机器学习算法
    • 定位模型状态(过/欠拟合)以及解决方法
    • 大量极的数据的特征分析与可视化
    • 各种损失函数(loss function)的优缺点及如何选择

    多说一句,这里写的这个小教程,主要是作为一个通用的建议和指导方案,你不一定要严格按照这个流程解决机器学习问题。

    3.1 数据与可视化

    我们先使用scikit-learn的make_classification函数来生产一份分类数据,然后模拟一下拿到实际数据后我们需要做的事情。

    #numpy科学计算工具箱
    import numpy as np
    #使用make_classification构造1000个样本,每个样本有20个feature
    from sklearn.datasets import make_classification
    X, y = make_classification(1000, n_features=20, n_informative=2, 
                               n_redundant=2, n_classes=2, random_state=0)
    #存为dataframe格式
    from pandas import DataFrame
    df = DataFrame(np.hstack((X, y[:, None])),columns = range(20) + ["class"])
    

    我们生成了一份包含1000个分类数据样本的数据集,每个样本有20个数值特征。同时我们把数据存储至pandas中的DataFrame数据结构中。我们取前几行的数据看一眼:

    df[:6]
    

    前6行

    不幸的是,肉眼看数据,尤其是维度稍微高点的时候,很有可能看花了也看不出看不出任何线索。幸运的是,我们对于图像的理解力,比数字好太多,而又有相当多的工具可以帮助我们『可视化』数据分布。

    我们在处理任何数据相关的问题时,了解数据都是很有必要的,而可视化可以帮助我们更好地直观理解数据的分布和特性

    数据的可视化有很多工具包可以用,比如下面我们用来做数据可视化的工具包Seaborn。最简单的可视化就是数据散列分布图和柱状图,这个可以用Seanborn的pairplot来完成。以下图中2种颜色表示2种不同的类,因为20维的可视化没有办法在平面表示,我们取出了一部分维度,两两组成pair看数据在这2个维度平面上的分布状况,代码和结果如下:

    import matplotlib.pyplot as plt
    import seaborn as sns
    #使用pairplot去看不同特征维度pair下数据的空间分布状况
    _ = sns.pairplot(df[:50], vars=[8, 11, 12, 14, 19], hue="class", size=1.5)
    plt.show()
    

    pair_plot下数据分布状况

    我们从散列图和柱状图上可以看出,确实有些维度的特征相对其他维度,有更好的区分度,比如第11维和14维看起来很有区分度。这两个维度上看,数据点是近似线性可分的。而12维和19维似乎呈现出了很高的负相关性。接下来我们用Seanborn中的corrplot来计算计算各维度特征之间(以及最后的类别)的相关性。代码和结果图如下:

    import matplotlib.pyplot as plt
    plt.figure(figsize=(12, 10))
    _ = sns.corrplot(df, annot=False)
    plt.show()
    

    各位特征相关性

    相关性图很好地印证了我们之前的想法,可以看到第11维特征和第14维特征和类别有极强的相关性,同时它们俩之间也有极高的相关性。而第12维特征和第19维特征却呈现出极强的负相关性。强相关的特征其实包含了一些冗余的特征,而除掉上图中颜色较深的特征,其余特征包含的信息量就没有这么大了,它们和最后的类别相关度不高,甚至各自之间也没什么先惯性。

    插一句,这里的维度只有20,所以这个相关度计算并不费太大力气,然而实际情形中,你完全有可能有远高于这个数字的特征维度,同时样本量也可能多很多,那种情形下我们可能要先做一些处理,再来实现可视化了。别着急,一会儿我们会讲到。

    3.2 机器学习算法选择

    数据的情况我们大致看了一眼,确定一些特征维度之后,我们可以考虑先选用机器学习算法做一个baseline的系统出来了。这里我们继续参照上面提到过的机器学习算法使用图谱
    我们只有1000个数据样本,是分类问题,同时是一个有监督学习,因此我们根据图谱里教的方法,使用LinearSVC(support vector classification with linear kernel)试试。注意,LinearSVC需要选择正则化方法以缓解过拟合问题;我们这里选择使用最多的L2正则化,并把惩罚系数C设为10。我们改写一下sklearn中的学习曲线绘制函数,画出训练集和交叉验证集上的得分:

    from sklearn.svm import LinearSVC
    from sklearn.learning_curve import learning_curve
    #绘制学习曲线,以确定模型的状况
    def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,
                            train_sizes=np.linspace(.1, 1.0, 5)):
        """
        画出data在某模型上的learning curve.
        参数解释
        ----------
        estimator : 你用的分类器。
        title : 表格的标题。
        X : 输入的feature,numpy类型
        y : 输入的target vector
        ylim : tuple格式的(ymin, ymax), 设定图像中纵坐标的最低点和最高点
        cv : 做cross-validation的时候,数据分成的份数,其中一份作为cv集,其余n-1份作为training(默认为3份)
        """
        
        plt.figure()
        train_sizes, train_scores, test_scores = learning_curve(
            estimator, X, y, cv=5, n_jobs=1, train_sizes=train_sizes)
        train_scores_mean = np.mean(train_scores, axis=1)
        train_scores_std = np.std(train_scores, axis=1)
        test_scores_mean = np.mean(test_scores, axis=1)
        test_scores_std = np.std(test_scores, axis=1)
    
        plt.fill_between(train_sizes, train_scores_mean - train_scores_std,
                         train_scores_mean + train_scores_std, alpha=0.1,
                         color="r")
        plt.fill_between(train_sizes, test_scores_mean - test_scores_std,
                         test_scores_mean + test_scores_std, alpha=0.1, color="g")
        plt.plot(train_sizes, train_scores_mean, 'o-', color="r",
                 label="Training score")
        plt.plot(train_sizes, test_scores_mean, 'o-', color="g",
                 label="Cross-validation score")
    
        plt.xlabel("Training examples")
        plt.ylabel("Score")
        plt.legend(loc="best")
        plt.grid("on") 
        if ylim:
            plt.ylim(ylim)
        plt.title(title)
        plt.show()
    
    #少样本的情况情况下绘出学习曲线
    plot_learning_curve(LinearSVC(C=10.0), "LinearSVC(C=10.0)",
                        X, y, ylim=(0.8, 1.01),
                        train_sizes=np.linspace(.05, 0.2, 5))
    

    学习曲线1

    这幅图上,我们发现随着样本量的增加,训练集上的得分有一定程度的下降,交叉验证集上的得分有一定程度的上升,但总体说来,两者之间有很大的差距,训练集上的准确度远高于交叉验证集。这其实意味着我们的模型处于过拟合的状态,也即模型太努力地刻画训练集,一不小心把很多噪声的分布也拟合上了,导致在新数据上的泛化能力变差了。

    3.2.1 过拟合的定位与解决

    问题来了,过拟合咋办?
    针对过拟合,有几种办法可以处理:

    • 增大样本量

    这个比较好理解吧,过拟合的主要原因是模型太努力地去记住训练样本的分布状况,而加大样本量,可以使得训练集的分布更加具备普适性,噪声对整体的影响下降。恩,我们提高点样本量试试:

    #增大一些样本量
    plot_learning_curve(LinearSVC(C=10.0), "LinearSVC(C=10.0)",
                        X, y, ylim=(0.8, 1.1),
                        train_sizes=np.linspace(.1, 1.0, 5))
    

    学习曲线2

    是不是发现问题好了很多?随着我们增大训练样本量,我们发现训练集和交叉验证集上的得分差距在减少,最后它们已经非常接近了。增大样本量,最直接的方法当然是想办法去采集相同场景下的新数据,如果实在做不到,也可以试试在已有数据的基础上做一些人工的处理生成新数据(比如图像识别中,我们可能可以对图片做镜像变换、旋转等等),当然,这样做一定要谨慎,强烈建议想办法采集真实数据。

    • 减少特征的量(只用我们觉得有效的特征)

    比如在这个例子中,我们之前的数据可视化和分析的结果表明,第11和14维特征包含的信息对识别类别非常有用,我们可以只用它们。

    plot_learning_curve(LinearSVC(C=10.0), "LinearSVC(C=10.0) Features: 11&14", X[:, [11, 14]], y, ylim=(0.8, 1.0), train_sizes=np.linspace(.05, 0.2, 5))
    

    特征选择后

    从上图上可以看出,过拟合问题也得到一定程度的缓解。不过我们这是自己观察后,手动选出11和14维特征。那能不能自动进行特征组合和选择呢,其实我们当然可以遍历特征的组合样式,然后再进行特征选择(前提依旧是这里特征的维度不高,如果高的话,遍历所有的组合是一个非常非常非常耗时的过程!!):

    from sklearn.pipeline import Pipeline
    from sklearn.feature_selection import SelectKBest, f_classif
    # SelectKBest(f_classif, k=2) 会根据Anova F-value选出 最好的k=2个特征
    
    plot_learning_curve(Pipeline([("fs", SelectKBest(f_classif, k=2)), # select two features
                                   ("svc", LinearSVC(C=10.0))]), "SelectKBest(f_classif, k=2) + LinearSVC(C=10.0)", X, y, ylim=(0.8, 1.0), train_sizes=np.linspace(.05, 0.2, 5))
    

    自动特征选择

    如果你自己跑一下程序,会发现在我们自己手造的这份数据集上,这个特征筛选的过程超级顺利,但依旧像我们之前提过的一样,这是因为特征的维度不太高。
    从另外一个角度看,我们之所以做特征选择,是想降低模型的复杂度,而更不容易刻画到噪声数据的分布。从这个角度出发,我们还可以有(1)多项式你和模型中降低多项式次数 (2)神经网络中减少神经网络的层数和每层的结点数 ©SVM中增加RBF-kernel的bandwidth等方式来降低模型的复杂度。
    话说回来,即使以上提到的办法降低模型复杂度后,好像能在一定程度上缓解过拟合,但是我们一般还是不建议一遇到过拟合,就用这些方法处理,优先用下面的方法:

    • 增强正则化作用(比如说这里是减小LinearSVC中的C参数)
      正则化是我认为在不损失信息的情况下,最有效的缓解过拟合现象的方法。
    plot_learning_curve(LinearSVC(C=0.1), "LinearSVC(C=0.1)", X, y, ylim=(0.8, 1.0), train_sizes=np.linspace(.05, 0.2, 5))
    

    调整正则化参数

    调整正则化系数后,发现确实过拟合现象有一定程度的缓解,但依旧是那个问题,我们现在的系数是自己敲定的,有没有办法可以自动选择最佳的这个参数呢?可以。我们可以在交叉验证集上做grid-search查找最好的正则化系数(对于大数据样本,我们依旧需要考虑时间问题,这个过程可能会比较慢):

    from sklearn.grid_search import GridSearchCV
    estm = GridSearchCV(LinearSVC(), 
                       param_grid={"C": [0.001, 0.01, 0.1, 1.0, 10.0]})
    plot_learning_curve(estm, "LinearSVC(C=AUTO)", 
                        X, y, ylim=(0.8, 1.0),
                        train_sizes=np.linspace(.05, 0.2, 5))
    print "Chosen parameter on 100 datapoints: %s" % estm.fit(X[:500], y[:500]).best_params_
    

    在500个点得到的结果是:{‘C’: 0.01}
    使用新的C参数,我们再看看学习曲线:
    C取0.01的学习曲线

    对于特征选择的部分,我打算多说几句,我们刚才看过了用sklearn.feature_selection中的SelectKBest来选择特征的过程,也提到了在高维特征的情况下,这个过程可能会非常非常慢。那我们有别的办法可以进行特征选择吗?比如说,我们的分类器自己能否甄别那些特征是对最后的结果有益的?这里有个实际工作中用到的小技巧。

    我们知道:

    • l2正则化,它对于最后的特征权重的影响是,尽量打散权重到每个特征维度上,不让权重集中在某些维度上,出现权重特别高的特征。
    • 而l1正则化,它对于最后的特征权重的影响是,让特征获得的权重稀疏化,也就是对结果影响不那么大的特征,干脆就拿不着权重。

    那基于这个理论,我们可以把SVC中的正则化替换成l1正则化,让其自动甄别哪些特征应该留下权重。

    plot_learning_curve(LinearSVC(C=0.1, penalty='l1', dual=False), "LinearSVC(C=0.1, penalty='l1')", X, y, ylim=(0.8, 1.0), train_sizes=np.linspace(.05, 0.2, 5))
    

    使用l1正则化

    好了,我们一起来看看最后特征获得的权重:

    estm = LinearSVC(C=0.1, penalty='l1', dual=False)
    estm.fit(X[:450], y[:450])  # 用450个点来训练
    print "Coefficients learned: %s" % est.coef_
    print "Non-zero coefficients: %s" % np.nonzero(estm.coef_)[1]
    

    得到结果:

    Coefficients learned: [[ 0.          0.          0.          0.          0.          0.01857999
       0.          0.          0.          0.004135    0.          1.05241369
       0.01971419  0.          0.          0.          0.         -0.05665314
       0.14106505  0.        ]]
    Non-zero coefficients: [5 9 11 12 17 18]
    

    你看,5 9 11 12 17 18这些维度的特征获得了权重,而第11维权重最大,也说明了它影响程度最大。

    3.2.2 欠拟合定位与解决

    我们再随机生成一份数据[1000*20]的数据(但是分布和之前有变化),重新使用LinearSVC来做分类。

    #构造一份环形数据
    from sklearn.datasets import make_circles
    X, y = make_circles(n_samples=1000, random_state=2)
    #绘出学习曲线
    plot_learning_curve(LinearSVC(C=0.25),"LinearSVC(C=0.25)",X, y, ylim=(0.5, 1.0),train_sizes=np.linspace(.1, 1.0, 5))
    

    环形数据的学习曲线

    简直烂出翔了有木有,二分类问题,我们做随机猜测,准确率都有0.5,这比随机猜测都高不了多少!!!怎么办?

    不要盲目动手收集更多资料,或者调整正则化参数。我们从学习曲线上其实可以看出来,训练集上的准确度和交叉验证集上的准确度都很低,这其实就对应了我们说的『欠拟合』状态。别急,我们回到我们的数据,还是可视化看看:

    f = DataFrame(np.hstack((X, y[:, None])), columns = range(2) + ["class"])
    _ = sns.pairplot(df, vars=[0, 1], hue="class", size=3.5)
    

    环形数据可视化

    你发现什么了,数据根本就没办法线性分割!!!,所以你再找更多的数据,或者调整正则化参数,都是无济于事的!!!

    那我们又怎么解决欠拟合问题呢?通常有下面一些方法:

    • 调整你的特征(找更有效的特征!!)
      比如说我们观察完现在的数据分布,然后我们先对数据做个映射:
    # 加入原始特征的平方项作为新特征
    X_extra = np.hstack((X, X[:, [0]]**2 + X[:, [1]]**2))
    
    plot_learning_curve(LinearSVC(C=0.25), "LinearSVC(C=0.25) + distance feature", X_extra, y, ylim=(0.5, 1.0), train_sizes=np.linspace(.1, 1.0, 5))
    

    平方映射后的准确度
    卧槽,少年,这准确率,被吓尿了有木有啊!!!所以你看,选用的特征影响太大了,当然,我们这里是人工模拟出来的数据,分布太明显了,实际数据上,会比这个麻烦一些,但是在特征上面下的功夫还是很有回报的。

    • 使用更复杂一点的模型(比如说用非线性的核函数)
      我们对模型稍微调整了一下,用了一个复杂一些的非线性rbf kernel:
    from sklearn.svm import SVC
    # note: we use the original X without the extra feature
    plot_learning_curve(SVC(C=2.5, kernel="rbf", gamma=1.0), "SVC(C=2.5, kernel='rbf', gamma=1.0)",X, y, ylim=(0.5, 1.0), train_sizes=np.linspace(.1, 1.0, 5))
    

    rbf核SVM学习曲线

    你看,效果依旧很赞。

    3.3 关于大数据样本集和高维特征空间

    我们在小样本的toy dataset上,怎么捣鼓都有好的方法。但是当数据量和特征样本空间膨胀非常厉害时,很多东西就没有那么好使了,至少是一个很耗时的过程。举个例子说,我们现在重新生成一份数据集,但是这次,我们生成更多的数据,更高的特征维度,而分类的类别也提高到5。

    3.3.1 大数据情形下的模型选择与学习曲线

    在上面提到的那样一份数据上,我们用LinearSVC可能就会有点慢了,我们注意到机器学习算法使用图谱推荐我们使用SGDClassifier。其实本质上说,这个模型也是一个线性核函数的模型,不同的地方是,它使用了随机梯度下降做训练,所以每次并没有使用全部的样本,收敛速度会快很多。再多提一点,SGDClassifier对于特征的幅度非常敏感,也就是说,我们在把数据灌给它之前,应该先对特征做幅度调整,当然,用sklearn的StandardScaler可以很方便地完成这一点。

    SGDClassifier每次只使用一部分(mini-batch)做训练,在这种情况下,我们使用交叉验证(cross-validation)并不是很合适,我们会使用相对应的progressive validation:简单解释一下,estimator每次只会拿下一个待训练batch在本次做评估,然后训练完之后,再在这个batch上做一次评估,看看是否有优化。

    #生成大样本,高纬度特征数据
    X, y = make_classification(200000, n_features=200, n_informative=25, n_redundant=0, n_classes=10, class_sep=2, random_state=0)
    
    #用SGDClassifier做训练,并画出batch在训练前后的得分差
    from sklearn.linear_model import SGDClassifier
    est = SGDClassifier(penalty="l2", alpha=0.001)
    progressive_validation_score = []
    train_score = []
    for datapoint in range(0, 199000, 1000):
        X_batch = X[datapoint:datapoint+1000]
        y_batch = y[datapoint:datapoint+1000]
        if datapoint > 0:
            progressive_validation_score.append(est.score(X_batch, y_batch))
        est.partial_fit(X_batch, y_batch, classes=range(10))
        if datapoint > 0:
            train_score.append(est.score(X_batch, y_batch))
        
    plt.plot(train_score, label="train score")
    plt.plot(progressive_validation_score, label="progressive validation score")
    plt.xlabel("Mini-batch")
    plt.ylabel("Score")
    plt.legend(loc='best')  
    plt.show()                     
    

    得到如下的结果:
    SGDClassifier学习曲线

    从这个图上的得分,我们可以看出在50个mini-batch迭代之后,数据上的得分就已经变化不大了。但是好像得分都不太高,所以我们猜测一下,这个时候我们的数据,处于欠拟合状态。我们刚才在小样本集合上提到了,如果欠拟合,我们可以使用更复杂的模型,比如把核函数设置为非线性的,但遗憾的是像rbf核函数是没有办法和SGDClassifier兼容的。因此我们只能想别的办法了,比如这里,我们可以把SGDClassifier整个替换掉了,用多层感知神经网来完成这个任务,我们之所以会想到多层感知神经网,是因为它也是一个用随机梯度下降训练的算法,同时也是一个非线性的模型。当然根据机器学习算法使用图谱,也可以使用**核估计(kernel-approximation)**来完成这个事情。

    3.3.2 大数据量下的可视化

    大样本数据的可视化是一个相对比较麻烦的事情,一般情况下我们都要用到降维的方法先处理特征。我们找一个例子来看看,可以怎么做,比如我们数据集取经典的『手写数字集』,首先找个方法看一眼这个图片数据集。

    #直接从sklearn中load数据集
    from sklearn.datasets import load_digits
    digits = load_digits(n_class=6)
    X = digits.data
    y = digits.target
    n_samples, n_features = X.shape
    print "Dataset consist of %d samples with %d features each" % (n_samples, n_features)
    
    # 绘制数字示意图
    n_img_per_row = 20
    img = np.zeros((10 * n_img_per_row, 10 * n_img_per_row))
    for i in range(n_img_per_row):
        ix = 10 * i + 1
        for j in range(n_img_per_row):
            iy = 10 * j + 1
            img[ix:ix + 8, iy:iy + 8] = X[i * n_img_per_row + j].reshape((8, 8))
    
    plt.imshow(img, cmap=plt.cm.binary)
    plt.xticks([])
    plt.yticks([])
    _ = plt.title('A selection from the 8*8=64-dimensional digits dataset')
    plt.show()
    

    数字示意图

    我们总共有1083个训练样本,包含手写数字(0,1,2,3,4,5),每个样本图片中的像素点平铺开都是64位,这个维度显然是没办法直接可视化的。下面我们基于scikit-learn的示例教程对特征用各种方法做降维处理,再可视化。

    随机投射
    我们先看看,把数据随机投射到两个维度上的结果:

    #import所需的package
    from sklearn import (manifold, decomposition, random_projection)
    rp = random_projection.SparseRandomProjection(n_components=2, random_state=42)
    
    #定义绘图函数
    from matplotlib import offsetbox
    def plot_embedding(X, title=None):
        x_min, x_max = np.min(X, 0), np.max(X, 0)
        X = (X - x_min) / (x_max - x_min)
    
        plt.figure(figsize=(10, 10))
        ax = plt.subplot(111)
        for i in range(X.shape[0]):
            plt.text(X[i, 0], X[i, 1], str(digits.target[i]),
                     color=plt.cm.Set1(y[i] / 10.),
                     fontdict={'weight': 'bold', 'size': 12})
    
        if hasattr(offsetbox, 'AnnotationBbox'):
            # only print thumbnails with matplotlib > 1.0
            shown_images = np.array([[1., 1.]])  # just something big
            for i in range(digits.data.shape[0]):
                dist = np.sum((X[i] - shown_images) ** 2, 1)
                if np.min(dist) < 4e-3:
                    # don't show points that are too close
                    continue
                shown_images = np.r_[shown_images, [X[i]]]
                imagebox = offsetbox.AnnotationBbox(
                    offsetbox.OffsetImage(digits.images[i], cmap=plt.cm.gray_r),
                    X[i])
                ax.add_artist(imagebox)
        plt.xticks([]), plt.yticks([])
        if title is not None:
            plt.title(title)
    
    #记录开始时间
    start_time = time.time()
    X_projected = rp.fit_transform(X)
    plot_embedding(X_projected, "Random Projection of the digits (time: %.3fs)" % (time.time() - start_time))
    

    结果如下:
    2方向随机投射图

    PCA降维
    在维度约减/降维领域有一个非常强大的算法叫做PCA(Principal Component Analysis,主成分分析),它能将原始的绝大多数信息用维度远低于原始维度的几个主成分表示出来。PCA在我们现在的数据集上效果还不错,我们来看看用PCA对原始特征降维至2维后,原始样本在空间的分布状况:

    from sklearn import (manifold, decomposition, random_projection)
    #TruncatedSVD 是 PCA的一种实现
    X_pca = decomposition.TruncatedSVD(n_components=2).fit_transform(X)
    #记录时间
    start_time = time.time()
    plot_embedding(X_pca,"Principal Components projection of the digits (time: %.3fs)" % (time.time() - start_time))
    

    得到的结果如下:
    PCA后的可视化

    我们可以看出,效果还不错,不同的手写数字在2维平面上,显示出了区域集中性。即使它们之间有一定的重叠区域。

    如果我们用一些非线性的变换来做降维操作,从原始的64维降到2维空间,效果更好,比如这里我们用到一个技术叫做t-SNE,sklearn的manifold对其进行了实现:

    from sklearn import (manifold, decomposition, random_projection)
    #降维
    tsne = manifold.TSNE(n_components=2, init='pca', random_state=0)
    start_time = time.time()
    X_tsne = tsne.fit_transform(X)
    #绘图
    plot_embedding(X_tsne,
                   "t-SNE embedding of the digits (time: %.3fs)" % (time.time() - start_time))
    

    非线性降维手写数字分布图

    我们发现结果非常的惊人,似乎这个非线性变换降维过后,仅仅2维的特征,就可以将原始数据的不同类别,在平面上很好地划分开。不过t-SNE也有它的缺点,一般说来,相对于线性变换的降维,它需要更多的计算时间。也不太适合在大数据集上全集使用。

    3.4 损失函数的选择

    损失函数的选择对于问题的解决和优化,非常重要。我们先来看一眼各种不同的损失函数:

    import numpy as np
    import matplotlib.plot as plt
    # 改自http://scikit-learn.org/stable/auto_examples/linear_model/plot_sgd_loss_functions.html
    xmin, xmax = -4, 4
    xx = np.linspace(xmin, xmax, 100)
    plt.plot([xmin, 0, 0, xmax], [1, 1, 0, 0], 'k-',
             label="Zero-one loss")
    plt.plot(xx, np.where(xx < 1, 1 - xx, 0), 'g-',
             label="Hinge loss")
    plt.plot(xx, np.log2(1 + np.exp(-xx)), 'r-',
             label="Log loss")
    plt.plot(xx, np.exp(-xx), 'c-',
             label="Exponential loss")
    plt.plot(xx, -np.minimum(xx, 0), 'm-',
             label="Perceptron loss")
    
    plt.ylim((0, 8))
    plt.legend(loc="upper right")
    plt.xlabel(r"Decision function $f(x)$")
    plt.ylabel("$L(y, f(x))$")
    plt.show()
    

    得到结果图像如下:

    损失函数对比

    不同的损失函数有不同的优缺点:

    • **0-1损失函数(zero-one loss)**非常好理解,直接对应分类问题中判断错的个数。但是比较尴尬的是它是一个非凸函数,这意味着其实不是那么实用。
    • hinge loss(SVM中使用到的)的健壮性相对较高(对于异常点/噪声不敏感)。但是它没有那么好的概率解释。
    • **log损失函数(log-loss)**的结果能非常好地表征概率分布。因此在很多场景,尤其是多分类场景下,如果我们需要知道结果属于每个类别的置信度,那这个损失函数很适合。缺点是它的健壮性没有那么强,相对hinge loss会对噪声敏感一些。
    • 多项式损失函数(exponential loss)(AdaBoost中用到的)对离群点/噪声非常非常敏感。但是它的形式对于boosting算法简单而有效。
    • **感知损失(perceptron loss)**可以看做是hinge loss的一个变种。hinge loss对于判定边界附近的点(正确端)惩罚力度很高。而perceptron loss,只要样本的判定类别结果是正确的,它就是满意的,而不管其离判定边界的距离。优点是比hinge loss简单,缺点是因为不是max-margin boundary,所以得到模型的泛化能力没有hinge loss强。

    4. 总结

    全文到此就结束了。先走马观花看了一遍机器学习的算法,然后给出了对应scikit-learn的『秘密武器』机器学习算法使用图谱,紧接着从了解数据(可视化)选择机器学习算法定位过/欠拟合及解决方法大量极的数据可视化损失函数优缺点与选择等方面介绍了实际机器学习问题中的一些思路和方法。本文和文章机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾都提及了一些处理实际机器学习问题的思路和方法,有相似和互补之处,欢迎大家参照着看。

    展开全文
  •  这部分不是要介绍哪个具体的机器学习算法,前面做了一些机器学习的算法,本人在学习的过程中也去看别人写的材料,但是很多作者写的太难懂,或者就是放了太多的公式,所以我就想我来写点这方面的材料可以给大家参照...

    前言

        这部分不是要介绍哪个具体的机器学习算法,前面做了一些机器学习的算法,本人在学习的过程中也去看别人写的材料,但是很多作者写的太难懂,或者就是放了太多的公式,所以我就想我来写点这方面的材料可以给大家参照,当然,由于本人才疏学浅,在写博客或者在写程序的过程中有什么不合理或者说错误的地方,还劳烦各位多多指出,因为有你们的支持才能体现出我做这些工作的价值。

        由于博客会越来越多,在这里我想对上面做的机器学习相关的博客做个目录,方便各位查看,这个目录也会一直更新。

    一、引言

        李航老师指出,机器学习=模型+策略+算法。这里的模型在监督学习中就是指所要学习的条件概率或者决策函数;策略指的是如何定义损失函数或者风险函数。算法主要指的是如何去优化损失函数。所以在学习机器学习的过程中,有必要去了解一下优化函数。

    二、优化算法

        优化函数有很多种,凸优化本身也是一门学问,在我已经做的工作中有如下一些优化方法:

    1、梯度下降法

        地址:(http://blog.csdn.net/google19890102/article/details/17842831)。梯度下降法是机器学习中使用最为广泛的一种优化算法。

    2、人工蜂群算法(ABC)

        地址(http://blog.csdn.net/google19890102/article/details/26164653)。以下的算法都属于智能优化算法,不但能够解决凸优化问题,更能够解决一些存在局部极值的问题,具有更加广泛的应用。

    3、粒子群算法(PSO)

        地址(http://blog.csdn.net/google19890102/article/details/30044945)。与ABC一样,都属于群智能优化算法。我的还有一些工作还没有写出来,我还做了差分进化算法DE和遗传算法GA,这个工作会在近期放到博客上。

    三、分类算法 

        分类算法是一个大类,主要是一些常见的算法的常见用法,主要有以下一些:

    1、k-近邻算法

        地址(http://blog.csdn.net/google19890102/article/details/23924971),k-近邻算法是一种简单的算法,基本的算法思想是通过相似性的比较,最终得到最相似的k类中最为相似的,在k-近邻算法中有几个很重要的地方:第一是k的取值,当然在我的博客中也没指出具体怎么取,其实k的取值就是模型的选择,模型的选择可以采用交叉验证的方式或者通过正则化的方式,显然这里是采用交叉验证的方式。第二点就是相似性的度量,有很多文章在写相似性的文章,但是具体各种相似性的度量方法应用在具体什么问题中,我也还在摸索,希望能给大家写一篇详细点的出来,也欢迎各位看到好的材料推荐给我。

    2、决策树之ID3算法

        地址(http://blog.csdn.net/google19890102/article/details/28611225),在ID3算法中主要使用的是信息熵的概念,熵表示的是数据的混乱程度,我们分类的目标是使得最终的每个类中的数据属于同一个类,即数据不再混乱,所以每次选择一个特征,这个特征使得分类后的熵下降最快,所以就引入了信息增益的概念。

    3、朴素贝叶斯

        地址(http://blog.csdn.net/google19890102/article/details/25592833),朴素贝叶斯是对特征做最基本的假设,即每个特征都是独立的且都是同等重要。朴素贝叶斯比较适合处理文本相关的分类问题,一直以来都还没把实验补上。。。

    4、Logistic回归

        地址(http://blog.csdn.net/google19890102/article/details/25596295,Logistic回归主要是通过系数来选择特征,对不同的特征赋予不同的权重,最终对数据分类。

    5、Rosenblatt感知机

        地址1,基本解法(http://blog.csdn.net/google19890102/article/details/26048577),地址2,对偶解法(http://blog.csdn.net/google19890102/article/details/37869387)。Rosenblatt感知机是神经网络的基础,主要是通过查找误分类点来计算神经网络的权重和偏置,以使得所有的数据都能正确被分类,这里就说明了Rosenblatt感知机只能处理线性可分的问题。

    6、神经网络之BP神经网络

        地址(http://blog.csdn.net/google19890102/article/details/32723459),BP算法可以说是神经网络中最为基本的一种算法,也是最重要的一种算法,因为其他的一些神经网络类的算法都是在此基础上。BP神经网络主要是一种单隐层前馈神经网络,在BP算法中通过信息的前向传播,得到误差,再通过误差的反向传播去调整神经网络的权重和偏置。这里将梯度下降法运用到了极致。很基础的算法,也是相当重要的一种算法,思想尤为重要。

    7、极限学习机(ELM)

        地址(http://blog.csdn.net/google19890102/article/details/18222103),极限学习机是由黄广斌老师提出的一种神经网络系的算法,为什么把它放到这些基本的机器学习算法中,我个人觉得黄老师在设计ELM算法时,有些基本的思想是很重要的,ELM的模型和BP神经网络是一样的,都是单隐层前馈神经网络,只是ELM不是迭代的算法,通过信息的前向传播便能构造一个线性方程组,然后通过广义逆的方式求解线性方程组,这样大大节省了训练的时间。

    8、支持向量机(SVM)

        简介地址(http://blog.csdn.net/google19890102/article/details/35243153),SVM在机器学习算法中的地位是很高的,SVM有着很强的数学基础,主要分为线性可分支持向量机(http://blog.csdn.net/google19890102/article/details/35258921),线性支持向量机(http://blog.csdn.net/google19890102/article/details/35566949)和非线性支持向量机(http://blog.csdn.net/google19890102/article/details/35989959)。对于支持向量机的算法实现,主要是序列最小优化算法,这部分还没有完成,希望下次能够用Java语言去完整实现一个SVM。

    四、回归算法

        回归算法主要处理连续型的问题,主要的算法有如下的一些:

    1、基本的线性回归与局部加权线性回归

        地址(http://blog.csdn.net/google19890102/article/details/26074827),在这个方面主要实现了基本的线性回归和局部加权线性回归。主要通过正规方程组的方式求解权重。在线性回归中最容易出现过拟合和欠拟合的问题,所以引入局部加权线性回归,通过权重调节每个特征的重要程度。

    2、基本线性回归的另类实现

        地址(http://blog.csdn.net/google19890102/article/details/26616973),在这里可以使用广义逆求解其权重,这也是在ELM中学到的一点。

    3、岭回归

        地址(http://blog.csdn.net/google19890102/article/details/27228279),岭回归主要还是在处理过拟合的问题,我们需要找到方差和偏差折中的算法,岭回归主要是通过正则项去做模型的选择。

    五、聚类算法

        聚类算法主要还是一种无监督的学习算法,通过不同的方式使具有相同结构的数据聚集在一起,聚类算法远不止我列出来的这些,还有很多,我也会在以后继续添加更多的聚类算法,我实现的主要有以下的一些聚类方法:

    1、K均值(K-Means)

        地址(http://blog.csdn.net/google19890102/article/details/26149927),K-Means首先随机初始化k个聚类中心,通过迭代的方式不断调整聚类中心,知道k个聚类中心不再改变为之。在K-Means算法中,和K-近邻算法一样,这里的K的取值和相似性的度量都是很重要的。

    2、基于密度的聚类算法DBSCAN

        地址(http://blog.csdn.net/google19890102/article/details/37656733),K-Mean算法除了上述的问题之外,还存在着他的聚类结果是球状的簇,而基于密度的算法可以使任意的形状,其次,在DBSCAN算法中没有k的取值问题,取而代之的是将每一个点分为核心点,边界点和噪音点。

    六、推荐算法

        推荐算法最早是基于协同过滤的方法,当然后来又有很多,比如基于内容的推荐,这里我还是主要实现的是基于协同过滤的推荐算法:

    1、协同过滤的推荐算法

        基本的算法地址(http://blog.csdn.net/google19890102/article/details/28112091),在基本的协同过滤算法中又分为基于项的推荐系统和基于用户的推荐系统,协同过滤的推荐系统主要是计算不同用户或者不同项之间的相似性,然后对需要推荐的选项打分,最终推荐分数较高的选项。相似度计算是一件很花费时间的事或者这样的矩阵是一个稀疏矩阵,没法实现相似度的计算,所以可以先对这样的矩阵降维,并映射到主题空间中,再去计算此时的相似度,地址(http://blog.csdn.net/google19890102/article/details/28236629).

    七、降维的方法

        原始数据的处理一直以来都是很重要的,原来我也是一直忽视这一块,找工作的过程中,我意识到算法是一些既定的框架,在具体的问题中特征的提取,以及一些原始数据的处理方式方法对这个机器学习问题才是最关键的,原来我在这块也有忽视,做的比较少,以后会重点做好这块的工作,以下是以下我实现的一些降维的方法:

    1、主成分分析(PCA)

       地址(http://blog.csdn.net/google19890102/article/details/27969459),PCA是一种较为常用的降维技术,PCA的思想是将维特征映射到维上,维是全新的正交特征。这维特征称为主元,是重新构造出来的维特征。

    2、奇异值分解(SVD)

       地址(http://blog.csdn.net/google19890102/article/details/27109235),SVD的思想与特征值、特征向量的概念类似,提取出重要的向量,便称为左奇异向量和右奇异向量。


    以上是我花了一点时间把我做的机器学习相关算法做的一个目录,方便大家查阅,有什么疏漏或者错误的地方还希望大家提出来,有好的资料大家也可以互相分享,我做的工作还很粗浅,也比较少,希望在以后的日子里和大家一起进步,一起努力,谢谢各位。



    展开全文
  • 机器学习算法概述 “机器智能是人类永远需要的一项发明。”— Nick Bostrom. ​ 如果您可以回顾几年前的AI并将其与现在的AI进行比较,您会惊讶地发现AI的发展速度随着时间的增长呈指数级增长。 ​ 它已扩展到...

    机器学习算法概述

    “机器智能是人类永远需要的一项发明。”— Nick Bostrom.

    ​ 如果您可以回顾几年前的AI并将其与现在的AI进行比较,您会惊讶地发现AI的发展速度随着时间的增长呈指数级增长。

    ​ 它已扩展到各种领域,例如ML,Expert Systems,NLP等数十个领域。

    ​ 尽管AI的思路是构建可以自行思考和执行的更智能的系统,但仍然需要对其进行训练。

    ​ AI的ML领域是为实现非常精确的目标而创建的,它引入了多种算法,从而可以更顺畅地进行数据处理和决策。

    什么是机器学习算法?

    机器学习算法是任何模型背后的大脑,可让机器学习并使其更智能。

    ​ 这些算法的工作方式是,为它们提供第一批数据,并且随着时间的流逝和算法的准确性的提高,额外的数据也被引入到算法中。

    ​ 定期将算法应用于新数据和新经验的过程可提高机器学习的整体效率。

    ​ 机器学习算法对于与分类,预测建模和数据分析相关的各种任务至关重要。

    “机器学习方面的突破将价值十个微软。”- Bill Gates

    机器学习算法的类型

    ​ 在本节中,我们将重点介绍现有的各种ML算法。 ML算法的三个主要范例是:

    监督学习

    ​ 顾名思义,监督算法通过定义一组输入数据和预期结果来工作。 通过在训练数据上迭代执行功能并让用户输入控制参数来改进模型。 如果发现其映射的预测正确,则认为该算法是成功的。

    监督学习

    无监督学习

    ​ 在监督算法在用户标记的数据上进行输出预测时,将这些训练结果在没有用户干预的情况下来训练未标记数据。

    ​ 这个算法可以对数据进行分类和分组,以识别一些隐藏或未发现的类别,通常用作监督学习的初步步骤。

    无监督学习

    强化学习

    ​ 强化学习算法旨在在探索和开发之间找到完美的平衡,而无需标记数据或用户干预。

    ​ 这些算法通过选择一个动作并观察结果来工作,在此基础上,它了解结果的准确程度。 反复重复此过程,直到算法选择正确的策略为止。

    流行的机器学习算法

    ​ 在熟悉了几种类型的ML算法之后,我们继续演示一些流行的算法。

    1.线性回归

    ​ 线性回归是一种监督型ML算法,可帮助找到点集合的近似线性拟合。

    ​ 线性回归的核心是识别两个变量之间关系的线性方法,其中两个值之一是从属值,另一个是独立的。

    ​ 其背后的原理是要理解一个变量的变化如何影响另一个变量,从而导致正或负的相关关系。

    线性回归以y = a + bx的形式表示为一条线

    ​ 该线称为回归线,由线性方程Y = a * X + b表示。

    ​ 在此等式中:

    • Y —因变量
    • a —坡度
    • X-自变量
    • b-截距

    ​ 该算法适用于预测输出是连续的并且具有恒定斜率的情况,例如:

    • 估算销售额
    • 评估风险
    • 天气数据分析
    • 预测分析
    • 客户调查结果分析
    • 优化产品价格

    1. Logistic回归

    ​ Logistic回归算法通常用于二进制分类问题,在这些情况下,事件通常会导致通过或失败,正确或错误这两个值中的任何一个。

    ​ 最适合需要预测因变量将属于两类之一的概率的情况。

    ​ 该算法的常见用例是确定给定的笔迹是否与所讨论的人匹配,或未来几个月的油价是否会上涨。

    ​ 通常,回归可用于实际应用中,例如:

    • 信用评分
    • 癌症检测
    • 地理图像处理
    • 手写识别
    • 图像分割与分类
    • 衡量营销活动的成功率
    • 预测某种产品的收入
    • 特定日子会发生地震吗?
    1. 决策树

    决策树算法属于监督型机器学习,用于解决回归和分类问题。 目的是使用决策树从观察并处理每个级别的结果。

    ​ 决策树是一种自上而下的方法,其中从训练数据中选择最合适的属性作为根,并对每个分支重复该过程。 决策树通常用于:

    • 建立知识管理平台
    • 选择要旅行的航班
    • 预测酒店的入住高峰日期
    • 向客户建议要买什么车
    • 预测预测并确定各个领域的可能性

    决策树算法
    1. Apriori机器学习算法

    它是几种在线平台上经常推荐的算法。

    ​ 它通过在数据集中搜索通用的数据进行操作,然后在它们之间建立关联。

    ​ 它通常用于数据挖掘和从关系数据库学习关联规则。

    ​ 该算法背后的思想是保持相关项目尽可能扩展到更大的集合,以创建更有用的关联。

    ​ 该算法的应用包括突出显示市场中的购买趋势。

    ​ 此外,它更易于实现,并且可以用于大型数据集。

    1. 朴素贝叶斯

    朴素贝叶斯分类器被归类为高效的监督ML算法,并且是最简单的贝叶斯网络模型之一。

    ​ 它通过对数据应用贝叶斯定理,并假设给定变量的值的情况下,每对特征之间都具有条件独立性。

    朴素贝叶斯分类

    ​ 简而言之,考虑到事件B已经发生,用它来找到事件A发生的可能性。 朴素贝叶斯最适合-

    • 过滤垃圾邮件
    • 推荐系统,例如Netflix
    • 对有关技术,政治或体育的新闻文章进行分类
    • 社交媒体上的情感分析
    • 面部识别软件
    1. 人工神经网络

    ​ 仿照人脑建模的人工神经网络实现了神经元的巨大迷宫,或者说简化并模拟了节点之间相互传递信息的过程。

    ​ 这些相互连接的节点通过边缘将数据瞬时传递给其他节点,以进行快速处理,从而使学习更加顺畅。

    ​ 人工神经网络从数据集中学习,而不是通过一组特定的规则进行编程。 能够对非线性过程进行建模,它们可以在以下领域中实施:

    • 模式识别
    • 网络安全
    • 数据挖掘
    • 检测患者的癌症种类

    人工神经网络算法
    1. K-Means聚类

    ​ k-均值聚类是一种迭代的无监督学习算法,可将n个观察值划分为k个簇,每个观察值均属于最近的簇均值。

    K-means算法的步骤

    ​ 简而言之,该算法基于数据点的相似性来聚合数据点的集合。 它的应用范围包括在Python,SciPy,Sci-Kit Learn和data mining等编程语言和库中聚集相似和相关的网络搜索结果。

    K均值聚类的实际应用-

    1. 识别假新闻

    2. 垃圾邮件检测和过滤

    3. 按类型对书籍或电影进行分类

    4. 规划城市时的热门交通路线

    5. 支持向量机

    ​ 支持向量机被归类为监督机器学习算法,主要用于分类和回归分析

    ​ 该算法通过建立一个可以将新示例和新数据分配给一个类别的模型来工作,每个类别间可以容易地区别开来。

    ​ 在维数大于样本数的情况下,SVM非常有效,并且存储效率极高。

    高效的支持向量机算法

    ​ SVM应用程序可以在以下领域找到:

    • 人脸检测
    • 影像分类
    • 文本和超文本分类
    • 手写识别
    • 药物疗法的发现
    • 生物信息学-蛋白质,基因,生物学或癌症分类。
    1. K近邻算法

    ​ K近邻是一种用于回归和分类问题的监督ML算法。

    ​ 通常用于模式识别,该算法首先存储并使用距离函数识别数据中所有输入之间的距离,选择最接近中心点的k个指定输入并输出:

    • 最经常出现的标签(用于分类)
    • k个最近邻居的平均值(用于回归)

    K近邻算法

    ​ 该算法的实际应用包括:

    • 指纹检测
    • 信用评级
    • 预测股市
    • 分析洗钱
    • 银行破产
    • 汇率
    1. 降维算法

    ​ 降维算法通过使用两种主要方法(特征选择或特征提取)之一减少数据集中的维度空间或随机变量的数量来工作。

    ​ 此算法通常用于预处理数据集并删除冗余特征,从而使算法更容易训练模型。

    ​ 此算法还具有一些不错的好处,例如:

    • 内储需求低
    • 所需的计算能力更少
    • 精度更高
    • 降低噪音

    ​ 一些著名的降维算法是:

    • 主成分分析
    • 线性判别分析
    • 局部线性嵌入
    • 多维缩放
    1. 主成分分析

    ​ 主成分分析是ML的无监督算法之一,主要用于通过使用特征消除或特征提取来缩小特征空间的维数

    ​ 它也是探索性数据分析和建立预测模型的工具。 需要标准化的数据,PCA可以作为帮助:

    • 图像处理
    • 电影推荐系统
    • 计算数据协方差矩阵
    • 对协方差矩阵执行特征值分解
    • 优化多个通信通道中的功率分配

    主成分分析法

    ​ PCA旨在减少数据集中的冗余,使其更简单而又不影响准确性。 它通常部署在图像处理和风险管理领域。

    1. 随机森林

    ​ 随机森林通过实现决策树使用多种算法来解决分类,回归和其他类似问题

    ​ 它的工作方式是,创建带有随机数据集的决策树堆,并在其上反复训练模型以获得接近准确的结果。

    ​ 最后,将来自这些决策树的所有结果组合在一起,以识别出最常出现在输出中的最合适的结果。

    随机森林

    ​ 可以在以下领域找到“随机森林”应用程序:

    1. 银行账户,信用卡欺诈检测

    2. 检测并预测药物的药物敏感性

    3. 通过分析患者的病历来识别患者的疾病

    4. 预测购买特定股票时的估计损失或利润

    5. 梯度增强和Ada增强

    ​ 增强是一种用于集成ML算法的技术,可将弱学习者转换为强学习者。 当数据丰富时,需要使用增强算法,并且我们试图减少监督学习中的偏差和方差。 以下是两种流行的增强算法。

    • 梯度增强

    ​ 通常以迭代方式(例如决策树)构建预测模型,将梯度增强算法用于分类和回归问题。 通过对强者的错误进行培训,从而提高了弱者的学习能力,从而获得了一个比较准确的学习者。

    • Ada增强

    ​ AdaBoost是Adaptive Boosting的缩写,当弱学习者失败时,它会改进模型。 它通过修改附加到样本中实例的权重以将精力更多地集中在困难实例上来实现,然后,弱学习者的输出将被合并以形成加权总和,并被视为最终的提升后的输出。

    结论:

    ​ 机器学习算法对于数据科学家来说至关重要,因为它们在现实世界中的应用日益广泛。 使用上述各种算法,您可以找到最适合解决问题的算法。 尽管这些算法有有监督也有无监督,但它们可以处理各种任务,并且能够与其他算法同步工作。

    作者:Claire D.

    deephub翻译组:孟翔杰

    展开全文
  • 机器学习算法简要

    万次阅读 2018-11-20 11:33:45
    机器学习算法很多,按照是否有标注,以及要解决的问题特点,按照如下规则分类。 有监督学习 分类问题 决策树: 支持向量机 朴素贝叶斯:条件概率 集成学习(多个分类算法的结合) Boosting:弱学习提升为强学习 ...

    1 算法分类

    机器学习算法很多,按照是否有标注,以及要解决的问题特点,按照如下规则分类。

    • 有监督学习
      • 分类问题
        • 决策树:
        • 支持向量机
        • 朴素贝叶斯:条件概率
        • 集成学习(多个分类算法的结合)
          1. Boosting:弱学习提升为强学习
          2. Bagging, 随机森林:并行多个分类算法,最终进行集成
      • 序列问题
        • HMM隐马尔科夫模型
        • MEMM最大熵马尔科夫
        • CRF条件随机场
      • 回归预测
        • 线性回归
    • 无监督学习
      • 聚类
    • 半监督学习,强化学习
    • 迁移学习

    2 算法介绍

    决策树

    常用在分类问题中,有监督学习。包含一个根节点和一些内部节点,他们表示决策条件。叶子节点则表示决策结果。从根节点到每个叶子节点都形成了一个决策序列。样本集从根节点开始判断,即可得到最终结果。最终结果不符合标注,则产生误差。通过调整内部节点的决策条件,比如下图中的A B C D E的值,可以使得样本误差最小。从而得到最佳决策树。

    决策树example

    随机森林

    说到决策树,就不得不说随机森林了。决策树是一棵树,而随机森林则是很多决策树组成的森林。树之间完全独立,无关联。随机森林的训练过程如下

    1. 如果样本集个数为N,则有放回的选择N个样本,作为一颗决策树的训练样本。由于是又放回的,故里面可能有重复,实际样本会小于N,从而防止过拟合。
    2. 样本属性如果为M(例如上面决策树中的学生,有分数、出勤率、回答作业次数和作业提交率,共计4个属性),则选择m个属性作为决策树的节点,其中m远小于M。然后从根节点开始进行分裂,得到一颗决策树
    3. 利用又放回抽样得到的N个样本,对包含m个内部节点的决策树,进行训练,调整m个内部节点的决策条件,使得误差最小。这样就得到了一颗决策树。
    4. 重复1~3步骤,这样可以得到大量的决策树,形成随机森林。

    随机森林的预测过程如下

    1. 将输入放到随机森林的每一颗决策树上,从根节点开始进行决策判断,得到多个分类结果
    2. 统计分类结果,选择最多的为最终输出。

    相比决策树,随机森林充分发挥群众优势,少数服从多数的思想。通过多颗决策树,三个臭皮匠赛过诸葛亮,提高了预测精度。其优点有

    1. 通过随机抽样和随机属性选取,减少了单颗决策树的过拟合问题。
    2. 通过随机抽样和随机属性选取,大大提高了泛化能力,抗噪声能力也加强了。
    3. 森林内的树之间完全独立,容易并行训练和并行预测,提高训练和预测速度。
    4. 随机森林不仅可以做有监督学习,还可以做无监督聚类,使用范围很广,没有明显缺点。
      一般情况下,在不知道该使用哪种机器学习算法的时候,可以使用随机森林。它使用范围很广,没有明显缺点。

    K近邻

    K近邻也是应用于分类领域,同样是一种少数服从多数的思想,其步骤如下

    1. 对输入数据,在样本集中找到K个离他最近的数据
    2. 根据这些数据的标注,选择类别最多的为最终输出。

    在这里插入图片描述
    如上图,蓝色方框和红色三角是样本数据,他们属于两种不同的分类。绿色圆圈为输入,需要预测它属于哪个分类。如果K=3,则我们找到绿色圆圈最近的三个样本数据,即两个红色和一个蓝色。由于红色数目多于蓝色,故判定最终结果为红色。

    K近邻算法很简单,要注意的有

    1. 最近邻可以使用距离还进行计算,距离的算法有绝对值距离,欧式距离等多种,一般使用欧式距离,即平方根距离。
    2. 样本数据的每个属性特征,必须做归一化,使得他们同等重要。
    3. K选择过小容易有噪声,选择过大容易过拟合。K的选择要通过不断调整。

    支持向量机SVM

    支持向量机support vector machine,同样是有监督分类的一种算法。可以简单理解为,训练阶段,它通过一根直线或曲线,将两个分类完全隔离开。预测阶段,判断数据属于曲线的那一边,则为哪个分类。

    在这里插入图片描述

    曲线两边的空白margin越多,则训练得到的这条线的误差越小,泛化能力越强。故SVM准确度取决于离他最近的点。如下

    在这里插入图片描述
    找到这些最近的点,即可得到最终的分隔线。

    深度学习

    深度学习神经网络是当前的热点,大大降低了机器学习的先验知识门槛,泛化能力很强。它需要大量的数据,进行大规模计算,从而得到最终的模型。这儿就不单独展开了。

    隐马尔科夫模型HMM

    适用于序列问题中,故在自然语言处理中应用十分广泛。jieba分词和词性标注,都使用了隐马尔科夫模型。任何一个HMM都可以由一个五元组来描述:观测序列,隐藏序列,隐藏态起始概率,隐藏态之间转换概率(转移概率),隐藏态表现为观测值的概率(发射概率)。其中起始概率,转移概率和发射概率可以通过大规模样本统计来得到。

    例如在分词中,HMM的五元组分别为

    • 观测序列:语句本身,我们能看见的
    • 隐藏序列:由BMES构成的分词标注序列,上篇文章详细讲解了的。每个汉字可以由BMES来进行标注,B表示词语的开始,M词语中间,E词语结束,S单字词语。比如“有意见分歧”对应的标注有两种,为SBEBE和BESBE,分别对应分词序列“有/意见/分歧”和“有意/见/分歧”。
    • 发射概率:隐藏值到观测值的概率,比如S是汉字“有”的概率。
    • 起始概率:隐藏值起始概率,起始只能是B或者S,通过语料大规模训练可以得到B和S作为起始的概率。结果为{‘B’: 0.769, ‘E’: 0, ‘M’: 0, ‘S’: 0.231},可见起始为B的概率要远大于S,这也符合我们通常情况。
    • 转移概率:隐藏值之间转移的概率,比如B->E, 表示为P(E|B), B->M, 表示为p(M|B)

    下面来看预测时,HMM的工作过程。以“有意见分歧”这个语句进行分词举例。最终我们要得到这个观测语句的隐藏序列,也就是BEMS序列。

    1. 计算第一个字,也就是“有”分别为BEMS四个隐藏态的概率。通过发射概率和起始概率的乘积得到。
      1. p1(B|“有”) = p(B起始概率) * p(“有” -> B)
      2. p1(E|“有”) = p(E起始概率) * p(“有” -> E) = 0
      3. p1(M|“有”) = p(M起始概率) * p(“有” -> M) = 0
      4. p1(S|“有”) = p(S起始概率) * p(“有” -> S)
    2. 计算第2个字,也就是“意”分别为BEMS四个隐藏态的概率。
      1. p2(B|“意”) = p1(B) x p2(B -> B) x p2(“意” -> B) + p1(S) x p2(S -> B) x p2(“意” -> B)
      2. p2(E|“意”) = p1(B) x p2(B -> E) x p2(“意” -> E) + p1(S) x p2(S -> E) x p2(“意” -> E)
      3. p2(M|“意”) = p1(B) x p2(B -> M) x p2(“意” -> M) + p1(S) x p2(S -> M) x p2(“意” -> M)
      4. p2(S|“意”) = p1(B) x p2(B -> S) x p2(“意” -> S) + p1(S) x p2(S -> S) x p2(“意” -> S)
    3. 计算第3个字,也就是“见”分别为BEMS四个隐藏态的概率。方法和第二个字计算方法相同。
    4. 依次计算后面的每一个字,为BEMS四个隐藏态的概率。
    5. 选取最后一个字,对应为BEMS中概率最大的状态,作为最终态。然后回溯,依次推导出倒数第二个字,第三个字的BEMS状态。比如上面p2来倒推p1时,如果第二个字为B的概率最大,则可以看到p2(B)由两个概率相加得到的,即p1(B) x p2(B -> B) x p2(“意” -> B)和p1(S) x p2(S -> B) x p2(“意” -> B) ,然后比较这两者的大小,选取大的。如果p1(B) x p2(B -> B) x p2(“意” -> B)大,则可以倒推得到p1应该为B。
    6. 回溯完成后,就可以得到所有字的BEMS状态了。也就是根据观测序列得到了隐藏序列。

    HMM在序列问题,特别是自然语言处理中应用十分广泛。

    条件随机场CRF

    条件随机场也是解决序列问题的,和HMM隐马尔科夫很相似。不同在于HMM是生成式的,而CRF是判别式的。

    3 总结

    机器学习算法具有泛化能力强的优点,使得人工智能称为了可能。算法很多,实现也较为复杂。当前,机器学习的一大分支,深度学习十分火热。跟其他算法相比,深度学习具有领域知识门槛低,泛化强,精度高的优点。但同时,他对计算能力和计算数据的要求也特别高。在计算数据规模不够大时,我们可以考虑利用传统的机器学习算法。故掌握机器学习算法也是十分必要的。

    展开全文
  • 机器学习:常见的机器学习算法归纳

    万次阅读 多人点赞 2021-03-11 09:22:43
    1) .回归算法 2) .基于实例的算法 3) .决策树学习 4) .贝叶斯方法 5) .基于核的算法 6) .聚类算法 7) .降低维度算法 8) .关联规则学习 9) .集成算法 10) .人工神经网络
  • 机器学习算法地图

    千次阅读 多人点赞 2018-07-05 12:10:07
    其它机器学习、深度学习算法的...文章《机器学习算法地图》系SIGAI原创,仅供个人学习使用,未经允许,不得转载,不能用于商业目的。如需获取原版PDF全文,可搜索关注VX公众号SIGAICN。(https://0x9.me/dxRg5) ...
  • 机器学习算法选取

    万次阅读 2019-04-23 16:56:06
    下面代码选取了五种主流机器学习算法,包括SVM、KNN、决策树、逻辑回归、朴素贝叶斯,当然也包括集成学习算法,Bagging、Adaboost、GBDT和随机森林。编写一个通用函数分别构建上述模型,并作出ROC曲线进行模型评估。...
  • 机器学习算法集锦

    万次阅读 2017-02-20 22:52:42
    机器学习机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有...
  • 机器学习算法入门介绍

    千次阅读 2018-07-09 10:59:12
    2.机器学习算法分类 3.机器学习模型是什么 我们做什么? 分析大量数据 分析具体业务 应用常见算法 特征工程、调参数、优化 我们应该怎么做? 学会分析问题,使用机器学习算法的目的,想要算法完成何种任务...
  • 【机器学习】机器学习算法之旅

    千次阅读 2018-05-19 20:57:56
    在这篇文章中,我们将介绍最流行的机器学习算法。 浏览该领域的主要算法以了解可用的方法是有用的。 有很多算法可用,当算法名称被抛出时,它会感到压倒性的,并且您只需要知道它们是什么以及它们在哪里适合。 我想...
  • 机器学习算法 无监督学习 算法

    千次阅读 2019-06-26 14:51:22
    本文介绍无监督学习算法: 聚类算法 Apriori算法 FP-growth 算法 1 聚类算法 2 Apriori算法 3 FP-growth 算法
  • 机器学习算法

    千次阅读 2016-07-01 17:38:25
    这里 IT 经理网为您总结一下常见的机器学习算法,以供您在工作和学习中参考。  机器学习的算法很多。很多时候困惑人们都是,很多算法是一类算法,而有些算法又是从其他算法中延伸出来的。这里,我们从两个方面来...
  • 在本指南中,我们将通过现代机器学习算法进行实用,简洁的介绍。虽然存在其他这样的列表,但它们并没有真正解释每种算法的实际权衡,我们希望在这里做。我们将根据我们的经验讨论每种算法的优缺点。 对机器学习算法...
  • 机器学习算法总结

    千次阅读 2017-03-22 11:04:14
    机器学习 算法 神经网络 支持向量机
  • 人工智能之机器学习算法的介绍

    千人学习 2017-02-28 17:24:05
    机器学习算法入门教程,主要介绍人工智能机器学习常见算法,包括决策树、基于概率论的分类方法:朴素贝叶斯、Logistic回归、支持向量机、第利用AdaBoost元算法提高分类性能。
  • 机器学习算法背后的数学原理

    千次阅读 多人点赞 2020-09-06 09:29:04
    不同的机器学习算法是如何从数据中学习并预测未知数据的呢? ​ 机器学习算法的设计让它们从经验中学习,当它们获取越来越多的数据时,性能也会越来越高。每种算法都有自己学习和预测数据的思路。在本文中,我们将...
  • 常见机器学习算法背后的数学

    千次阅读 2020-08-05 08:46:20
    不同的机器学习算法是如何从数据中学习并预测未见数据的呢? 机器学习算法是这样设计的,它们从经验中学习,当它们获取越来越多的数据时,性能就会提高。每种算法都有自己学习和预测数据的方法。在本文中,我们将介绍...
  • 机器学习算法 综述(入门)

    万次阅读 多人点赞 2019-06-16 21:59:28
    学习了一个学期机器学习算法,从什么都不懂到对十个机器学习算法有一定的了解,下面总结一下十大机器学习算法,从算法的概念、原理、优点、缺点、应用等方面来总结,如果有错误的地方,欢迎指出。 目录 1.决策树...
  • 机器学习算法基础

    万人学习 2018-12-18 14:02:49
    30个小时知识无盲区课程,覆盖十多个行业应用。
  • 机器学习十大算法

    万次阅读 多人点赞 2018-08-18 09:26:05
    机器学习十大算法 http://www.52cs.org/?p=1835   作者 James Le ,译者 尚剑 , 本文转载自infoQ 毫无疑问,机器学习/人工智能的子领域在过去几年越来越受欢迎。目前大数据在科技行业已经炙手可热,而...
  • 机器学习算法一览表(中英对照)附opencv机器学习模块
  • Python机器学习算法和实践

    千人学习 2018-06-22 15:49:25
    机器学习算法实战教程,包括各种常用机器学习算法,该课程教学视频以手写形式+普通话授课(类似斯坦福大学授课方式),+Python代码。经典算法进行原理推导与案例实战双管齐下,具体课程内容包括K-Means算法、KNN算法...
  •  在了解算法之前,先要对机器学习算法进行分类,这样我们们可以更好地把握问题的本质,针对不同的问题选择更合适的算法。  机器学习问题 分类 - 在标注好的数据上建模,判别新样本的类型,如垃圾邮件识别 回归 ...
  • 机器学习算法推导

    千次阅读 2017-09-28 20:25:58
    心血来潮,想将所学到的知识写篇博客,作者所研究的方向为机器学习,刚学习的时候,走了很多弯路,看的书不少,在推导机器学习一些算法时候遇到了不少困难,查了不少资料,在刚才学的时候,有很多公式推导起来很困难...
  • 系统的学习机器学习课程让我觉得受益匪浅,有些基础问题的认识我觉得是非常有必要的,比如机器学习算法的类别。 为什么这么说呢?我承认,作为初学者,可能无法在初期对一个学习的对象有全面而清晰的理解和审视,...
  • 图解十大经典机器学习算法入门

    万次阅读 多人点赞 2018-01-30 14:07:46
    弱人工智能近几年取得了重大突破,悄然间,已经成为每个人生活中必不可少的一部分。以我们的智能手机为例,看看到底温...传统的机器学习算法包括决策树、聚类、贝叶斯分类、支持向量机、EM、Adaboost等等。这篇文章将对
  • 机器学习算法汇总

    千次阅读 2018-12-18 11:11:18
    简单总结一下在学习的过程中对Machine Learning算法模型理解: 决策树 ( decision tree)详解 集成算法(Bagging,随机森林) 集成算法(AdaBoost基本原理) Boosting算法(GBDT,XGBoost,LightGBM) SVM(Support ...
  • 写这篇文章的目的,就是希望它可以让有志于从事数据科学和机器...我也会写下对于各种机器学习算法的一些个人理解,并且提供R和Python的执行代码。读完这篇文章,读者们至少可以行动起来亲手试试写一个机器学习的程序。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 510,353
精华内容 204,141
关键字:

机器学习算法大全