• 特征选择


    特征选择

    本节将接着上一讲,并结束掉经验风险最小化一章,之后讨论特征选择等相关问题。

    1. 无限情况下的

    我们在假设集合内假设有限的情况下已经证明了一些有用的理论。但是,很多假设集合,内部的参数都是实数(比如线性回归)即假设集合中包含了无数多个假设。那么,我们能否得到类似的结论呢?

    首先,我们讨论一下不是很正确的一些论点,而这些论点是更好的且更加广泛,而且有利于我们的分析。假设的参数是实数d,因为计算机存储实数的时候使用双精度即64b来存储一个浮点型数据。这就意味着我们的学习算法会假如我们使用了双精度类型存储数据,即参数是64b大小,那么对于我们的假设集合实际上包含k = 264d个不同的假设。根据上一节的结论,我们可以保证ε(ˆh) ≤ ε(h*) + 2γ,在概率至少是1 – δ 的情况下,使得m ≥ O(1/γ2 * log(264d/δ)) = O(d/γ2 * log(1/δ) = Oγ,δ(d) (这里的下标γ, δ表示大O是依赖于该两参数)。因此,需要的训练样本数最多只是模型的参数的线性个数。

    问题是,我们依据64b的浮点型数据存储并不能完全满足该论点,但是结论却是差不多对的。如果我们继续尝试最小化训练误差,也就是为了更好的学习到假设集合中的参数d,通常的我们需要训练样本达到d的线性个数。从这个意义上来说,这些结论对于一个使用了经验风险最小化的算法而言,根本不需要证明。因此对于多数判别学习算法,他们的样本复杂度是d的线性复杂度,然而这些结论并不总是那么容易实现。为了保证许多非经验风险最小化的学习算法的理论可用性,这方面仍在研究中。

    之前的讨论是依赖于假设集合的参数,在某些情况下仍然是无法满足的。直观的看,这并不像是什么问题。假设我们的线性分类器假设集合为,hθ(x) =1{θ0 + θ1x1 + · · · θnxn ≥ 0},含有n+1个参数θ0…. Θn,但是他同时也可以写成hu,v(x) = 1{(u20− v20) + (u21− v21)x1 + · · · (u2n− v2n)xn ≥ 0},包含2n + 2个参数ui, vi 。然而这些都是定义了同一个假设集合n维度下的线性分类器。

    为了推导出更令人满意的结论,我们定义一些东西如下:

    对于给定的数据集S = {x(i), . . . , x(d)}(和训练数据集无关),其中x(i)∈ X,我们说粉碎(shatter)S ,如果能够实现S上的任意类别(label)。举例子而言,如果对于任意类别集合{y(1), . . . , y(d)},中总是存在一些h使得对于所有i = 1, . . . d存在h(x(i)) = y(i)

    对于一个假设集合,我们定义它的VC(Vapnik-Chervonenkis dimension),记作VC(),指被假设集合粉碎(shatter)掉的最大的数据集的大小。(如果能够粉碎任意大小的数据集,那么VC() = ∞)

    举例子而言,如下图的三个点:对于二维的线性分类器假设集合(h(x) = 1{θ0 + θ1x12x2 ≥ 0})能否粉碎(shatter)掉途中的数据集呢?答案是可以。

    具体的粉碎(shatter)方案如下:

    对于上图点中八个可能分类情况的任何一个,我们都能找到一个线性分类器使得训练误差为0。此外,对于4个点的数据集,这个假设集合就无法全部粉碎(shatter)掉所有可能的分类。因此,对于该假设集合能够最大粉碎(shatter)掉的数据集大小是3,即VC() = 3

    注意:虽然假设集合的VC维是3,但是也可能存在大小是3的数据集,该该假设集合无法粉碎(shatter)的情况。比如下图,如果三个点坐落在一条直线上(下图左),那么我们无法找到一条直线把右图的分类情况分割开来。

    换句话说,在VC维的假设下,为了证明VC()最小是d,那么我们仅需要展示假设集合至少能够粉碎(shatter)一个大小为d的数据集。下面是基于Vapnik的理论(这是机器学习理论中最重要的理论。)

    定律:对于给定的假设集合,令VC() = d,那么至少有1 – δ的概率下,对于所有的h∈ ,存在 |ε(h) − ˆε(h)| ≤ 。因此,在至少1 – δ的概率下,也存在 ˆε(h) ≤ ε(h)

    换句话说,如果假设集合存在有限的VC维,那么随着m足够大,将会发生一致收敛(uniform convergence)。正如之前那样,这允许我们给出泛化误差ε(h)ε(h)(最小训练误差的假设的泛化误差)的关系,关系为:

    推论:对于|ε(h) − ˆε(h)| ≤ γ ,如果对所有h∈ ,在至少1 – δ的概率下均成立(因此 ε(ˆh) ≤ε(h)+2γ),那么满足m = Oγ,δ(d)

    换句话说,为了使得假设集合能够学习的足够好,训练样本个数跟假设集合的VC维是线性关系的。实际表明,对于绝大多数假设集合,VC(选用一个合理的参数)也大致是和参数个数成线性关系。把这些结论放在一起,我们总结下:对于一个试图最小化训练误差的学习算法,训练样本个数需要大致和假设集合中参数的个数呈现线性关系(即样本复杂度和参数个数是线性关系的)

    现在假设在一个学习问题中,我们尝试在不同的模型中选择一个模型。举例子说,我们可能使用多项式回归模型hθ(x) = g(θ0 + θ1x + θ2x2+ · · · + θkxk),我们要决定k究竟是0, 1 … 还是 10。我们的模型能否自动的选择一个模型,并较好的权衡了模型的偏差(bias)和方差(variance)。其他的,如假设我们想自动的选择一个参数τ的范围,对于局部权重回归或者选择一个合适的C对于我们的正则化的SVM模型。我们应该如何做?

    为了方便表达,我们定义一个有限的模型集合M= {M1, … Md},我们想从中选择一个最好的模型。比如说,在刚才例子中,模型Mii阶的多项式回归模型。当然,M也可以是包含SVMNN(neural network,神经网络)或者logistic 回归的模型。

    1. 交叉验证(Cross validation)

    假设我们给定的训练集合为S,如果我们基于经验风险最小化原则选择模型,下面是基本的思路:

    1. 在训练集合S上训练模型集合M内所有的模型Mi,得到一些假设hi
    2. 选择训练误差最小的假设h

    然而该方法并不可行。考虑选择一个多项式回归的阶次,我们知道阶次越高,模型对训练集合拟合的效果越好,也就会得到更低的训练误差。因此,这个方法通常会选择出一个高方差、高阶次的多项式模型,正如刚才说的,这通常都是一个很差的选择。接下来,我们对该方法进行改进。改进后的方法称之为hold-out交叉验证(hold-out cross validation),也称之为简单交叉验证(simple cross validation),过程如下:

    1. 把训练集合S随机分割成StrainScv(比如随机选择70%的样本为Strain,余下的为Scv),数据集Scv称之为hold-out交叉验证数据集;
    2. 仅在数据集Strain上训练模型Mi,得到一些假设hi
    3. 选择在Scv数据集上误差 ˆεScv(hi)最小的假设最为最终的假设。

    通过在为训练的数据集Scv上进行测试,我们能够更好的估计各个假设hi的真实泛化误差,然后选择一个泛化误差估计值最小的假设作为最后假设。通常情况下,数据的1/3-1/4用于hold-out交叉验证,30%是一个典型的选择。对于步骤3,也可以根据arg miniˆεScv(hi)来选择hi,之后再使用全部数据集,即S来重新训练模型。(通常情况下这是一个好的方法,但是有一个例外,就是当学习算法对原始状态或数据的波动很敏感的时候。对于这些方法,MiStrain上表现的很好并不意味着在SCV上也会表现很好,这个时候就不需要重新训练模型了)

    使用简单交叉验证的缺点是他浪费了30%的数据,即得到的最佳模型是在 70%的训练数据上选出来的,不代表在全部训练数据上是最佳的。尽管最后我们可以选择使用全部训练数据来训练模型,但是在选择最优的模型的时候,我们仍然只是用来70%的数据。当数据流比较大或者比较容易获得的时候,该方法是很好的。但是当数据是比较稀缺的时候(比如样本数m=20),我们需要更好的一些方法。

    这里有一个方法称之为k折交叉验证(k-fold cross validation),如下:

    1. S随机分割成k个互斥的子集,每个子集样本数为m/k,这些子集称之为S1, . . . , Sk
    2. 对于每一个模型Mi,我们进行如下的测试:

      对于j = 12k

      在数据集S1 ∪ · · · ∪ Sj−1 ∪ Sj+1∪ · · · Sk(即除去Sj以外)上训练模型Mi,得到一些假设hij

          在数据集Sj上测试该假设hij,得到误差 ˆεSj(hij)

          那么模型Mi的泛化误差估计值就等于各个ˆεSj(hij)的平均值(所有的j)

    3. 选择一个泛化误差估计值最低的模型Mi,之后在所有的训练集合S上重新训练,最终得到的假设就是我们们最终的结果。

    一个比较常用的选择是K=10,即10折交叉验证。因为训练数据集仅占整体的1/k,所以会比之前hold-out的小很多,而且这将导致更多的计算量(因为每个模型都要训练和测试k次。)。虽然k经常选用10,但是当数据集比较小的时候,我们还是倾向于让k=m,即让k等于整个数据集的大小,这样让更多的数据参与训练(每次只在一个样本上测试)。在这样的设计下,我们最终的泛化误差估计其实是考虑所有交叉之后的总体均值误差。这种情况也有一个自己的名字——leave-one-out 交叉验证(leave-one-out cross validation)

    最后,虽然我们介绍不同的交叉验证方法用于模型的选择,当然这些方也可以用在一个模型中,用于模型的或算法的评估。举个例子,如果你使用了一些机器学习的算法,然后想要测试他在你的应用上效果如何(比如你有一个新奇的学习算法,想要很正式的评估该方法在测试集合上的效果如何),交叉验证将会是一个相对合理的方法。

    1. 特征选择

    在模型选择中,有一个很特殊且很重要的一步,就是特征选择(feature selection)。为了引出这个,先想像你有一个监督式学习问题,其中特征数目n非常的大(比如n ≫ m),但是你猜想可能只有一小部分的特征和学习任务相关。尽管你在n个特征上使用了简单的线性分类器(比如感知器学习),假设集合的VC维仍然是O(n),因此过拟合将是一个潜在的问题,除非你的训练集足够的大。

    在这样的设置下,你可以使用特征选择算法来减少特征数量。对于给定的n个特征,有2n个可能的特征子集(因为每个特征都包含两个选择,被引入算法和不被引入算法),因此特征选择可以看作是在2n个可能模型中的模型选择。对于特别大的n来说,这通常是计算量非常大的计算,因为要比较2n个模型。因此,有些启发式的搜索策略被用于好的特征子集的发现。下面我们展示一个搜索策略,称之为前向搜索(forward search)

    1. 初始化F =
    2. 循环 {
      1. 对于i = 1n,如果i F,那么让Fi = F {i},之后使用交叉验证来评估特征Fi(即仅使用Fi中有的特征来训练我们的学习算法,之后测试得到他的泛化误差)
      2. F等于a步骤中发现的最好一个特征子集Fi}
    3. 选择并输出最好的特征子集。

    停止该循环过程算法可以通过当F={ 1, . . . , n },即涵盖了所有的特征为止,或者当F达到了某些阈值(比如设置学习算法想要使用的最大特征数)

    上述的算法是wrapper 模型选择(wrapper model feature selection)的一个实例,其中wrapper 指不断地使用不同的特征集来测试学习算法。与前向搜索相对应的,也有其他的一些搜索策略。比如后向搜索(backward search),即开始的时候F={ 1, . . . , n },每次更新需要删除一个特征(测试删除一个特征之后的效果,与前向搜索特征一个特征类似),不断的循环直到F =

    Wrapper 特征选择算法通常都能够很有效的工作,但是计算量非常大,需要非常多次数的调用学习算法。而且,完整的前向搜索算法(即直到F={ 1, . . . , n }才停止)调用学习算法的次数复杂度是O(n2)

    过滤特征选择(filter feature selection)是给出了一个启发式但是计算量非常低的方法来进行特征子集的选择。该方法的主要思路是通过计算每个特征xi对于分类标签y的信息量得分S(i),然后选择得分S(i)最大的前k个特征即可。

    那么接下来的问题就是使用什么样的方法作度量得分S(i)。关于得分S(i)的可能选择,我们可以定义S(i)xiy之间的相关性大小的绝对值,这将会使得我们的结果是选择出来与分类标签相关性最强的一些特征。而在实际过程中,更常用的(对于特征xi是离散值的情况)是选择xiy之间的互信息MI(mutual information)作为S(i)。其中MI计算如下:

     

    该等式是建立在xiy的值是二元情况,等式很容易推广到xy是多个离散值的情况。其中p(xi, y ), p(xi) p(y)能够很容易的从训练集合中的得到。

    为了更好的明白互信息是怎么来,我们注意到互信息可以表示为:KL距离(Kullback-Leibler divergence)MI(xi, y ) = KL( p(xi, y ) || p(xi)p(y) ) 。这是衡量了概率分布p(xi, y )p(xi)p(y)之间有多大程度的不同。如果xiy是相互独立的变量,那么 p(xi, y ) = p(xi)p(y),而两个分布之间的KL距离是0,这就意味着xi对于y没有很明显的信息量,那么S(i)就会很小;相反,如果xiy是很相关,即xi对于y具有很大的信息量,那么MI(xi, y )将会很大。

    最后一点,现在我们根据得分S(i)对所有特征进行排序,那么我们究竟应该选择多少个特征k呢?一个标准的做法是对于所有可能k个特征(也可以设定阈值等等)采用交叉验证。比如,在使用朴素贝叶斯方法进行文本分类的时候,一个问题是特征n是单词表的大小,通常都非常大,使用这个方法选择出的特征子集通常都能够使得分类的准确率上升。

  • 相关阅读:
    debian10
    Containerd 学习
    Java8中list转map方法总结
    微服务难点:基础数据如何设计,为做到共享,我们这样做
    Linux 取两个文件的交集、差集、并集
    Nginx部署图片、视频服务
    python PIL/cv2/base64相互转换
    sql 查询昨日,今日数据
    GridView组件 以及动态GridView
    ListView 基础列表组件、水平 列表组件、图标组件
  • 原文地址:https://www.cnblogs.com/kexinxin/p/9904430.html
Copyright © 2020-2023  润新知