精华内容
下载资源
问答
  • 怎么选择模型
    万次阅读
    2020-03-08 04:23:00

    对于经常构建进化树的朋友来说,MEGA应该是个老朋友了。MEGA从1993年的第一个版本问世一直锤炼到去年刚刚发布的MEGA-X,已经经历了26年,在这期间,MEGA共更新八个版本,先后在Molecular Biology and Evolution、Bioinformatics、Computer Applications in the Biosciences等期刊上发表共十篇论文,总引用量已经超过11万。对于如此熟悉的一个老朋友,让我们今天一起来了解一下它的新版本MEGA-X,开发它更多的使用方法。 MEGA-X的官网网址是 https://www.megasoftware.net/,它支持在Windows、MacOS 以及Linux 系统下运行,有图形界面和命令行两个版本可供选择,支持64 位和32 位,与之前的版本比较,MEGA-X 最大的特点是大数据运算能力增强,并且支持多种计算平台

     

    今天主要介绍的是在MEGA-X图形界面下构建系统发育树并且对发育树进行美化。下载安装好MEGA-X后,首先打开软件。

     

    此处我们以一株细菌的16S rRNA序列为目标序列,首先在NCBI中进行Blast比对,下载将要一起比对建树的菌株序列。在NCBI中输入序列或者上传文件,选择数据库时可以选择「Nucleotide collection(nr/nt)」或者「16S ribosomal RNA sequences」数据库,一般来说nr/nt库信息比较全面。

     

    我们选择了10个不同种的16S rRNA序列进行下载。另外,此处还可以比对下载2-3条大肠杆菌(Escherichia coli)和沙门氏杆菌(Salmonella)的16S rRNA序列作为外类群(在Organism选项中进行物种限定),后面推断进化时间的时候可以用到。将所有下载的序列整理在一个文件中,为了方便后面的建树可以将菌株名称后面多余的信息在这里替换删除掉(只是名称上的信息,不要改动碱基序列),然后将文件的扩展名改为.fasta。在MEGA-X首页选择DATA,点击Open a File/Session,选择刚才的文件。

     

    打开文件时询问「Analyze or Align File?」,此处点击Align。序列中可能会出现混合碱基符号,混合碱基符号指两种或多种碱基(核苷)混合物的表示符号,或未完全确定可能属于某两种或多种碱基(核苷)的符号:R表示A+G;Y表示C+T;M表示A+C;K表示G+T;S表示C+G;W表示A+T;H表示A+C+T;B表示C+G+T;V表示A+C+G;D表示A+G+T;N表示A+C+G+T。

     

    接下来选择序列比对的方法:Muscle或者ClustalW。ClustalW的基本原理是首先做序列的两两比对,根据该两两比对计算两两距离矩阵,是一种经典的比对方法,使用范围也比较广泛。Muscle的功能仅限于多序列比对,它的最大优势是速度,比ClustalW的速度快几个数量级,而且序列数越多速度的差别越大。方法可以通过点击图中上方Alignment或者下方的图标「W」和「Muscle」来选择。如果你的序列是DNA编码序列,就一定要选择Align Codons,因为序列通过密码子比对比DNA序列的比对会更加真实,避免间隙对比对结果产生的影响。MEGA可以比较方便快速地将密码子排列比对,后续作为输入文件在软件PAML或DATAMONKEY中进行进化压力的分析时就会比较方便。

     

    在这里我们选择Muscle进行序列排列,点击Align DNA,会出现一些参数选项,根据自己需要进行修改,在这里直接点击OK选择默认参数即可。

     

    比对之后要去检查一下比对的情况,有的差异很大的或许是因为序列方向反了,这个时候要把它反转回来,右击这条序列,点击Reverse Complement,反转后一定要再次点击Muscle比对,检查是否大部分都对齐了。

     

    这里我们可以将最后对比后的文件导出,可以导出保存为MEGA格式。

     

    然后点击Data中的Phylogenetic Analysis直接进行系统发育分析。

     

    分析后返回主页面,接下来我们要选择一个最优的模型,提高建树的精确度。如果想要快速建树可以省去这一步,直接选择默认的模型。点击MODELS中的Find Best DNA/Protein Models(ML) 软件就会根据你的数据帮你计算寻找最适合的模型。

     

    分析时选择默认参数,开始进行分析计算。

     

    不久就会显示分析计算结果。具有最低BIC分数(BayesianInformation Criterion)的模型被认为是最好地描述替代模式。对于每个模型,还给出了AICc值(Akaike Information Criterion, corrected,值越低拟合程度越好),以及用来计算上述两个分值的最大似然值(lnL)和参数数量(包括分支长度)。在这里就可以看到,BIC分数最低的模型是K2+G+I,K2+G+I在这里就是最好的模型。

     

    但因为实际在后面的模型选择中,软件有时没有提供组合的模型来选择,所以我们继续看下面的BIC分数,可以找到单个模型中得分最小的,就是我们在这里要选择的最优模型。看到这里的BIC值最低的单个模型是TN93(Tamura-Nei)。

     

    模型选好后,就可以点击PHYLOGENY进行方法的选择了。构建系统发育树有三种主要的建树方法,分别是距离法、最大节约法(maximumparsimony, MP)和最大似然法(maximum likelihood,ML)。最大似然法考察数据组中序列的多重比对结果,优化出拥有一定拓扑结构和树枝长度的进化树,这个进化树能够以最大的概率导致考察的多重比对结果;距离树考察数据组中所有序列的两两比对结果,通过序列两两之间的差异决定进化树的拓扑结构和树枝长度,基于距离的方法有UPGMA、ME(Minimum Evolution,最小进化法)和NJ(Neighbor-Joining,邻接法)等;最大节约法考察数据组中序列的多重比对结果,优化出的进化树能够利用最少的离散步骤去解释多重比对中的碱基差异。在这些方法中,如果模型合适,ML的效果较好。对于近缘序列,有人喜欢MP,因为用到的假设最少,远缘序列上一般用NJ或者ML,这两个方法都是需要选择模型的。对于相似性很低的序列,NJ往往出现Long-branch attraction(LBA,长枝吸引现象),这种现象有时候会严重干扰进化树的构建。其实当序列的相似性比较高时,各种方法都会得到不错的结果,模型之间的差别也不是很大。所以平时我们一般推荐用两种不同的方法进行建树,如果得到的进化树类似,则结果较为可靠。这里我们先选择Neighbor-Joining法建树。

     

    点击方法后,选择自展值,即重复建树以进行检验的次数,一般选择1000以上才比较可靠。模型的话选择之前计算好的最优的模型,点击OK。

     

    稍等片刻,就初步构建好了这个树,接下来我们对这棵树进行一些调整和美化。首先我们看到每棵树的前面都标有自展值,这主要是对进化树进行评估的一个百分比值。因为进化树的构建是一个统计学问题,我们所构建出来的进化树只是对真实的进化关系的评估或者模拟。如果我们采用了一个适当的方法,那么所构建的进化树就会接近真实的「进化树」。这里的数值表示我们将该树重复构建1000(之前设置的数值)次,得到相同结果的次数占重复次数的百分比值。一般Bootstrap的值>70%,则认为构建的进化树非常可靠,50%-70%认为基本可靠,小于50%认为不可靠(不同的人对于这个阈值有不同的划分)。如果Bootstrap值太低,则有可能进化树的拓扑结构有错误。当Bootstrap的值小于50%时,我们一般选择隐去。

     

    点击左上的工具图标,隐去较低的自展值可以点击此处的Branches。

     

    设置隐去50以下的数值。

     

    这个工具栏里的其他选项还可以对字体和线条粗线长短等进行修改,并且将想要突出的菌株和分枝信息进行重点标注。

     

    左边的工具栏里还可以对进化树进行修改,比如改变树根,调整分枝的上下位置,以及重点标记突出某个分枝信息。

     

    最后美化结果。

     

    在这里还可以点击树形图标将进化树修改成为圆圈型和松针型。

     

    结果图展示如下。

     

    为了数据更加可靠,大家可以再选择另外一种方法进行建树,和上一种方法构建出的进化树进行比对。然后最后导出储存图片,这里提供EMP、SVG (矢量图,可进一步通过绘图软件如AI编辑)、PDF、PNG和TIFF (位图)几种格式来导出。

     

    记得将进化树的文本文件也保存一下。点击File中的Export Current Tree(Newick)保存Newick格式。

     

     保存后的树文件格式如下,导出的树文件便于之后在iTOL、Evolview、Figtree等工具中进行更进一步的美化,比如添加分类颜色、标记以及热图和条形图等。

     

    MEGA的使用非常方便,作为一个历史悠久并且极具创新精神的软件,它一直在提高自己的计算速度,丰富自己的计算平台。今天主要介绍了用图形界面MEGA-X建树的操作步骤,下次我们来介绍下根据MEGA-X构建的进化树来推断物种进化时间以及链接到DATAMOKEY等软件去计算进化压力等,期待一下吧。 参考文献:Kumar S, Stecher G, LiM, et al. MEGA-X: Molecular Evolutionary Genetics Analysis across computingplatforms[J]. Molecular Biology & Evolution, 2018.

    更多相关内容
  • 二值选择模型

    千次阅读 2021-09-16 21:29:29
    一、二值选择模型(两种选择) 为了使y的预测值总是介于[0,1]之间, 在给定x的情况下,考虑y的两点分布概率: a. 如果为标准正态的累积分布函数(cdf),则 该模型成为“Probit” b. 如果为“逻辑分布”的...

    被解释变量是离散的,而非连续的,这就让人很头疼了。

    • 二值选择(binary choices):考研或者不考研、出国或者不出国、回国或者不回国……
    • 多值选择(multiple choices):走路、汽车,还是坐车;出国、考研还是就业……

    这类模型被称为离散选择模型(discrete choice model)或定性反应模型(qualitative response model)。另外,有时被解释变量只能取非负整数,比如企业在某个时间内所获得的专利数,这类数据被称为计数数据(count data),其被解释变量也是离散的。

    考虑到离散被解释变量的特点,通常不宜使用OLS进行回归

     一、二值选择模型(两种选择)

    假设个体只有两种选择,比如 。是否考研,取决于毕业生毕业后的预期收入、个人兴趣等等,假设这些解释变量都被集成在向量 \boldsymbol x 中。于是,最简单的模型为线性概率模型(Linear Probability Model,LPM):
    y_i = \boldsymbol x_i^\prime \boldsymbol\beta+\varepsilon_i,\quad i=1,\cdots,n
    \boldsymbol\beta 的一致估计要求 {\rm Cov}(\boldsymbol x_i, \varepsilon_i)=0 (没有内生性)。然而,这里有几个问题:

     

     

    • 由于 ,于是 \varepsilon_i = 0-\boldsymbol x_i^\prime \boldsymbol\beta 。所以 {\rm Cov}(\boldsymbol x_i, \varepsilon_i) 必然不为0
    • 显然, x_{i} 服从两点分布,而非正态分布
    • 由于 有关,所以必然存在异方差(所以在检验的时候需要使用稳健的标准误,见教材第 7 章)
    • 尽管我们知道 y 非 1 即 0 ,但回归的时候总不可能这么巧 就是 1 或 0 的,看

     

     

     

    尽管 LPM 有上面所提到的各种缺点,但它的优点是计算方便,而且容易分析经济意义。于是,为了使 y的预测值总是介于 之间,我们对 LPM 进行拓展:在给定 \boldsymbol x 的情况下,考虑 y 的两点分布概率为:
    \left\{\begin{array}{l} \mathrm{P}(y=1 | \boldsymbol{x})=F(\boldsymbol{x}, \boldsymbol{\beta}) \\ \mathrm{P}(y=0 | \boldsymbol{x})=1-F(\boldsymbol{x}, \boldsymbol{\beta}) \end{array}\right.
    于是,函数 F(\boldsymbol{x}, \boldsymbol{\beta}) 就被称为连接函数(link function),因为它将解释变量 \boldsymbol x 与被解释变量 y 链接起来。由于 y 的取值要么为 0 ,要么为 1 ,于是 y 一定服从两点分布

     

     

    为了使y的预测值总是介于[0,1]之间, 在给定x的情况下,考虑y的两点分布概率:

    连接函数的选择有一定的灵活性,通过选择合适的连接函数  可以保证  ,并将 \hat y 理解为 “ y=1 发生的概率”,因为:
    \mathrm{E}(y | \boldsymbol{x})=1 \cdot \mathrm{P}(y=1 | \boldsymbol{x})+0 \cdot \mathrm{P}(y=0 | \boldsymbol{x})=\mathrm{P}(y=1 | \boldsymbol{x})

    a. 如果F(X,\beta )为标准正态的累积分布函数(cdf),则

    该模型成为“Probit”

     b. 如果F(X,\beta )为“逻辑分布”的累计分布函数,则

    该模型成为“Logit”。由于逻辑分布累积分布函数有解析表达式,存在解释表达式,回归系数更好解释。Logit回归的系数,转换为or值后,表示的是p/1-p的大小

    Probit模型没有经济意义,需要通过边际效应进行求值

    二、经济意义

    需要注意的是,在这个非线性模型中,估计量 并非边际效应(marginal effects)。以 Probit 为例,可以计算:

    在这里使用了微分的链式法则(chain rule),并假设了 x_k 为连续变量。由于 Probit 和 Logit 所使用的分布函数不同,所以其参数并不可以直接比较,而是需要分别计算二者的边际效应,然后进行比较。然而,对于非线性模型而言,边际效应本身就不是常数,它随解释变量的变化而变化。常用的边际效应的概念有:

     

    • 平均边际效应(average marginal effect),分别计算每个样本的边际效应然后平均
    • 样本均值处的边际效应(marginal effect at mean),即在 处的边际效应
    • 在某个代表值处的边际效应(marginal effect at a representative value),求特点的边际效应

     以上三种边际效应的计算结果可能会有差异。传统上,计算样本均值处的边际效应比较简单;然而,在非线性模型中,样本均值处的个体行为通常不能代表个体的平均行为(average behavior of individuals differes from behavior of the average individual)。对于政策分析而言,平均边际效应比较有意义,也是 Stata 的默认方法

    既然 并非边际效应,那他有什么经济意义呢?对于 Logit 模型,令 ,那么 1-p=\mathrm{P}(y=0 | x) ,由于 p=\frac{\exp \left(\boldsymbol{x}^{\prime} \boldsymbol{\beta}\right)}{1+\exp \left(\boldsymbol{x}^{\prime} \boldsymbol{\beta}\right)} ,于是:
    其中,\frac{p}{1-p} 被称为 几率比(odds ratio)或相对风险(relative risk)。如果几率比为2,意味着 y=1 的概率是 y=0 两倍。对第二个等式的右边求导,我们可以发现 \hat{\boldsymbol \beta}_{MLE} 的意义是:若 x_j 增加一个微小的量,那么几率比的百分比则会增加 \hat{ \beta}_{j} 。所以,可以把 \hat{ \beta}_{j} 视为半弹性,即 x_j 增加一个单位引起几率比的百分比的变化。

    例如, 表示 会引起几率比增加 12\% 。注意不是几率比本身变大 0.12,而是它增长了 12%

    还有另外一个生物统计领域特别喜欢使用的意义,考虑 从而 p 变成了 p^\star ,于是新几率比与原先几率比的比率可以写成:
    \frac{\frac{p^{*}}{1-p^{*}}}{\frac{p}{1-p}}=\frac{\exp \left[\beta_{1}+\beta_{2} x_{2}+\cdots+\beta_{j}\left(x_{j}+1\right)+\cdots+\beta_{K} x_{K}\right]}{\exp \left(\beta_{1}+\beta_{2} x_{2}+\cdots+\beta_{j} x_{j}+\cdots+\beta_{K} x_{K}\right)}=\exp \left(\beta_{j}\right)
    所以,\exp \left(\hat\beta_{j}\right) 表示 x_j+1 引起的几率比的变化倍数

    例如, 表示 会引起几率比变成原先的 1.12 倍,即增加了 13%

    事实上,如果 比较小,两者方法是等价的( Taylor 展开)。然而,如果 必须变化一个单位(如性别、婚否),则应使用 \exp \left(\hat\beta_{j}\right) 。另外,Probit 模型无法对系数 \hat{\boldsymbol\beta}_{MLE} 进行类似的解释,这是 Probit 模型的劣势。

    三、模型建模

    1. Probit模型建模

    probit union age grade black south  //probit建模
    mfx                     //查看平均边际效应 
    margins, dydx(*)        //查看平均边际效应 

     因为margins默认计算的是平均的边际效应,而 mfx 计算的是在样本均值处的边际效应。

    (边际效应的解释:自变量没增加一单位,Y增加系数那么多单位)

    2. Logit模型建模

    logit union age grade black south
    margins, dydx(*)                 //查看边际效应

    结果发现,两个模型的回归系数、平均边际效应都非常接近。现实应用中,两个模型可以相互替换使用。

    不过,Logit还多了一个非常重要的功能:计算OR值(生存比死亡)的功能。

    logit union age grade black south, or

    如果是0,1变量,eg.黑人(balck=1)的几率比是其它族裔的2.37倍,这说明黑人加入工会的概率要相对其它族裔大很多。

    3. 查看预测准确度

    estat classification

    三、拟合优度

    如何衡量一个非线性的模型的拟合优度呢?在不存在平方和分解公式的情况下, 是无法计算的,然而 Stata 依然汇报一个准R2(Pseudo ),由 McFadden (1974) 提出,其定义为:

    其中,\ln L_1 为原模型的 LLF 最大值,而 \ln L_0以常数项为唯一解释变量的 LLF 的最大值。由于 y 是离散的两点分布,似然函数 LF 的最大可能值为 1,于是 LLF 的最大可能值为 0,记为 \ln L_{m ax} 。于是,必然有 0 \geqslant \ln L_{1} \geqslant \ln L_{0} ,于是 0 \leqslant \text { 准 } R^{2} \leqslant 1

     另外一类判断拟合优度的方法是计算正确预测的百分比,实际上我认为目前机器学习领域的一系列常用的拟合优度如 MSE、MAPE 等都可以使用。

    四、多值选择模型

    对于Y的取值有多种,比如学习成绩的A/B/C/D四类,则应该使用mlogit/mprobit模型。

    展开全文
  • 模型选择的一些基本思想和方法

    千次阅读 2020-02-14 19:41:05
    有监督学习是日常使用最多的建模范式,它有许多更具体的名字,比如预测模型、回归模型、分类模型或者分类器。这些名字或来源统计,或来源于机器学习。关于统计学习与机器学习的区别已经有不少讨论,不少人认为机器...

    0. 引言

    有监督学习是日常使用最多的建模范式,它有许多更具体的名字,比如预测模型、回归模型、分类模型或者分类器。这些名字或来源统计,或来源于机器学习。关于统计学习与机器学习的区别已经有不少讨论,不少人认为机器学习侧重于目标预测,而统计学习侧重于机制理解和建模。个人更加直观的理解是,统计学习侧重于从概率分布来描述数据生成机制,除了预测之外,还关心结果(参数假设、误差分布假设)的检验,而机器学习侧重于从函数拟合角度来描述数据生成机制,基本目的就是为了拟合和预测,缺乏严谨的参数、误差的检验机制,比如下式:

    1. 统计学习目标是获取的条件分布,通过对数据概率生成机制的理解与建模进而获取良好的预测效果,这个过程会涉及的分布假设,因此最后会衍生出对参数假设和误差分布的假设检验,以验证整个概率分布的假设的正确性,比如经典的线性模型、非参数回归等模型,预测能力并不是其主要目的;
    2. 而机器学习基本不会从概率分布的角度着手,虽然可能也会涉及的分布假设,但目的就是学习到一个能够较好描述数据生成机制的函数,对误差的假设基本忽略,也不会涉及参数和误差的检验,模型好坏基本由预测效果来判断,同时也会提供一些比较一般的误差上界,所以机器学习中不会出现参数估计渐进性、一致性等结果的讨论,而多半最终结果的评判。比如SVM、神经网络、KNN等模型。

    不过即使有上述区别,关于高维统计推断(Lasso类带正则项的线性模型)的理论也逐渐完善,但相对于传统的生物制药、生物实验、社会调查、经济分析等领域,当前图像、文本、推荐系统等应用领域中,人们更关心模型的预测能力,而不是解释能力甚至是模型的可靠性,主要原因即这些领域模型预测能力相比于模型的假设检验要重要得多,因此如何根据模型预测能力来选择最优模型变得越来越重要。本文下面就逐步介绍模型选择的思路和方法,主要参考ELS这本书

    1. 偏移、方差、复杂度和模型选择

    模型的预测能力通常也被称作模型的泛化能力,表示模型在新的、独立的测试数据上的预测能力。在很多关于模型泛化能力的介绍中,我们总会看到这样一幅图:模型在训练集上的训练误差与在测试集上的测试误差的变化趋势对比。

     

    var_bias_small图上横轴表示模型的复杂度大小(比如线性模型中特征维度大小),纵轴表示预测误差,衡量预测值与真实值间的平均损失大小,损失函数根据分类、回归问题做合适的选择,比如0-1损失、负似然函数、平方损失、对数损失、指数损失、交叉熵损失、Hinge损失等。平均损失大小在训练集上预测误差称作训练误差,在测试集上称作测试误差。图中每一条线都表示同一个训练集(浅蓝色)和测试集(浅红色)上的预测误差表现,从图上可以看到两个现象

    • 训练误差(浅蓝色)和测试误差(浅红色)都有波动,并不是一个稳定的值,并且随着模型复杂度的增加,训练误差(浅蓝色)波动越来越小,而测试误差(浅红色)波动则越来越大;
    •  随着模型复杂度增加,训练误差(浅蓝色)和平均训练误差(粗蓝线)越来越小,但测试误差(浅红色)和平均测试误差(粗红线)先降低后减小,在相对中间的位置有一个最小值。

    看到这上面的现象,我们的脑中可能会冒出下面几个问题:

    1. 为什么训练误差和测试误差会有波动?
    2. 训练误差和测试误差的变化趋势说明了什么问题?
    3. 造成这种变化趋势的原因是什么?
    4. 这种趋势对模型的选择和评价有什么指导意义?

    这四个问题由浅入深,最终目的就是想获取泛化能力最好和最稳定的预测模型。在回答这四个问题前,我们首先需要做一个假设:模型能够较好的预测,说明预测集与训练集有较好的相似性,更严格来说,很可能来源于同一分布,下文做分析时均假设来源于统一总体分布。如果测试集相对于训练集发生了巨大的变化,那么从训练到预测的思路将不可行。下面我们逐步来解答这四个问题。

    1.1 为什么训练误差和测试误差会有波动?

    现假设我们有个研究项目,想根据学生的平时表现和性格的个指标来预测最终该学生的期末综合成绩。为达到这个目的,我们在一个学校中我们随机抽了一批学生,选用某个模型训练,估计其模型参数,然后找一批新的学生预测来评价模型好坏,发现预测误差的相对误差非常小。但是通常人们会问,这个模型预测能力真的那么好么?我咋不相信根据学生平时表现和性格就可以得到这么好的预测效果呢?是不是你们特意挑选的一批学生呐?为了让他们相信这个模型还不赖,我们从这个学校重新抽了好几批学生,分别根据这些学生的指标去训练模型和估计模型参数。随后我们发现,换了几批学生样本,估计的模型参数确实有些差别,而且预测效果也是时好时坏,整体而言,平均的预测误差也还差强人意,能够控制预测误差的相对误差在20%以内,此时再把结果拿给其他人看,估计很多人对你的模型可能就不会有那么大疑问了。

    对应到上文的图,其实上图的波动产生的原因也和该例子操作是一样的,有多条线就意味着重复抽了多组训练集来分别训练,因此训练误差和测试误差的波动是由训练样本的变化带来的。在理想的实验条件下,为了能公正地衡量模型的预测能力,通常需要多换几组训练集和测试集来综合评价模型的预测能力,这样的结果才可能让人更信服模型的预测能力,而不是偶然结果。

    但是实际情况中,我们却可能仅有一个训练集和一个测试集。用数学化语言描述,新的测试集中,目标变量和预测变量均从两者的联合分布中抽取,独立于训练集,此时我们获取的测试误差(泛化误差)为某个训练集上测试集上损失的条件期望

    这里训练集是固定的,即仅有一个训练集。而从统计分析(重复试验)上来说,我们可能更关注测试误差的期望,即去掉训练集随机性所带来的影响:

    这个目标即上图预测误差波动想要表达的含义,想要通过多个训练集训练来获取平均的预测误差,抹平训练集变动带来的影响,这是评价模型预测能力最理想方法,可以防止某个训练集上训练所得模型表现过好而夸大模型的预测能力。但是实际情况中,我们手边通常可能只有一个训练集,实际的需求是在此训练集上模型做到最好,所以又是我们最关心的目标,即希望在当前训练集下获取最佳的预测能力,也就是说我们想获取上图的一条线的趋势中最小的测试误差的点,如下
    var_bias_sample

    换句话说,很多时候人们给你一个训练集就希望你能够给他一个相对最稳定的预测模型,这个目标相对获取平均预测误差来说更难,后续模型选择方法比如CV法、bootstrap法、Cp法等其实都是估计测试误差的期望,即第一幅图中的红色均线。

    1.2 训练误差和测试误差的变化趋势说明了什么问题?

    图上反映的两个现象一句话表示即:随着模型复杂度增加,训练误差波动降低,平均训练误差降低趋向于0,而测试误差波动上升,平均测试误差先降低后升高。这个现象说明训练误差不能代替测试误差来作为模型选择和评价的手段。随着模型复杂度变化,训练误差与测试误差并不是一个良好的正相关关系,而是呈现较为复杂的非线性关系。用数学式子表示即

    用更通俗的话说,复杂的模型可能在训练集上拟合的很好,但是面对新的测试集,预测误差不降反升,发生了所谓的“过拟合”现象。如果一个模型在不同的测试集上测试结果不仅波动性大,而且预测误差也比较大,就要警惕发生了过拟合现象,此时不妨将模型的复杂度降低些(关于模型的复杂度含义下文会做更细致的说明),即使用变量更少的简单模型,比如线性模型。

    过拟合的原因有很多,其中一个很可能的原因是,随着模型复杂度升高,对于训练数据刻画的很细,但是训练数据中可能某些特征仅出现过一次或者很少,信息不足,而测试集中该特征却出现了很多其他的值,虽然模型在训练集上刻画的足够细致,但是由于测试集的变动,模型反而往测试机上的迁移性能下降,训练误差变化并不正比于测试误差。

    1.3 造成预测误差变化趋势的原因是什么?

    那究竟是什么原因导致了随着模型复杂度增加,训练误差与测试误差不呈现良好的正比关系呢?为何同样都是预测误差,训练误差很小的模型反而预测能力很差呢?下面我们以线性模型为例来阐释原因,假设

    如果用线性函数去近似,其中表示特征个数,损失函数取平方损失,最小化,则在训练集下得到参数估计为,同时记是最佳线性近似的估计参数

    在某个新样本点处预测误差为

    如果此时取所有训练集中的,则其平均预测误差(该误差也被称作样本内(in-sample)误差,因为都是来自与训练样本内。不过都是新的观测,且真实的仍未知,因此该预测误差不是训练误差,后续会AIC等准则中会详细讲解):

    对于普通线性模型易知其“估计偏移(Estimation Bias)”为0(最小二乘估计也是线性估计类中的最佳估计),易知随着特征个数增加,方差(注:第一个等式根据线性回归很容易推导方差(Variance)为)逐步增大,而对于真实却近似越好,模型偏误(Model Bias)越小,但预测误差是这两者的综合,则整体变化趋势如下图

    bias_var

    这与上图测试集误差变化一致。另外,之所以特地提到还有“估计偏移”,因为对于线性模型类,还有其他诸如岭回归、Lasso等受限的回归类别,他们都属于线性模型类,相比纯线性模型,他们由于对回归系数做了不同程度的压缩,因此相比于最佳线性估计会有些差距,产生“估计偏移”,进而整体上导致“模型偏移”增加,但是他们限制了参数个数和压缩了回归系数,模型可能更加简单,因此直观上这类模型估计平均而言会稳定些(模型方差小),用图形来表示他们的关系即如下图

    scheme_bias_var

    箭头组合长短即表示了平均预测误差,可以看到在受限模型空间中由于较小的模型估计方差,可能使得整体的平均预测误差更小。

    1.4 对模型选择和评价有什么指导意义?

    从“偏移-方差”分解可以看到,在有限的模型空间中,对某个模型类控制好模型的复杂度非常重要,否则不容易获取较好(包含稳定与预测误差小两方面)的预测模型,这便是模型选择阶段的工作。可能不少人觉得此处获取较好模型是指模型评价,但是模型评价与模型选择是两个不同的概念,代表两个不同的阶段:

    • 模型选择:根据一组不同复杂度的模型表现,即从某个模型空间中挑选最好的模型;
    •  模型评价:选择一个(最好)模型后,在新的数据上来评价其预测误差等评价指标。

    从定义看,两者的目标不同,模型评价是模型选择的后一步。换句话说,模型选择是在某个模型类中选择最好的模型,而模型评价对这个最好的模型进行评价。模型评价可以比较多个模型类中的最佳模型,然后从中挑选出最佳模型,亦或者进行模型融合再进行评价。在模型选择阶段,常见的指标有AIC准则、BIC准则、CV值、结构风险上界等比较普适的准则,而在模型评价阶段,我们可以根据分类、回归、排序等不同问题关心的问题选择不同的评价指标,多与模型选择时的损失不同:(1)分类:ROC、AUC、TPR、FPR、F1 score;(2)排序:DCG、NDCG;(3)回归:RMSE、MAE、Deviance。根据具体业务,实际的评价指标有很多种,最好的方式当然是模型选择时即设计其损失函数即为评价指标,但是通常而言这些指标包含了某些非线性变化,优化起来难度颇大,因此实际模型选择仍是选用经典的那些损失函数,而模型评价则会与其略有不同。

    随着机器学习普及,大家都有了“训练-验证-评价”的思维,这其实就是完整重现模型选择、模型评价的过程。如下图我们将数据集分成三个不相交的集合来做模型选择和模型评价:

    model_proc

    • 训练集:获得模型及其训练误差,用来训练不同模型;
    • 验证集:与训练集相对独立,获取训练模型在该集上的预测误差,用来做模型选择;
    • 测试集:与训练集和验证集独立,获得真实的测试误差和其他模型评价指标,用来评价已选择出的模型。

    使用训练集、验证集目的就是做模型选择,测试集自然是做模型评价。这三个集合的划分,并没有严格的准则,根据样本大小不同而做不同的选择,但是一个原则是测试集需要保持未知和与训练集、验证集的独立性。在数据挖掘比赛的时候,主办方通常会给我们一个训练集,然后自己持有一个未知的测试集。实际上这个测试集并不是真正的“测试集”,更应该称作“验证集”。因为随着参赛选手不断提交结果,他们在这个数据集也做了很多探索和尝试,能够逐渐发现这个所谓的“测试集”上的规律,模型选择和模型评价都依赖该数据集进行调整,因此从模型评价的独立性角度来说,这并不能当做最终的测试集,往往会低估预测误差,最好的做法是重新更换几组未知的数据集来当做新的“测试集”做模型评价,这也是秉承统计随机的思想——仅仅在某个“测试集”好是不够的(最近ImageNet事件也确实存在这样的问题)。

    所以结合文章开始的方差-偏移图,对模型选择和模型评价的指导可以凝缩为一句话:根据已知的训练集和验证集在特定模型空间中进行模型选择,获取合适复杂度的模型,然后在多种模型空间做模型选择获取多种模型,最后的最优模型需要通过多个独立未知的测试集来做模型评价决定,否则很容易导致模型过拟合。(这实际上就是一个完整而规范的机器学习过程。)

    2. 模型选择的方法

    模型选择核心思想就是从某个模型类中选择最佳模型。注意,它与一般的“调参”意义不同,调参很多时候可能是针对优化算法中的某些参数进行调整,比如步长(学习速率)、mini-batch大小、迭代次数等,也会涉及到模型中调整参数(也称正则参数)的选择,但是模型选择不涉及算法中的参数,仅涉及模型目标函数中的调整参数。

    从上面叙述可得知模型选择阶段,最标准的方法自然在训练集上训练模型,然后在验证集上获取预测误差,该误差也被称作“样本外(extra-sample)误差”,可真实反映出模型的样本外的预测能力,最后选择最小预测误差所对应的模型作为最佳模型即可。但通常而言,独立的验证集我们也没有,手头仅有的信息就是训练集,那么要想估计测试误差或者其期望曲线,就只能在训练集上做文章,一般而言可能仅有两种思路:

    1. 从训练集划分点数据出来形成验证集来近似测试误差;
    2. 对训练误差进行某种转化来近似测试误差。

    第一种思路是非常自然的思路,只要对训练集进行合适的划分,我们就有可能近似出预测误差。但是对原始训练集划分为新的训练集和验证集,不同的划分比例可能使得新训练集与原训练集相差较大,进而使得差异很大,因此用这种划分的方式来估计条件期望形式的预测误差比较困难。那么此时我们可以不估计转为估计其期望,即平均预测误差,通过重复抽样的方式来多次估计预测误差,然后取其平均即可,这种方式我们可以称其为“重复抽样法”:通过训练集多次切分、抽样来模拟训练集、验证集,计算多个“样本外误差”,然后求其平均预测误差,这是一种密集计算型方法,比如交叉验证(Cross Validation)、自助法(bootstrap)等。

    第二种思路相比第一种思路更加考虑计算效率,因为重复抽样需要计算多次估计,因此做一次模型选择可能需要花费不少时间,如果单单从训练集的训练误差就可以近似出测试误差,那么模型选择效率便会大大提高。这种方式以统计学中的AIC、BIC等为代表,深刻剖析训练误差与之前提到的“样本内(in-sample)误差”、预测误差间的关系,给出了预测误差估计的解析式,因此第二种思路我们可以称之为“解析法”。

    这两种思路在统计学习和机器学习中都有大量应用,相比较而言,统计学习更喜欢第二种解析法,这样容易计算,并且会较好的理论性质(似然角度);而机器学习则更喜欢第二种重复抽样法和从VC维衍生出来的结构风险最小化法,不需要计算基于分布的似然,普适性更好。

    一般而言模型选择准则有如下几种:

    • 重复抽样与预测稳定性角度:CV、GCV、Boostrap
    • 似然与模型复杂度角度:AIC、AICc、BIC、EBIC
    • VC维与风险上界控制角度:SRM

    首先我们从更加普适的重复抽样法入手来介绍这些模型选择的方法和思路。

     2.1 重复抽样思路

    CV法

    交叉验证法(CV法)是最自然的重复抽样法,过程如下图所示

    cv

    将一个训练集随机分成K份(图中所示为5份),然后选择第K份作为验证集(图中为第3份),然后剩余的K-1份作为训练集训练模型,这样便可以得到K个“预测误差”,求其平均值即为所谓的“CV值”,所以常说的CV值实际上是预测误差期望的一个估计值。数学语言叙述如下:记是一个划分函数,表示随机地将第个观测分配中某个指标;记表示去除第部分数据训练所得的模型,则预测误差的交叉验证估计(CV值)为

    如果该模型有调整参数来调整模型的复杂度,记该模型集为,则CV值为

    此时通过调整参数可以获得不同模型复杂度下的CV值,然后选择最小的CV时所对应的模型作为最后的预测模型即可,这便是利用CV值来做模型选择的思路。

    从CV估计定义可以看到,划分的份数粒度大小不同时,CV值对平均预测误差的估计也有好坏之分,这里将涉及“偏误”、“方差”以及“计算效率”的权衡,主要是“偏误”与“计算效率”的权衡。以两个极端例子为例:

    • 时即“留一法(Leave-One-Out, LOO)”,表示每次切分的验证集仅为一个观测,其余的都是训练集,此时新训练集与原始训练集非常接近,则所得的CV值是平均预测误差的近似无偏估计,但是由于这N个训练集相关性也很高,训练的模型则也很相似,而且每次仅评价了一个观测,使得每个验证集上的预测误差相差较大,CV估计的方差较大,另外,N折交叉验证要估计N个模型,计算消耗巨大导致模型选择很慢;
    • 如果取得较小,比如2,相当于一半数据用来训练一半用来验证,很显然此时新训练集与原始训练集差异较大,则CV值相对于真实平均预测误差会有较大偏误,导致会高估了平均预测误差,不过两个新训练集完全独立,训练出来的两个模型相关性很低,而且验证集数据比较充足,模型评价相对充分,在数据分布没有太大变化的大前提下,两个验证集上的预测误差会比较接近,使得CV估计的方差比较小,而此时计算消耗很少,模型选择效率高。

    实际中,训练集切分带来的估计偏误与计算量才是我们真正关心的量。权衡偏误与效率的得失,由于CV对于预测误差的估计与训练样本大小有关,如果本身样本量就不大,交叉验证切分将导致训练样本更少,这会引起更大的估计偏差,所以实际折数经验是:

    • 样本量大时,5折交叉验证对预测误差估计便足够,并且计算快速;
    • 样本量小时,10折甚至LOO都可以,在损失计算效率的情况下优先考虑预测误差估计的准确性。

    另外,由于5折或者10折CV估计有偏误,实际模型选择中还使用“one standard error”规则,即不选择CV值最小的模型,而是选择高于最小CV值一个标准差之内的最简模型,比如glmnet通常推荐lambda.1se,即这个准则。原因仍是5或10折CV很可能会低估平均测试误差,所以要保守选择平均预测误差略高于最小CV值得简单模型。

    对于交叉验证法的实际操作,我们多半可能还会涉及变量筛选等预处理。对于这类预处理步骤,如果后续使用CV来做模型选择便需要考虑使用顺序的问题,一个使用原则是:

    • 如果预处理涉及联合使用自变量与的关系,比如利用与的相关性等有监督方式来做变量选择,则需要在预处理前就需要对数据进行切分,数据预处理成了模型选择的一部分,而不能先变量筛选,然后在新数据进行交叉验证来做模型选择;
    • 如果预处理不涉及自变量与的关系,仅仅利用自身的信息,比如的方差或者熵来做变量选择,这种无监督方式的预处理无需对数据进行切分来交叉验证,可以直接先无监督预处理完再利用交叉验证方法来做模型选择。

    目前变量筛选的方法有很多,传统的有监督包含相关性筛选、熵增筛选等都是有监督方法,由于这种筛选已经利用了全体和间的关系信息,如果利用这种筛选后的数据来做交叉验证将会导致模型低估预测误差,高估了模型的泛化效果,因此实际使用时尤其需要注意这种筛选方法与交叉验证的联合使用,防止犯错。

    另外,在分类问题中,特别是对于类别不平衡问题,由于CV法可能会导致每折中的类分布不一致,使得训练不稳定,因此实际中分层CV(stratified CV)也会使用。其相比较CV的不同之处就是不使用经典CV的均匀随机抽样方法来切分样本,而是根据总体类别比例,对每折都使用依赖于类别比例的分层抽样,保证每折的类别分布与原始数据差不多。学习过分层抽样的同学可能知道,分层抽样可以降低估计量方差,因此实际使用分层CV相比经典CV选择模型可能更稳定些。

    GCV

    由于计算CV是一个密集计算的模型选择法,即使可以利用并行计算来提高模型选择的效率,但是如果能够找到无需重复计算的替代方法,那么实际应用中,人们可能更倾向于使用这种模型选择方法。对于线性模型,如果使用平方损失,广义交叉验证(GCV)是LOO法解析形式的近似估计,可以避免计算N个模型来快速做模型选择。对于线性模型,对于目标变量的估计可以写成如下投影形式


    其中是投影阵,仅与有关,与无关,则线性模型的LOO值为

    其中是的对角元素,则GCV近似为


    此时不需要重复计算,只需要计算线性模型的投影阵的迹(后面也称作**自由度**)即可,极大降低了交叉验证的计算量,并且使得平均预测误差偏误更小,关于线性模型的GCV详细推导可参考此处。不过GCV仅适用于线性模型,包含带正则项的普通线性模型、非参线性模型,比如LASSO、岭回归、样条回归、多项式回归等模型,其余比如树模型、神经网络模型都不适合。

    关于CV的衍生方法比较新的时ES-CV,由Yu Bin在2013年提出,不过实际上这种方法对于核心是估计稳定性的定义,CV法只是来改进估计稳定性的一种方式而已,感兴趣的同学可以参考Yu老师的论文

     Bootstrap法

    对于bootstrap,不管是统计还是机器学习的同学,可能对这个名词以及实施方式都比较熟悉。bootstrap法由Efron于1979年提出,随后在统计中得到了大量的应用,主要用于解决复杂统计量的置信区间等估计问题;而在机器学习中,由Breiman在94年提出bagging方法(全称为bootstrap aggregating)实际上就是bootstrap的直接应用,它是一种模型组合方法,主要用于分类问题中以获取比较稳定的结果。bootstrap的思路和操作都非常简单,如下图

    bootstrap

    假设有样本,则不断重复随机抽同样大小的B个样本集,这些样本被称作bootstrap样本,随后用着B个样本分别训练模型,得到B个目标估计量。然后可以用这些统计量求某些指标,比如统计量的均值、方差、偏移等。对于分类问题,用这些bootstrap样本训练多个分类器,比如决策树或神经网络,然后将这B个分类模型对新的样本做预测,把B个分类结果做一个投票获取最终的结果即可,这边是所谓的bagging。

    不过上述都是对于估计量或者模型而言,那么如何利用bootstrap来做模型选择呢?如果我们用着B个模型对每个观测都进行评价,然后求其平均误差

    看起来似乎可行,但仔细一思考就可以发现这并不是一个好的平均预测误差的估计,主要原因是bootstrap样本即被训练又被评价,与CV不同训练集被重复分割为独立的训练集与验证集相比,数据评价存在重合,所以肯定与训练误差可能比较接近,而与平均预测误差有较大偏差,那么用该估计来调模型复杂度参数显然更不是个好选择。那如何利用bootstrap法来更好的近似平均预测误差呢?我们可以借助于CV的分割思想。

    我们知道,bootstrap样本的获取其实就是重复有放回的N次抽样,那么对于观测属于该bootstrap样本,至少被抽中一次的概率即

    换句话说,每个bootstrap样本中,总有些观测没被抽到,那么根据CV法的思路,这部分观测就可以拿出来作为验证集来作为平均预测误差的估计。
    熟悉随机森林或者Bagging的同学对于OOB(out of bag)这个词肯定不陌生。OOB其实就是这种思路,不过只是对未抽中的样本再次做了投票然后再估计预测误差,对于此处我们则不做投票,直接取那些没出现过观测的bootstrap样本训练的模型分别估计的误差,然后求个平均即可

    其中即不包含观测的bootstrap样本集。你可能想万一有个观测所有bootstrap都出现了怎么办?直接去掉就好了嘛,不过你可以算算B个bootstrap样本都出现的概率有多小。实际而言,B大点便很容易保证观测很难在所有bootstrap样本集中出现了。

    下面在思考下,这种估计是对平均预测误差估计是个好估计吗?虽然不会像第一个估计量那样低估平均预测误差,但是这种估计量也很容易高估平均预测误差,主要原因是每个bootstrap样本中仅有差不多63.2%的不同观测用来建模,这样使得估计量表现得很像2折或3折交叉验证,分割太少导致可能偏差很大,特别是对于样本量不够多的训练集。如果改进,直观想法便是将训练误差与该估计量按照某种比例加权来纠正这种偏移,具体细节可以看ESL的阐述,实际中由于bootstrap计算量过大,所以用来做模型选择不多,所以此处不再详述。

    不过在大数据时代,分布式思维逐深入统计学家和计算机学家脑中,由于bootstrap具备良好的可并行性,以及良好的统计性质和估计稳定性,Jordan在2012便提出了基于bootstrap的[BLB(Bag of Little Bootstraps)](http://arxiv.org/pdf/1112.5016v2.pdf),能够给出较稳定的估计量以及估计量的区间估计,这是其他方法不具备的特点。比如能告诉你预测误差大小,同时可以告诉你预测误差的偏误以及方差,那这是不是一件更令人安心的事情呢?在现在这种环境下,与其不停做实验等待结果,不妨考虑下bootstrap这类有可靠性估计的方法的好处。BLB的算法思路很清晰,简单来说:subsampling + bootstrap + average;先无放回抽样,然后bootstrap抽样,获取参数bootstrap估计量,以及其置信区间、偏移、预测误差等估计量,最后将这些估计量平均起来即可。细节可以参考其论文,只要有多机可并行环境便可很容易实施该方法。

    bootstrap思想是一种非常重要思想,后来著名的random forest便充分利用了该思路。而且相比目前的数据并行、模型并行的分布式算法思路,我觉得可以从bootstrap抽样角度获取更加稳定的估计量,当然这些都是题外话,与本文话题不相符合,以后可以再谈谈抽样与并行算法之间的感想,实际上都会在“计算效率”与“精度”之间做些权衡。

    2.2 解析解思路

    根据上述重复抽样法可知,CV等方法直接来估计“样本外误差”,并求其期望,而解析解思路由于不像CV法通过原始训练集切分构建验证集,仅仅从训练集出发,构建训练误差与“样本内误差”间等式关系,因此需要深刻理解训练误差、“样本内误差”、模型复杂度这几个概念,才能较好的理解为何解析解思路的那几个准则是有效的。

    2.2.1 训练误差与样本内误差

    在本文第一节提到,实际应用中通常只有一个训练集,此时我们希望能在该训练样本上获得最好的预测模型,在新样本点能得到最小的泛化误差。这是训练集上预测误差的条件期望,随着样本集变动而变动。但从统计角度来说,抹掉训练集带来的变动,估计预测误差的期望更符合统计口味,这也是上述CV、bootstrap采取的方式。

    在第一部分关于和与模型复杂度走势的图形中,可以看到低估了,并且复杂度高的模型容易过拟合,导致很小,而很大,所以用来评测模型就显得过于乐观了。但是,能不能建立与间的关系呢?

    由于要引入新有难度,那么退一步看不变动而仅引入新的的预测误差


    这种误差称作“样本内误差”(in-sample误差),虽然也是一种预测误差,但是没有变动,因此对于模型泛化估计能力还是不够。不过样本内误差与样本外误差与模型复杂度的关系走势类似,对于模型选择而言,更关心误差的相对值而不是其绝对值,因此实际模型选择中,我们也常常关注“样本内误差”,它也是一种有效且更方便的思路,并且此时建立与间的关系相对更容易了。

    由于与都拥有相同的,两者唯一的区别便是是对求了期望,而则直接使用了某个值(训练样本),两者的差便是

    为更便于理解,以平方损失和线性模型为,且预测值是原始值的线性变换,则


    与预测误差类似,这其实是关于训练样本点的条件期望,这种条件期望不好估计和分析,因此消除训练样本中变异带来的影响,我们再次对所有求期望(注意这其中样本点与随机变量间概念的转化,此处将看做是样本点还是随机变量并不做严格区分,所以)

    于是我们便得到了如下非常重要的关系式


    因此从消除训练集变动的影响(期望)角度来看,我们找到了训练误差与“样本内误差”间的数量关系,这个关系式推广到0-1损失或者似然形式都成立。对于加性误差的线性模型,易知

    其中与便是线性模型的有效参数个数,也称作自由度,注意仅对于线性模型如此,控制着模型复杂度。可以看到,“样本内误差”与训练误差间的桥梁就是模型复杂度!当模型复杂度过高时,很可能“样本内误差”不降反升。

     2.2.2 Cp法与AIC

    借助上述训练误差与样本内误差的关系式,实际中我们便可以这样来对“样本内误差”做这样的估计


    训练误差与“样本内误差”都不是期望形式,看起来有些混合,不过由于实际情况无法求的期望,所以我想这也是没办法的“最佳”估计了吧,统计中常会遇到这种知难而相对随意的形式- -!

    对于平方损失下的线性模型(注意此时的损失限制),所谓的Cp准则即为


    其中用包含所有变量的回归模型的残差估计所得。乍一看过去,这完全就是给“样本内误差”估计换了个名称而已嘛:)

    AIC准则与之略有差异,训练误差选用似然函数的负数来代替,而没有噪音方差的估计,为如下形式

    仍是模型的参数个数,用来衡量模型复杂度。对于非线性模型和更复杂的模型,此处需要用其他形式来代替。

    对于误差为已知方差的高斯模型,化简似然函数便可知AIC就等价于Cp准则。对似然函数化简,可以得到对应的不同的各类损失,比如高斯模型与平方损失的对应,logistic模型与cross entropy损失的对应等,所以相比仅只适用于平方损失线性模型的Cp准则,AIC适用范围更广。实际使用中,AIC做模型选择更倾向于选择比真实模型更多参数的模型,容易低估“样本外误差”,有**过拟合的倾向**。

    另外AIC准则还与KL距离有紧密联系,可以从KL距离来推出AIC准则,感兴趣的同学可以参考这篇文档中关于AIC的介绍。而关于AIC的校正版AICc准则,实际中也有使用,关于其介绍可直接参考wiki。

    2.2.3 BIC与贝叶斯

    BIC准则形式项与AIC很像,同样还是似然负数作为损失,然后加上一个关于自由度与样本相关的项。


    对于方差已知的高斯模型,化简似然函数即可得

    忽略比例项,此时BIC与Cp和AIC基本一致,只是第二项的因子2换成了,相比AIC和Cp准则,BIC对于参数更多、复杂度更高的模型惩罚更重。虽然看起来相似,但是BIC原始想法并不是类似AIC这种思路,而是从贝叶斯角度出发得到的。

    从贝叶斯角度来看,模型选择无非就是依托于当前样本数据,从候选模型集合中选择后验概率最大的模型即可(所谓后验概率即从数据反推可能模型的概率,可以看做是所有变量中得的某个变量子集),当然每个模型都有相应自己的参数,且这些参数也有先验概率分布,根据贝叶斯公式可知给定数据时模型后验概率为

    对于模型选择而言,我们并不需要作上述复杂的积分,只需要比较模型后验概率的相对大小即可,这样的好处是忽略常数项是的计算简便了很多


    具备最大后验概率的模型将与其他所有模型的后验概率比值都大于1。进一步,如果我们事先对模型情况一无所知,模型先验服从均匀分布均相等,那么寻找最大后验概率的模型就演变成了寻找最大概率密度的模型即可,实际上取对数即求最大似然。由于被积分掉,求解很困难,所以实际中我们可以采用[Laplace近似](https://stat.duke.edu/~st118/sta250/laplace.pdf)即可,只要样本量足够大,该近似效果便很好,通过Laplace近似,似然变成了

    其中,为极大似然估计,为模型的自由参数个数。很显然,只需要将似然函数作相应替换,去掉常数项,求解模型的最大后验概率就等价于最小化BIC,因此在样本量很大使得lalapce近似效果很好时,BIC准则便渐进选择最佳模型。

    (注:一句话阐述Laplace技巧即,对于复杂概率函数的似然求解,我们可以将其在参数的极大似然估计处做二阶泰勒展开,根据似然函数在MLE估计处的一阶导为0的性质,原始的概率函数可凑成正态密度函数的形式,于是复杂概率函数就可以用均值和方差均可求的正态分布来近似。)

    有了BIC值,我们也可以直接给出每个模型的后验概率


    这对于模型选择将更加直观,只是计算所有模型的BIC值计算量太大了,实际中我们多半不会如此操作。

    虽然在样本量大且变量维数固定时,BIC准则有模型渐进一致性,但是面对实际有限的样本,BIC相比AIC的过拟合又会欠拟合,对模型复杂度控制太严格,导致选择相对过于简单的模型。另外,BIC在模型特征维度大时,估计模型更加会有偏差,因此关于BIC的改进版EBIC准则便应运而生。

    EBIC法主要的改进思路是对模型先验分布的均匀分布进行合理改进。当变量维数比较大时,含不同变量数的模型个数是不同的,比如现为1000维变量,则包含1个变量的模型有1000个,模型集合即为,而包含2个变量的模型有,模型集合记为,可以看到的大小将近是的500倍。按照BIC的均匀分布假设,所有模型被选择概率相同,这将导致被选择的概率与之模型集合大小成正比,换句话说,差不多含一半变量数的模型集合中的模型被选择概率最大,这显然与变量数可能比较小(稀疏)的假设精神相违背,特别在更加高维的情况中,BIC将会更加倾向在较大的模型空间选择,导致选择的变量数过多。

    为了改进这种所有BIC所有模型等同视之的思路,EBIC略作了改动,对于属于同一个模型集合的模型自然仍等同视之,概率为,但对于不同的模型集合整体的先验被选概率则与之大小成正比,而不是直接与其大小成正比,这种简单的幂次方式可以平滑不同大小的模型集合被选择的概率,使之差异不那么大,于是模型被选择的概率就正比于,带入原来的推导式子,便可得到如下的EBIC准则

    其中表示所属的模型集合,模型集合中变量个数相同。所以EBIC相比于BIC增加的惩罚更大,一般经验是“**如果维度增长速度相比样本量为, 若维度增长很慢,则即BIC准则下的模型选择具备一致性;而如果维度较快时,则模型选择具备一致性,只要不是随样本量指数级增长,接近1,则模型选择是一致的**”。实际建模中,考虑实际数据维度增加与样本增加的关系,选择合适的即可,关于EBIC的论文和讲义可以分别参考这里这里

    3. 总结

    其他模型选择方法还有“最小描述长度(MDL)”和“基于VC维的最小结构风险法(VC-SRM)”。这两种方法一个从最优编码的角度,一个从数据可分性角度分别来阐述模型选择,感兴趣同学可以学习这两种思想,不过由于方法各有缺陷,实际应用较少。

    总之,对于模型选择方法,实际中由于CV法、GCV法的通用性,不管在计算机还是统计领域中都大量应用。而其他的BIC等法则,由于计算快速且有良好的理论性质,统计领域的研究者可能更加喜欢这类方法。不过由于他们基于似然并不是通用框架,并且对于预测来说,根植于样本内误差做的模型选择,模型预测能力很可能不如预期,因此实际应用,我们也更加推荐CV法、GCV法来做模型选择,毕竟现在计算能力如此强大,并行处理也比较方便,而且方法也比较灵活,可以模型选择,也可以模型组合。通过学习这些方法,我们可以充分感受到不同学科的思考方式,通常而言,简单的方法会比较可靠,但是可能需要大量计算来验证、评价;而需要绕些脑子的方法,多半是为了能够进一步简化运算而推演的,这样可能会认识到更深刻的规律,但也可能会使用不少近似的方法来损失精度。对于现实计算而言,“效率-精度”总是一个绕不开的话题,以后有机会我们可以再谈谈这个问题。

    展开全文
  • 模型选择和交叉验证

    万次阅读 2018-05-16 13:10:06
    模型选择 holdout方法 在典型的机器学习应用中,为进一步提高模型在预测未知数据的性能,还要对不同的参数设置进行调优和比较,该过程称为模型选择。指的是针对某一特定问题,调整参数以寻求最优超参数的过程。 ...

    模型选择

    holdout方法

    在典型的机器学习应用中,为进一步提高模型在预测未知数据的性能,还要对不同的参数设置进行调优和比较,该过程称为模型选择。指的是针对某一特定问题,调整参数以寻求最优超参数的过程。
    假设要在10个不同次数的二项式模型之间进行选择:

    1.hθ(x)=θ0+θ1x2.hθ(x)=θ0+θ1x+θ2x23.hθ(x)=θ0+θ1x++θ2x310.hθ(x)=θ0+θ1x++θ10x10 1. h θ ( x ) = θ 0 + θ 1 x 2. h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 3. h θ ( x ) = θ 0 + θ 1 x + ⋯ + θ 2 x 3 ⋯ 10. h θ ( x ) = θ 0 + θ 1 x + ⋯ + θ 10 x 10

    显然越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集并不代表着能推广至一般情况。我们应该选择一个更能适应一般情况的模型。如果在模型选择过程中不断重复使用相同的测试数据,这样的话测试数据就变成了训练数据的一部分,模型更容易陷入过拟合。
    于是我们将数据集分为训练集,验证集和测试集。训练数据集用于不同模型的拟合,模型在验证集上的性能表现作为模型选择的标准,测试集作为最终的性能评估。使用 60%的数据作为训练集, 使用 20%的数据作为交叉验证集, 使用 20%的数据
    作为测试集.

    具体的模型选择方法为:
    1. 使用训练集训练出 10 个模型
    Train error:

    Jtrain(θ)=12mi=1m(hθ(x(i))y(i))2 J t r a i n ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2

    2. 用 10 个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
    Cross validation error:
    Jcv(θ)=12mcvi=1mcv(hθ(x(i)cv)y(i)cv)2 J c v ( θ ) = 1 2 m c v ∑ i = 1 m c v ( h θ ( x c v ( i ) ) − y c v ( i ) ) 2

    3. 选取代价函数值最小的模型: minθJcv(θ) min θ J c v ( θ )
    4. 用步骤 3 中选出的模型对测试集计算得出推广误差(代价函数的值)
    Test error:
    Jtest(θ)=12mtesti=1mtest(hθ(x(i)test)y(i)cv)2 J t e s t ( θ ) = 1 2 m t e s t ∑ i = 1 m t e s t ( h θ ( x t e s t ( i ) ) − y c v ( i ) ) 2

    缺点:模型性能的皮评估对训练数据划分为训练及验证子集的方法是敏感的;评价的结果是敏感的;评价的结果会随样本的不同而发生变化。

    k折交叉验证

    K折交叉验证中,不重复地随机将训练数据集划分为K个,其中k-1个用于模型的训练,剩余的1个用于测试。重复此过程k次,就得到了k个模型及对模型性能的评价。该种方法对数据划分的敏感性较低。
    下图展示了k折交叉验证,k=10,训练数据集被划分为10块,在10次迭代中,每次迭代中都将9块用于训练,剩余的1块用于模型的评估。10块数据集作用于某一分类器,分类器得到的性能评价指标为 Ei,i=1,2,,10 E i , i = 1 , 2 , ⋯ , 10 ,可用来计算模型的估计平均性能 11010i=1Ei 1 10 ∑ i = 1 10 E i

    这里写图片描述
    K折交叉验证中k的标准值为10,对大多数应用来说都时合理的。如果训练集相对较小,可以增大k值,这样将会有更多的数据用于进行训练,这样性能的评估结果也会得到较小的偏差。但是k值得增加会导致交叉验证算法的时间延长,并使得训练块高度相似,无法发挥交叉验证的效果。如果数据集较大,可以选择较小的k值,降低在不同数据块的重复计算成本,同时训练快比例小但是依然有大量的训练数据。

    sklearn实现交叉验证:找到KNN算法的最佳k值

    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.neighbors import KNeighborsClassifier  # K最近邻(kNN,k-NearestNeighbor)分类算法
    from sklearn.model_selection import cross_val_score
    import matplotlib.pyplot as plt
    
    # 加载iris数据集
    iris = load_iris()
    X = iris.data
    y = iris.target
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
    
    if __name__ == '__main__':
    
        k_scores = []
        # 由迭代的方式来计算不同k对模型的影响,并返回交叉验证后的平均准确率
        for k in range(1, 31):
            # 采用k个最近邻
            knn = KNeighborsClassifier(n_neighbors=k)
            '''
            n_jobs为将交叉验证过程分布到的CPU核心数量,若>1,需要放到"if __name__ == '__main__'"中
            '''
            scores = cross_val_score(knn, X_train, y_train, cv=10, n_jobs=1)
            k_scores.append(scores.mean())
    
        # 可视化数据
        plt.plot(range(1, 31), k_scores)
        plt.xlabel('Value of K for KNN')
        plt.ylabel('Cross-Validated Accuracy')
        plt.show()

    这里写图片描述

    分层k折交叉验证

    分层交叉验证中,类别比例在每个分块中保持一致,使得每个分块中的类别比例与训练数据集的整体比例一致,在sklearn中使用StratifiedKFold,其中cross_val_score默认也采用分层k折交叉验证

    from sklearn.model_selection import StratifiedKFold
    import numpy as np
    
    X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [2, 3], [4, 5]])
    y = np.array([0, 0, 0, 1, 1, 1])
    skf = StratifiedKFold(n_splits=3)
    skf.get_n_splits(X, y)
    for train_index, valid_index in skf.split(X, y):
        print('Train:', train_index, 'Valid:', valid_index)
    
    Train: [1 2 4 5] Valid: [0 3]
    Train: [0 2 3 5] Valid: [1 4]
    Train: [0 1 3 4] Valid: [2 5]
    
    展开全文
  • R语言回归分析-选择最佳模型

    千次阅读 2020-02-21 12:23:00
    AIC值较小的模型要优先选择,它说明模型用较少的参数获得了足够的拟合度。 fit1 < - lm ( Murder ~ Population + Illiteracy + Income + Frost , data = states ) fit2 < - lm ( Murder ...
  • 模型选择准则AIC和BIC

    千次阅读 2020-02-23 17:50:53
    所以,模型选择问题在模型复杂度与模型对数据集描述能力(即似然函数)之间寻求最佳平衡。 人们提出许多信息准则,通过加入模型复杂度的惩罚项来避免过拟合问题,此处我们介绍一下常用的两个模型选择方法——赤池...
  • 训练集、测试集、验证集与模型选择模型选择 在机器学习过程中,为了找到泛化性能最好的那个函数,我们需要确定两方面的参数:1、假设函数参数,也就是我们通常所说的w和b,这类参数可以通过各种最优化算法自动求得。...
  • Heckman模型学习笔记

    千次阅读 2021-04-19 11:21:36
    Heckman模型学习笔记 1、内生性 1.1 线性回归估计原理 我们做线性回归的时候,需要做一些假设,包括: 1)线性性 回归模型对参数而言是线性的,回归子Y和回归元X可以是非线性的。(估计参数本身就是一个随机...
  • 模型选择之特征选择

    千次阅读 2014-11-12 15:03:18
    当我们在训练模型时,其中一个很重要的部分是训练模型的参数,也就是模型中各个特征的值,不同的模型具有不同的特征组合,因此对于特征的选择也就对应了模型选择。举个文本分类的例子,在文本分类的任务中,特征...
  • 模型选择准则

    千次阅读 2015-12-14 19:15:28
    对一堆数据进行建模的时候,特别是分类和回归模型,我们有很多的变量可供使用,选择不同的变量组合可以得到不同的模型,例如我们有5个变量,2的5次方,我们将有32个变量组合,可以训练出32个模型。但是哪个模型更加...
  • 步骤6:模型选择与训练 - 模型选择 6.1 模型的差别 6.2SAEHD模型的超参数 6.3AMP模的超参数 6.4 模型选择 总体流程: 1) clear workspace.bat =》清除工作空间 2) extract images from video data_src....
  • 第10章 离散选择模型

    2020-03-18 15:43:47
    第10章 离散选择模型 本章中,你会学习以下技巧: ·准备数据集以估算离散选择模型 ·估算知名的多项Logit模型 ·测试来自无关选项的独立性冲突 ·用巢式Logit模型处理IIA冲突 ·用混合Logit模型处理复杂的替代模式...
  • 深度学习如何选择模型

    千次阅读 2017-09-26 22:21:10
    深度学习如何选择模型
  • Tobit模型

    千次阅读 2021-10-17 09:09:47
    1. Tobit模型介绍 Tobit模型适用于归并数据,比如家庭娱乐消费这类数据的特点是如果y大于0,则我们可以观察到它;但是如果y小于等于0,那么我们只能观察到0,这种属于左归并。我的理解是,虽然一部分人的消费为0,...
  • 在实际项目中,如何选择合适的机器学习模型

    万次阅读 多人点赞 2017-12-27 00:00:00
    本文来自作者 chen_h 在 GitChat 上分享 「在实际项目中,如何选择合适的机器学习模型?」,「阅读原文」查看交流实录。「文末高能」编辑 | 哈比在这个文章中,我们主要面向初学者或中级数据分析师,他们对识别...
  • 10.2 准备数据集以估算离散选择模型 为这些技巧准备的数据包括了10000条选择情形。第一列是选择的ID,第二列是用户可选的选项列表;不是所有情形下都要从所有选项中选择。 准备 要实践本技巧,你需要安装好pandas、...
  • 搞数学证明也挺有趣,可惜已经走上不归路了。
  • 模型集成 | 14款常规机器学习 + 加权平均模型融合

    万次阅读 多人点赞 2018-07-03 22:59:24
    模型融合的方法很多,Voting、Averaging、Bagging 、Boosting、 Stacking,那么一些kaggle比赛中选手会选用各种方法进行融合,其中岭回归就是一类轻巧且非常有效的方法,当然现在还有很多更有逼格的方法。...
  • 模型选择和训练、验证、测试集

    千次阅读 2019-04-06 10:46:13
    我们是根据测试集的数据来选择模型和评估检测的,但是这是一个不过你公平的过程,因为我们用来进行模型选择和评估的数据是一组相同的数据,拟合的情况肯定很好,但是对于那些没有出现在测试集中的数据没有泛化作用。...
  • 数学建模常见模型

    万次阅读 多人点赞 2021-08-30 19:37:36
    数学建模中比较常见的几种模型: (一)、预测与预报 ...微分方程关系较为复杂,如果数学功底不是很好的一般不会选择使用。比如说小编我。 3、回归分析预测(必须掌握) 求一个因变量与若干自变量之间的关系,
  • 训练集/测试集分割用于模型验证的缺点K折交叉验证是如何克服之前的不足交叉验证如何用于选择调节参数、选择模型、选择特征改善交叉验证 1. 模型验证回顾¶ 进行模型验证的一个重要目的是要选出一个最合适...
  • 疑问:对于交叉验证法,如5折交叉验证,那么将会生成5个模型,到底应该选择哪个模型作为最终的模型呢? 解答:通过阅读博文,发现交叉验证法是用来评估模型性能的,并不参与最后预测模型的生成。 知识点总结: 一...
  • 引言 机器学习已经成为我们生活中的一部分,对购买者、消费者或是希望进行研究和实践者都很重要!无论我们应用预测建模技术来进行我们的研究还是解决业务问题,我...我们如何优先选择一个好的模型?也许一个不同的学
  • 模型评估与模型选择

    千次阅读 多人点赞 2021-04-03 20:42:40
    我们来学习一下模型评估与选择的相关问题。在进入正式的学习之前,请你思考一下:我们为什么要做模型的评估与选择呢? 导论 在某个特定的数据场景下,我们事先并不知道什么样的模型可以近似刻画数据的规律。我们的...
  • 作者:Sebastian Raschka翻译:reason_W编辑:周翔简介正确使用模型评估、模型选择和算法选择技术无论是对机器学习学术研究还是工业场景应用都至关重要。本文将对这三个任务的相关技术进行回顾,并就每种技术的理论...
  • 在机器学习过程中,为了找到泛化性能最好的那个函数,我们需要确定两方面的参数:1、假设函数参数,也就是我们通常所说的www和bbb,这类参数可以通过...确定模型超参数的过程称为模型选择模型选择 借用吴恩...
  • 【超详细】多元线性回归模型statsmodels_ols

    万次阅读 多人点赞 2021-08-20 07:49:06
    多元线性模型的主要作用:(主要进行预测) 通过建模来拟合我们所提供的或是收集到的这些因变量和自变量的数据,收集到的数据拟合之后来进行参数估计。参数估计的目的主要是来估计出模型的偏回归系数的值。估计出来...
  • Heckman两阶段模型学习笔记

    千次阅读 2022-01-16 22:53:46
    有近两周的时间都在学习Heckman两阶段模型。网上看了一些资料,在CSDN里找到了几篇珍贵的学习笔记,有一篇相当于带我入了门学习... 处理效应模型_KEMOSABEr的博客-CSDN博客_样本选择模型KEMOSABEr的博客_CSDN博客-DID,
  • 模型选择

    千次阅读 2018-03-23 19:50:51
    模型选择一个模型可能有很多种情况出现,那么我们如何选择最优的模型呢?1、哪条曲线拟合效果是最好的? 2、 泛化机器学习的目标是使学得的模型能很好地适用于“新样本”,而不是仅仅在训练样本上工作的很好;即便...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,361,516
精华内容 544,606
关键字:

怎么选择模型