https://www.kaggle.com/greenarrow2018/santander-value-prediction-challenge
剖析问题
要求你预测用户产生的价值是多少,他会使用RMSLE来估计。简单来说就是回归问题,回归问题之前House prediction就遇到过,一般来说,看找这种问题首先还是要考虑label是否符合高斯分布,因为很多模型就是基于高斯分布完成。
引入数据,数据分析
引入数据后我们看到,首先是test比train要多很多,几乎是10倍了,对于过拟合要小心考虑,深度学习这些还是少用。其次是feature column特别多,feature engineering也要很小心。
观察这些数据,可以看到有很多的0,这是稀疏矩阵。可能会有很多全是0的列。
Feature Engineering
Label
首先要观察label是不是符合高斯分布了,符合高斯分布有两个好处,首先许多模型都是基于高斯分布完成的,其次高斯分布会有很好的泛化性,因为大部分的误差都符合高斯分布。
直方图可以看到偏度有点大,需要做一个box-cos变换才行。
变换之后好多了。当然不要忘记对test也要做这个操作。
unique
接下来我们看看有没有多余的列,如果有一个column他的值全都是constant,那么我们可以直接去掉。
发现了256个列,等下直接删掉。
Correlation Coefficient
有三大相关系数,这里我没有选择pearson相关系数,因为很多0,只有少量的是非0元素,如果是线性相关性的话那不就是乘上0的了吗?所以我选择Spearman相关系数。
之所以用scipy不用pandas的corr,是因为pandas这个没办法加上进度条,而且这个4000多个特征,pandas要求很久的。
最后我们画出相关系数的条形图,会发现基本都是0.1左右,其实0.2以上才是弱相关的,所以看不出有什么相关性。
Feature important
既然画图是看不出了,那直接算法分析吧。我们采用ExtraTreesRegressor和lightbgm来判断feature的重要程度。
有些特征是相关系数特别大的,lightbgm也差不多,这里不贴图了。
删去那256列没有用的列之后直接预测的值是1.53。
借鉴了https://www.kaggle.com/alexpengxiao/preprocessing-model-averaging-by-xgb-lgb-1-39
的做法之后改进。
Upgrade
主要改进在5个方面。
- 特征重要性使用随机森林模型。其实我觉得这个影响应该是不大的。
- 只保留了1000个重要的模型。
- 使用Kolmogorov-Smirnov test来判断这train和test的column是否是同一个distribution出来的。
- 增加了statistical feature 和 low-dimension features。
- 聚合模型
其中第三第四点我是没有想到。第三点使用KS假设检验来检测train和test的column有哪一列不是同一个distribution的,如果不是,就是删了。因为其实检验了之后并没有不是同一个distribution生成的,所以notebook就懒的写的了。第四点中他增加的特征有两种,一种是统计特征,比如一行中的均值,方差,最大值等等,这种做法之前我还没有遇到过,个人认为这种添加可能只是应用于少数情况吧。毕竟想其他如果不是匿名的column这么用就太荒谬了。另一个是添加了低纬度的数据,讲原始数据做的降维之后和原始数据合并,这个做法也是第一次见,很神奇。但是不得不说还是有效果的,可能是一种特征增强的方法吧。
最后score是1.41,比原来的好上不少。
主要接触了几个新的数据预处理方法:
1. 如果column非常多,可能会存在常数列,可以考虑去掉。
2. 增加feature还可以增加statistical feature和low-dimension feature, 但是场合可能要考虑。
3. feature importance主要有3个,random forest,lightbgm,ExtraTrees
4. KS假设检验检测是否同一分布(我觉得这个很重要。)
条形图,直方图,柱状图
条形图和柱状图表达的数据的形式基本相同,只不过一个横着一个竖着。
直方图和条形图和柱状图的区别在于,直方图是描述连续变量的,比如上面的label画的直方图就是,一个一个区间的数量。而条形图和柱状图是离散变量的,如上面的feature importance所画的图。
Pearson correlation coefficient
皮尔森相关系数是一种线性相关系数。用来记录两个变量之间的线性相关程度的。绝对值越大,表示相关系数越强。
估算样本的协方差和标准差,可得到样本相关系数:
当r > 0的时候说明两个变量是正相关,一个变量越大另一个变量也是越大的。
当r < 0的时候说明两个变量负相关,一个变量越大另一个变量反而越小。
当r = 0说明两个变量无相关性。
当r = 1 or -1说明两个变量相关性呈线性直线。
0.8-1.0 极强相关
0.6-0.8 强相关
0.4-0.6 中等程度相关
0.2-0.4 弱相关
0.0-0.2 极弱相关或无相关
皮尔森系数通常要求是数据间要符合联合高斯分布,不是仅仅X和Y分比符合高斯分布,而是两个数据一起符合一个联合高斯分布,当然这个条件并不是严格限制的。另外皮尔森系数还要求数据间差距不能太大,也就是离群点不能多,否则会干扰计算结果。
所以pearson相关系数有四个使用条件:
1. 两个变量都是要测量到的连续变量。
2. 两个变量总体都应该符合高斯分布。
3. 变量必需是成对存在。
4. 变量间应该为线性关系。
但是就算是Pearson相关系数是0,也可能存在曲线的关系。
Spearman correlation coefficient
Pearson相关系数并不是在什么情况下都可以使用,而Spearman相关系数是一个非参数度量两个变量相关性的指标,用单调函数来评估两个变量之间的相关性。
首先对按照从大到小的顺序排列,为排列之后的下标,也就是排列之后所在的位置,令为秩差。则相关系数可以表示成:
Spearman相关系数经常被称为是非参数相关的参数,有两层含义:
1. 只要X和Y都单调的函数关系,X和Y就是spearman相关的。而pearson是只有在线性相关的才有相关性。
2. Spearman可以在不知道X和Y的概率密度的时候求解。
3. Spearman对离群点的敏感性不高。因为你最大要不是排第一个要不就是排最后一个。
虽然这个Spearman的适用范围会广一些,但是统计效能要比Pearson低一些,不太容易检测出相关性。
Kendall correlation coefficient
kendall相关系数是基于协同的思想,对于两个变量,如果就称这两对观察值是和谐的,否则就是不是。
和谐的观察值对减去不和谐的观察值对的数量,除以总的观察值对数。
Kendall主要是检测两个变量之间的等级关系。