现实生活总是充满了杂音。记得高中时,班上某学霸喜欢戴着耳机边听JAY的歌边学习,或许这样可以帮他进入一个心如止水的境界。刚毕业那会,我也喜欢在班车上戴着耳机听歌,似乎逃避现实是常态。把嘈杂的现实屏蔽在外很简单,只需要一个耳机。但人总会成长的,面对纷繁复杂的现实,一味逃避总归不是办法。情绪的发泄也无益于问题的解决,只会让现实更加千疮百孔。更高级的智慧是冷静下来,把复杂的问题分而治之,不断迭代精进,从不理想的现实中提炼出最大的价值。正如,在线性回归的世界里,最小二乘法已经做得很好了,但是,面对可恶的噪音(outlier),依然无能为力。后来有了RANSAC(随机抽样一致)算法,它像灵巧的田螺姑娘一样,挑挑拣拣,反复斟酌,竟从一团乱麻般的现实中找到了线索!它的抗干扰能力,着实令人感动。如果拥有了RANSAC算法般的智慧,我猜,现实世界会变成problem solvers的游乐场(●'◡'●)ノ♥
代码下载链接(需要拷贝到ipython notebook中运行):
https://pan.baidu.com/s/1kUIx6yN
4随机抽样一致算法(RANSAC)
随机抽样一致算法(RANdom SAmple Consensus,RANSAC)采用迭代的方式从一组包含离群点的被观测数据中估算出数学模型的参数。
数据分两种:有效数据(inliers)和无效数据(outliers)。偏差不大的数据称为有效数据,偏差大的数据是无效数据。如果有效数据占大多数,无效数据只是少量时,我们可以通过最小二乘法或类似的方法来确定模型的参数和误差;如果无效数据很多(比如超过了50%的数据都是无效数据),最小二乘法就失效了,我们需要新的算法。
RANSAC的大致算法如下:
1、在数据中随机选择几个点设定为inliers
2、计算适合inliers的模型
3、把其他刚才没有选到的点带入刚才建立的模型中,计算是否为inliers(通常看残差是否小于一个阈值)
4、记下inliers数量
5、重复以上步骤多次
6、比较哪次计算中inliers数量最多,那次所建的模型就是我们所要求的解。
例如上次的波士顿房价预测问题,我们用最小二乘法建立了房间数[RM] vs 房价[MEDV]的线性回归模型,可以看出数据集中是有一些离群点的:
如果用RANSAC算法再做一次,效果会不会更好呢?
下面RANSACRegressor算法类中的参数可参考:
http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RANSACRegressor.html
※RANSAC减少了 outlier 的影响,但对于未知数据的预测能力是否有影响未知。
5对比 RANSAC 回归和 OLS 回归
可以看出,RANSAC算法很好地抵抗了离群点的干扰,求得的模型系数和真实模型系数十分接近。
6评估线性回归模型的性能
用模型训练过程中未出现过的数据集来测试模型,是客观评价模型性能好坏的关键步骤。通常用sklearn中的cross_validation模块,把原始数据集拆分为训练集和测试集(可指定比例,通常70%用于训练,30%用于测试):
如果预测都是正确的,那么 residual 就是0。这是理想情况,实际中,我们希望 error 是围绕着0随机分布的。
从上图看, 有部分 error 是离红色线较远的,可能是 outlier 引起较大的偏差。
今天我们学习了用RANSAC建立对outlier不敏感的线性回归模型,以及如何评估线性回归模型的性能,是否感觉技能树又点亮了好多?一些统计学知识还是需要大家恶补下的,祝一切顺利。下周学习如何把线性回归模型转变为曲线——即多项式回归,敬请期待:)