Python数据分析与挖掘
概述
机器学习(有监督)的目的是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。用数学语言来说就是规则化参数的同时最小化误差。
在实际进行算法学习时,我们一般把数据分为训练集和测试集。如果参数太多,会导致我们的模型复杂度上升,在训练集上得到最小化的误差,但是在预测新样本的时候却不理想,也就是我们说的过拟合。
所以,我们需要保证模型简单
的基础上最小化训练误差,这样得到的参数才具有好的泛化性能
(也就是测试误差也小),而模型“简单”就是通过规则函数来实现的。
另外,规则项的使用还可以约束我们的模型的特性。这样就可以将人对这个模型的先验知识融入到模型的学习当中,强行地让学习到的模型具有人想要的特性,例如稀疏、低秩、平滑等等。
这样也符合了奥卡姆剃刀的原理,“如无必要,勿增实体”,即“简单有效原理”。
“切勿浪费较多东西去做,用较少的东西,同样可以做好的事情。”
正则化
正则化的主要作用是防止过拟合,对模型添加正则化项可以限制模型的复杂度,使得模型在复杂度和性能达到平衡。
常用的正则化方法有L1正则化和L2正则化。L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。
监督学习的目标函数
w
∗
=
a
r
g
m
i
n
⏟
w
∑
i
L
(
y
i
,
f
(
x
i
;
w
)
)
+
λ
Ω
(
w
)
w^*=arg \underbrace{min}_{w}\sum_iL(y_i,f(x_i;w))+\lambda\Omega(w)
w∗=argw
mini∑L(yi,f(xi;w))+λΩ(w)
其中,第一项 L ( y i , f ( x i ; w ) ) L(y_i,f(x_i;w)) L(yi,f(xi;w))衡量我们的模型(分类或者回归)对第i个样本的预测值 f ( x i ; w ) f(x_i;w) f(xi;w)和真实的标签 y i y_i yi之前的误差。因为我们的模型是要拟合我们的训练样本的,所以我们要求这一项最小,也就是要求我们的模型尽量的拟合我们的训练数据。但正如上面说言,我们不仅要保证训练误差最小,我们更希望我们的模型测试误差小,所以我们需要加上第二项,也就是对参数w的规则化函数 Ω ( w ) Ω(w) Ω(w)去约束我们的模型尽量的简单。
第一项Loss函数,如果是Square loss,那就是最小二乘了;如果是Hinge Loss,那就是著名的SVM了;如果是exp-Loss,那就是牛逼的 Boosting了;如果是log-Loss,那就是Logistic Regression了
L0范数和L1范数
L0范数
是指向量中非0的元素的个数。如果我们用L0范数来规则化一个参数矩阵W的话,就是希望W的大部分元素都是0。,换句话说,让参数W是稀疏的。
L1范数
是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。任何的规则化算子,如果他在
W
i
=
0
W_i=0
Wi=0的地方不可微,并且可以分解为一个“求和”的形式,那么这个规则化算子就可以实现稀疏。这说是这么说,W的L1范数是绝对值,|w|在w=0处是不可微,但这还是不够直观。这里因为我们需要和L2范数进行对比分析。
既然L0可以实现稀疏,为什么不用L0,而要用L1呢?一是因为L0范数很难优化求解(NP难问题),二是L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。
L1范数和L0范数可以实现稀疏,L1因具有比L0更好的优化求解特性而被广泛应用。
关于稀疏的好处:
-
特征选择(Feature Selection):
大家对稀疏规则化趋之若鹜的一个关键原因在于它能实现特征的自动选择。一般来说, x i x_i xi的大部分元素(也就是特征)都是和最终的输出 y i y_i yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑 x i x_i xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确 y i y_i yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。 -
可解释性(Interpretability):
另一个青睐于稀疏的理由是,模型更容易解释。例如患某种病的概率是y,然后我们收集到的数据x是1000维的,也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。假设我们这个是个回归模型: y = w 1 ∗ x 1 + w 2 ∗ x 2 + … + w 1000 ∗ x 1000 + b y=w_1*x_1+w_2*x_2+…+w_{1000}*x_{1000}+b y=w1∗x1+w2∗x2+…+w1000∗x1000+b(当然了,为了让y限定在[0,1]的范围,一般还得加个Logistic函数)。通过学习,如果最后学习到的 w ∗ w^* w∗就只有很少的非零元素,例如只有5个非零的 w i w_i wi,那么我们就有理由相信,这些对应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了。但如果1000个 w i w_i wi都非0,医生面对这1000种因素,累觉不爱。
L2范数
L2范数:
∣
∣
W
∣
∣
2
||W||^2
∣∣W∣∣2,在回归里面,有人把有它的回归叫“岭回归”(Ridge Regression),有人也叫它“权值衰减weight decay”,它的强大功效是改善机器学习里面一个非常重要的问题:过拟合。
上面的图是线性回归,。从左到右分别是欠拟合(underfitting,也称High-bias)、合适的拟合和过拟合(overfitting,也称High variance)三种情况。可以看到,如果模型复杂(可以拟合任意的复杂函数),它可以让我们的模型拟合所有的数据点,也就是基本上没有误差。对于回归来说,就是我们的函数曲线通过了所有的数据点。
L2范数是指向量各元素的平方和然后求平方根。我们让L2范数的规则项
∣
∣
W
∣
∣
2
||W||^2
∣∣W∣∣2最小,可以使得W的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0,这里是有很大的区别的。而越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。为什么越小的参数说明模型越简单?限制了参数很小,实际上就限制了多项式某些分量的影响很小(看上面线性回归的模型的那个拟合的图),这样就相当于减少参数个数。
L2范数的好处
- 学习理论的角度:
从学习理论的角度来说,L2范数可以防止过拟合,提升模型的泛化能力。 - 优化计算的角度:
从优化或者数值计算的角度来说,L2范数有助于处理 condition number不好的情况下矩阵求逆很困难的问题。
优化有两大难题,一是:局部最小值,二是:ill-condition病态问题。前者,我们要找的是全局最小值,如果局部最小值太多,那我们的优化算法就很容易陷入局部最小而不能自拔,这很明显不是观众愿意看到的剧情。那下面我们来看ill-condition。ill-condition对应的是well-condition。那他们分别代表什么?假设我们有个方程组AX=b,我们需要求解X。如果A或者b稍微的改变,会使得X的解发生很大的改变,那么这个方程组系统就是ill-condition的,反之就是well-condition的。我们具体举个例子。
先看左边的那个。第一行假设是我们的AX=b,第二行我们稍微改变下b
,得到的x和没改变前的差别很大。第三行我们稍微改变下系数矩阵A
,可以看到结果的变化也很大。换句话来说,这个系统的解对系数矩阵A或者b太敏感了。又因为一般我们的系数矩阵A和b是从实验数据里面估计得到的,所以它是存在误差的,如果我们的系统对这个误差是可以容忍的就还好,但系统对这个误差太敏感了,以至于我们的解的误差更大,那这个解就太不靠谱了。所以这个方程组系统就是ill-conditioned病态的,不正常的,不稳定的,有问题的.右边那个就叫well-condition的系统
A=np.mat('1,2;2,3.999')
b=np.mat('4,7.999').T
r = np.linalg.solve(A,b)
对于一个ill-condition的系统,我的输入稍微改变下,输出就发生很大的改变,这不好,这表明我们的系统不能实用。你想想看,例如对于一个回归问题 y = f ( x ) y=f(x) y=f(x),我们是用训练样本x去训练模型f,使得y尽量输出我们期待的值,例如0。那假如我们遇到一个样本x’,这个样本和训练样本x差别很小,面对他,系统本应该输出和上面的y差不多的值的,例如0.00001,最后却给我输出了一个0.9999,这很明显不对呀。就好像,你很熟悉的一个人脸上长了个青春痘,你就不认识他了,那你大脑就太差劲了。所以如果一个系统是ill-conditioned病态的,我们就会对它的结果产生怀疑。那到底要相信它多少呢?我们得找个标准来衡量吧,因为有些系统的病没那么重,它的结果还是可以相信的,不能一刀切。回到上面的condition number,就是拿来衡量ill-condition系统的可信度的。condition number衡量的是输入发生微小变化的时候,输出会发生多大的变化。也就是系统对微小变化的敏感度。condition number值小的就是well-conditioned的,大的就是ill-conditioned的。
L1和L2差别
-
下降速度
L1和L2都是规则化的方式,我们将权值参数以L1或者L2的方式放到代价函数里面去。然后模型就会尝试去最小化这些权值参数。而这个最小化就像一个下坡的过程,L1和L2的差别就在于这个“坡”不同,如下图:L1就是按绝对值函数的“坡”下降的,而L2是按二次函数的“坡”下降。所以实际上在0附近,L1的下降速度比L2的下降速度要快。
-
模型空间的限制
对于L1和L2规则化的代价函数来说,我们可以写成以下形式:
L a s s o : m i n w 1 n ∣ ∣ y − X w ∣ ∣ , s . t . ∣ ∣ W ∣ ∣ 1 ≤ C Lasso:min_w\frac1n||y-Xw||,s.t.||W||_1\leq C Lasso:minwn1∣∣y−Xw∣∣,s.t.∣∣W∣∣1≤C
R i d g e : m i n w 1 n ∣ ∣ y − X w ∣ ∣ 2 , s . t . ∣ ∣ W ∣ ∣ 2 ≤ C Ridge:min_w\frac1n||y-Xw||^2,s.t.||W||_2\leq C Ridge:minwn1∣∣y−Xw∣∣2,s.t.∣∣W∣∣2≤C
我们将模型空间限制在w的一个L1-ball 中。为了便于可视化,我们考虑两维的情况,在(w1, w2)平面上可以画出目标函数的等高线,而约束条件则成为平面上半径为C的一个 norm ball 。等高线与 norm ball 首次相交的地方就是最优解:
可以看到,L1-ball 与L2-ball 的不同就在于L1在和每个坐标轴相交的地方都有“角”出现,而目标函数的测地线除非位置摆得非常好,大部分时候都会在角的地方相交。注意到在角的位置就会产生稀疏性,例如图中的相交点就有 w 1 = 0 w_1=0 w1=0,而更高维的时候(想象一下三维的L1-ball 是什么样的?)除了角点以外,还有很多边的轮廓也是既有很大的概率成为第一次相交的地方,又会产生稀疏性。
相比之下,L2-ball 就没有这样的性质,因为没有角,所以第一次相交的地方出现在具有稀疏性的位置的概率就变得非常小了。这就从直观上来解释了为什么L1-regularization 能产生稀疏性,而L2-regularization 不行的原因了。
因此,一句话总结就是:L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。Lasso在特征选择时候非常有用,而Ridge就只是一种规则化而已。
规则化参数
回过头来看看我们的目标函数:
w
∗
=
a
r
g
m
i
n
⏟
w
∑
i
L
(
y
i
,
f
(
x
i
;
w
)
)
+
λ
Ω
(
w
)
w^*=arg \underbrace{min}_{w}\sum_iL(y_i,f(x_i;w))+\lambda\Omega(w)
w∗=argw
mini∑L(yi,f(xi;w))+λΩ(w)
里面除了loss和规则项两块外,还有一个参数λ。它也有个霸气的名字,叫hyper-parameters(超参)。你不要看它势单力薄的,它非常重要。它的取值很大时候会决定我们的模型的性能,事关模型生死。它主要是平衡loss和规则项这两项的,λ越大,就表示规则项要比模型训练误差更重要,也就是相比于要模型拟合我们的数据,我们更希望我们的模型能满足我们约束的Ω(w)的特性。反之亦然。举个极端情况,例如λ=0时,就没有后面那一项,代价函数的最小化全部取决于第一项,也就是集全力使得输出和期待输出差别最小,那什么时候差别最小啊,当然是我们的函数或者曲线可以经过所有的点了,这时候误差就接近0,也就是过拟合了。它可以复杂的代表或者记忆所有这些样本,但对于一个新来的样本泛化能力就不行了。毕竟新的样本会和训练样本有差别的.
http://blog.csdn.net/zouxy09/article/details/24971995
https://blog.csdn.net/u010725283/article/details/79212762