目录
0x00 什么是多项式回归
线性回归假设数据之间存在线性关系,那么当数据之间不存在线性关系时,应该用什么来拟合数据呢? 多项式回归
例如:
从x的角度来看 y=ax^2 +bx +c 是一个多项式回归,但是如果将x^2 看成一个特征 ,x看成另一个特征,那么 y=ax^2 +bx +c 仍旧是一个线性回归。
编程实现:
0x01 scikit-learn中的多项式回归
0x02 过拟合和欠拟合
过拟合:overfitting 算法所训练出来的模型过多的表达了数据间的噪音关系。模型为了拟合所有的样本点,变得过于复杂了
欠拟合:underfitting 算法所训练出来的模型不能完整表述数据关系
以猫和狗的识别为例:
如果机器学习算法认为 有眼睛就是狗,显然是欠拟合
如果机器学习算法认为 有眼睛...毛发为黄色的是狗,显然是过拟合。毛发为黄色只是训练数据的特征,这个特征不是一般性的特征
下面的例子中:我们的样本点是用2次方程加上一点噪音生成的,如果用一次方程去拟合,就是欠拟合,如果用高于二次方程的高次方程去拟合,就很有可能过拟合
0x03 为什么要有训练数据集与测试数据集
之前过拟合的曲线,如果我们取x=2.5,那么得到y_predict= 0.5左右,很明显和其他样本点不在一个趋势上。虽然过拟合曲线将现有的样本点拟合的非常好,但是对于新样本,过拟合曲线就不能很好的预测了。我们称这种模型的泛化能力不是很好
对训练数据拟合程度有多好是没有意义的,我们真正需要的是模型的泛化能力,所以我们需要将原本的数据分离为训练数据与测试数据。如果用训练数据训练出来的模型,对测试数据也有很好的结果的话,我们就说我们的模型泛化能力是很强的。
编程:
0x04 学习曲线
学习曲线:随着训练样本的逐渐增多,算法训练出的模型的预测准确率的变化曲线
0x05 验证数据集与交叉验证
之前我们将我们现有的数据集分为训练数据集和测试数据集,用测试数据集来测试模型的泛化能力,但是这样仍然存在一个问题:我们可能只是针对特定测试数据集拟合的很好,也就说,针对特定测试数据集过拟合。
解决方案一:
将现有的数据集分为三部分:
训练数据:用来训练模型
验证数据:用来测试训练出来的模型,不断调整超参数,保证训练出来的模型针对验证数据已经达到最优
测试数据:作为衡量最终模型性能的数据集
解决方案二:交叉验证
代码:
0x06 k-folds 交叉验证
把训练集分为k份,称为k-folds cross validation
缺点:每次需要训练k个模型,相当于整体性能慢了k倍
留一法:loo-cv leave-one-out cross validation
把训练数据集一共有m个样本,我们就将其分成m份,每次都将m-1份样本用于训练,然后去用模型测试剩下的一份样本,称为留一法。
优点:完全不受随机的影响,最接近模型真正的性能指标
缺点:m个中选1个,一共有m种情况,也就说我们需要训练m个模型来交叉验证,计算量巨大
0x07 偏差方差权衡
区分偏差和方差:
高偏差:模型准确率一直很低
高方差:模型准确率忽高忽低,即针对某些样本预测准确率很高,针对某些样本预测准确率很低。
模型误差 = 偏差(Bias)+方差(Variance)+不可避免的误差
导致偏差的主要原因:
对问题本身的假设不正确,如:非线性数据使用线性回归,例如:欠拟合
高方差:
数据的一点点扰动,都会较大的影响模型,通常原因:使用的模型太复杂,没有学习到本质,而是学习到了许多噪音,例如高阶多项式回归,过拟合
有一些算法天生是高方差的算法,例如kNN(数据敏感)
非参数学习算法通常都是高方差算法。因为不对数据进行任何假设
有一些算法天生是高偏差算法,如线性回归
参数学习通常都是高偏差算法,因为对数据具有极强的假设。
大多数算法具有相应的参数,可以调整偏差和方差,例如kNN中的k,如线性回归中使用多项式回归
偏差和方差通常是矛盾的
降低偏差,会提高方差
降低方差,会提高偏差
机器学习算法的主要挑战,来自于方差。
解决高方差的通常手段:
1.降低模型的复杂度
2.减少数据的维度,降噪
3.增加样本数
4.使用验证集
5.模型正则化
0x08 模型泛化与岭回归
模型正则化 Regularization: 限制参数的大小
我们之前的损失函数是:
即使样本值 和 用theta算出来的值的均方误差尽可能的小
但是当我们过拟合的时候,很有可能导致theta非常的大, 即曲线某些部分会非常陡峭,如下图:
我们如何才能让theta不要过大呢?加入模型正则化,修改损失函数。
即将theta1到thetaN的平方和加入到损失函数中,让我们在最小化损失函数的时候考虑到模型参数的大小,不要让曲线太陡峭
为什么没有theta0呢?因为theta0不是任何一个特征值的参数,theta0只是曲线的截距,决定了曲线的高低,而不会决定曲线的陡峭和缓和。
前面的1/2加不加都可以,只是为了求导后正好可以与theta头上的2约掉,方便计算。
α 是一个新的超参数,α代表了 theta平方和 占整个损失函数的比重的多少。我们有多重视对模型陡峭程度的优化。
以上这种模型正则化的方式称为 岭回归(Ridge Regression)
代码示例:
0x09 LASSO Regularization
LASSO: Least Absolute Shrinkage and Selection Opeartor Regression
代码:
如果一部分theta变为0了,就说明LASSO认为这些特征是完全没有用的,
但是有时会将一些原本有用的特征的参数变为0
0x0A L1 ,L2 和弹性网络
L1正则 L2正则:
Lp范数:xi到原点的明科夫斯基距离
L0正则:
让非零theta的个数尽可能少
实际用L1取代,因为L0正则的优化是一个NP难的问题
弹性网:Elastic Net
在均方误差之后,既添加了一个L1正则项又添加了一个L2正则项
只不过又添加了一个超参数 r ,来表示这两项的比例: