机器学习实验

作者: 有机会一起种地OT | 来源:发表于2019-11-05 09:23 被阅读0次

    介绍
    第一部分 参数方法——类密度模型参数估计
    第二部分 监督学习——分类(基于似然的方法)
    第三部分 监督学习——分类(基于判别式的方法)(参数方法——判别式参数估计)
    第四部分 监督学习——回归
    第五部分 监督学习——关联规则
    第六部分 维度规约(特征的提取和组合)
    第七部分 半参数方法
    第八部分 非监督学习——聚类
    第九部分 非参数方法——密度估计
    第十部分 非参数方法——决策树实现的判别式
    第十一部分 多层感知器——非参数估计器
    第十二部分 局部模型
    第十三部分 支持向量机与核机器
    第十四部分 隐马尔科夫模型
    第十五部分 参数的贝叶斯估计
    第十六部分 集成学习——组合多学习器
    第十七部分 增强学习
    第十八部分 机器学习实验
    第十九部分 特征工程与数据预处理

    对一个给定的应用,多种算法都是可行的,那么如何选择算法,对比不同的算法呢?这实际上是这样一个问题:
    如何评价一个学习算法在给定应用上的好坏?
    也就是估计算法的期望误差如何,是否能够以足够的置信度说在之后的实际应用中,期望误差总是小于某个给定值?
    而如果解决了这个问题,那么在比较不同算法的问题上,考虑的就是“是否可以说一个算法的误差比另一个算法更低?”。

    在评价一个算法时,不能只看训练集上的误差并据此来做出判断。根据算法目标函数定义,训练集上的误差总是小于包含训练时未见实例的验证集上的误差

    类似地,训练误差不能用于比较两个算法。

    因此,我们需要一个不同于训练集的验证集。而且只运行一轮训练加检验是不够的。一方面因为,单一的训练集和验证集可能因为较小或含有异常值,会产生误导。此外,学习算法依赖于影响其泛化能力的因素(如一些超参数,输入模型,初始值等),只运行一轮无法识别这些因素的影响。只有在学习方法的代价非常高以至于只能训练和验证一次的时候,才可接受。

    每训练一次,在数据集上产生一个学习器,并得到一个验证误差。对一个学习算法的评估基于这些验证误差的分布。根据分布来评估算法在给定问题上的期望误差,或将其与其他算法的误差分布进行比较。

    这样,当在一个数据集上使用训练集训练学习器,在验证集上检验它的准确率并试图提取结论时,我们所做的就是实验。

    机器学习实验的因素和响应

    机器学习的任务是得到具有最高泛化准确率、最小复杂度的学习器,同时希望学习器鲁棒。

    机器学习实验则是为了达成机器学习的任务所进行的实验。一个实验是一次检验或一系列检验,其考察一个在训练集上训练过的,能够对给定输入产生输出的学习器。实验中影响输出的因素包括使用的算法、训练集、输入特征等。而实验得到的输出结果(如分类准确率)称为响应,不同的因素会有不同的响应。通过观察响应,来识别重要的因素,或找出能优化响应的因素。实验的目的,是通过规划实验,分析数据,来排除随机性的影响,得到统计显著的结论,进而找到具有最高泛化准确率、最小复杂度的学习器。

    实验中涉及的因素可以分为可控因素和不可控因素。可控因素包括具体使用的算法、算法的超参数、输入的模式、初始值等。不可控因素则包括数据中的噪声、数据抽取及优化过程中的随机性。

    响应则是通过学习器输出产生的。包括检验集上的平均分类误差、使用损失函数的期望误差等度量准确率的指标测度。

    有了因素和响应,需要为最佳响应找到这些因素的最佳设置,确定各因素对响应的影响,这也是实验的目的所在。有多种实验策略,最常使用的一种策略称作网格搜索,对不同的因素取值进行组合,分别对比不同因素设置的差异。这种方式在各机器学习工具中都有使用。

    实验的基本原则

    1. 随机化
      随机化要求实验对不同因素设置组合所进行的次序应该是随机的,
    2. 重复
      重复意味着对每种不同可控因素的设置,都应该进行多次实验。以便通过平均抵消不可控因素带来的影响。在机器学习中,这通常通过在相同数据集的许多再抽样的版本上运行相同的算法来实现,也就是交叉验证
    3. 阻止
      阻止用来降低有害因素(指影响响应但我们对其不关心的因素)导致的可变性,保证有害因素不影响实验的对比。举例来说,当比较不同算法时,其准确率不仅取决于不同的算法,还取决于不同的训练集。所以为了保证对比是有意义的,需要保证对于不同算法,用于进行多次训练的不同训练集是一样的。

    机器学习实验的一些要点

    对于任何机器学习实验来说,步骤都是相同的。唯一的区别是所收集的响应数据的抽样分布。

    首先需要明确的是机器学习实验的研究目标,我们感兴趣的是评估一个学习算法在特定问题上的期望误差(响应度量)。一般情况下,我们会从多个算法中选择具有最低误差的一个,或对给定数据集将它们按误差排序。

    接下来要明确实验的因素,它取决于研究目标。固定算法的时候,因素就是要找出的最佳超参数;在比较算法的时候,因素就是不同的学习算法。对于因素依赖于输入标度的情况(如Parzen窗口的展宽h,不能简单地尝试1,2等绝对值,这样会错失很多数据),为了避免错过好的配置,需要对其进行规范化,使之不依赖于输入的标度,采用指示标度的统计量。

    对于响应变量的选择,最常用的是误差,也就是分类问题的误分类错误或回归问题的均方误差。此外,还可以使用风险度量(损失函数)。

    在结束机器学习实验的验证后,选定了某一算法和相应的因素,这时希望给出其期望误差。为此需要使用另一个在实验训练过程中未曾使用过的检验集(test set)。一般地,给定一个数据集,会留1/3作为检验集。而其余的做交叉验证产生多组训练集验证集用于实验确定超参数,通常可以通过抽样来对数据集进行分割。

    实际上,对于准确率相差不大的学习器,需要很多的检验集才能予以分辨。如90% 和 90.1%的准确率,需要检验集容量达到10000才可能检测到这0.1% 的性能提升。但这0.1%的性能提升有时候对于决策非常重要,大数据时代使得我们可以实现这样的提升。

    通过机器学习实验找到最好的因素设置后,就可以进行机器学习任务了。这时确定了因素的机器学习任务,可以使用之前实验过程中使用的训练和验证集来作为机器学习任务的数据。

    在做实验的过程中,最好保留一些中间结果,尤其是一些大型试验。这样可以随时在需要时重新运行整个实验的一部分。实验过程中的所有结果都应当是可再现的。

    交叉验证

    给定数据集X,从该数据集中产生K对训练集/验证集\{T_i,V_i \}_{i=1}^K。要保持训练集和验证集尽可能大,使得误差的估计具有鲁棒性。往往数据集X不够大,不能简单地通过将其分为K个部分来获得训练集/验证集,而是通过不同划分来重复使用X,这就成为交叉验证

    在划分数据集X时,要保持不同集合间的重叠尽可能小。还要确保在抽取子集时,保证各类比例符合实际,不扰乱类的先验概率,这称为分层

    K折交叉验证

    K折交叉验证时中,数据集X被随机地划分K等分X_i(i=1,\cdots,K)。并将K份数据中的一份保留做验证集,其余K-1份合并作为训练集,从而产生K对训练集/验证集。
    这种方法比较常见,但也存在一些问题。首先其为了保证训练集足够大,使得验证集较小。其次,训练集相当大程度上存在重叠,任意两份训练集都有K-2份数据重叠。实践中,K一般取10~30。K越大,训练集的实例比例就越大。

    5*2交叉验证

    5*2交叉验证通过将数据集X均分为两部分,来获得等大小的训练集和验证集。每一次均分通过随机不放回抽样实现,得到的两部分数据X_1X_2分别作为训练集和验证集。一般五次均分得到的十组训练集/验证集已经共享了许多实例,所以不再获取更多的均分数据集,所以称为*2交叉验证。

    更多的交叉验证方式和应用场景在《scikit-learn 中的交叉验证方法》中结合 scikit-learn 提供的交叉验证方法进行了介绍。

    分类器性能的度量

    对于分类器,特别是对于两类问题,已经提出了各种度量。在两类问题中,存在四种情况,正确预测的正例(真正true positive),错误预测的正例(假负false negative),正确预测的负例(真负true negative),错误预测的负例(假正false positive)。

    两类问题混淆矩阵 及 性能度量

    在两类问题中存在两种类型的错误:假正(TypeⅠerror)、假负(Type Ⅱ error)。通常所关注的性能度量有以下几种:

    性能度量 公式
    真正率(TPR) \frac{\sum True\ positive}{\sum Condition\ positive}
    假正率(FPR) \frac{\sum False\ positive}{\sum Condition\ negative}
    误差 \frac {\sum (False\ negative\ +\ False\ positive)}{N}
    精度(precision) \frac{\sum True\ positive}{\sum Predicted\ condition\ positive}
    召回率(recall) 同 真正率(TPR)
    灵敏度(sensitivity) 同 真正率(TPR)
    特效型(specificity) 1 - 假正率(FPR)

    假设系统返回正例的概率为\hat{P}(C_1|x),对于负例有\hat{P}(C_2|x)=1-\hat{P}(C_1|x),并且如果\hat{P}(C_1|x)>\theta,则系统预测“正的”。如果\theta接近于1,则几乎不预测为正类,将没有假正例,但也只有少数真正例。随着减小\theta来增加真正例数,但同时又引入假正例的风险。

    对于不同的\theta,得到许多(TPR,FPR)值对,连接它们得到接受者操作特征(ROC)曲线。

    ROC曲线 相交的ROC曲线

    理想情况下,分类器的真正率为1,假正率为0。因此ROC曲线越靠近左上角的分类器越好。在对角线上,真决策和假决策一样多,这时最坏的情况。如果两条ROC曲线相交,则在不同的损失条件\theta下,在上方的好于在下方的。

    ROC曲线下方的面积称作AUC,理想情况下,分类器的AUC为1。所以如果一个分类器的AUC较大,则它更可取。通过计算AUC,可以比较不同的分类器在不同损失条件\theta下平均的整体性能。

    精度(precision)和召回率(reacll)在则是从返回的符合要求的样本量的角度来考虑的。精度是预测到的且符合要求的样本数除以预测到的所有样本的总数。召回率则是预测到的符合要求的样本数除以所有符合要求的样本的总数。如果精度是1,则所有预测到的数据都符合要求,但可能还存在一些符合要求的几率没有被预测到。而如果召回率是1,则意味着所有符合要求的数据都被预测到了,但仍然可能预测了一些不符合要求的数据。

    从另一个角度但以相同的目的,还有两个度量,就是灵敏度(sensitivity)和特效型(specificity)。灵敏度与真正率和召回率相同。特效型则度量预测负实例的好坏程度,是真负实例数除以负实例总数。

    对于K>2个类,如果使用0/1误差,则类混淆矩阵是一个K*K矩阵,其中元素(i,j)是属于C_i类但被分类到C_j类的实例个数。理想情况下,所有非对角线元素均应为0,表示没有错误分类。

    相关文章

      网友评论

        本文标题:机器学习实验

        本文链接:https://www.haomeiwen.com/subject/shvdbctx.html