好久好久没有写博客了。。。挺累的,从二月份开始找暑期实习,接着在进行暑期实习,然后马不停蹄地进行秋招,现在总算结束实习,前两天又参加了华为杯数学建模竞赛,感觉接下来就会很轻松了,希望能好好休息休息。这次的比赛还是挺简单的,比起以前参加社会性质的比赛不同,这次不管是从题目还是从要求上都简单几个档次。
1. 数据清洗
说实话,我是挺费解的,看到论坛上好多人都在骂B题数据不对,数据质量差,其实来说,数据整体还算不错,只有几列问题比较大,而且那些列都是异常的大,实际上数值的大小对我们本题影响不大,而且那些异常列并不是大的混乱,他们一般要是异常,都是全部异常,其实这样子的话,信息量就很少了,他们对我们目标贡献值也就会很低,建模过程中特征直接去掉就可以了,毕竟就选了30个特征,原特征有300多个。
以上是针对一些讨论比较激烈的点的一些个人看法。
接下来针对几个讨论的比较多的点说一下个人看法
1. 首先是数据去空,去0,这里我们主要是看极大值极小值和0的交叉,如果0不在极限值或者极大值内,那么说明这是一个空数据,那我们要么是填充,要么是剔除,我们会发现里面有几列就异常了几个数据,我们可以认为这是测量故障,直接用平均值填充就可以了,但是有两列,他们都有16个点位异常,其实我们仔细观察一下数据,可以发现他们0出现的还算有规律,我猜测可能是那种周期性排气,同时我们也要直接对这几列数据做平均,发现为33 ,也就是313数据周围的312 314 数据异常不大,因此我们可以认为其是正确的。就不要进行操作了。这就是对空值的处理
2. 对于极大值和极小值,我觉得这里题目有些问题吧,我们即不能完全剔除,本来数据量就不多,再剔除就没了。。。 所以我采用限幅的办法,但是这里我还是做了一个骚操作,如果表3某一列都超幅值了,我们用表一周围的数据进行填充,这样可以保证我们数据引入的噪声最小。我觉得这么处理的话,模型训练下来mse会降低一些,说明是有效的。
3. 异常值筛选,没啥用吧这个规则。感觉可以忽略。按照我上面这么处理最大值和最小值,然后还有0,改剔除的剔除,改改的改,用这个规则几乎不删除数据,所以我觉得我前面处理的还是很有效果的。
我认为这个数据整体质量还算可以,有点小瑕疵,但是很明显是已经经过几道处理了。从括号有的中文有的英文就可以看出来,那里其实用一个正则就好了。。。毕竟常规操作。
2. 降维
这一步主要是用祖传算法,打比赛的那些降维方法一键降维,什么卡方,IV 都用上,然后再模型融合一下,再用lightGBM进行特征分裂筛选,就ok了,没啥好说的。晒特征,没什么技术含量,都是祖传代码。
3. 模型建立
这里我尝试了三个模型,lgb,线性回归,神经网络,结果是lgb也就比线性回归好了0.002。。。所以我就有点怀疑是不是我降维的时候特征选的太好了,全是线性的。神经网络差一些,mse 0.05。所以这里我们就用线性回归模型,原因嘛,当然是奥卡姆剃刀原则,同时线性回归参数直接获得模型权重,为后面两问打基础
4. 优化
这一问特别有意思,我也觉得是拉开差距的点吧。这道题我一看到的思路,就是用第三问的模型结果,因为他们是线性的,所以只要根据模型正负号,取极大值或者极小值就可以了。所以一开始我就是这么做的,确实可以找到一些3个变量,让损失降低30 以上。 但是这就带来了一个问题,如果我把所有操作变量都调到最优,我们会发现损失变成负的了。。。这里其实就暗示了我们一个问题。
就是我们的极值的取值范围需要再去寻找。
想了挺久的,在第三天的时候才想到,S的含量在5以下,因此我按照S进行数据幅值的确定新的极值的选定。这个地方思路是怎么来的呢?主要是画了S和RON的图像。
我们从这个图可以看出,在89 到90 这一段, 有一个变量严重影响着S和RON,让S和RON反方向变化。因此想到了用S去限制幅值。而且S最低是3.2,可能因为传感器最少就是3.2吧我觉得。
那么按照S进行建模,一看,损失有点大,到了0.9,感觉要凉凉,后来想到3.2 的幅值,就把预测结果小于3.2的改成3.2,然后一算,还可以,然后我们就这么做了。
接着这道题就迎刃而解了,我们用S去限制最大值和最小值,然后重用我们的第一个模型,这道题就做出来了,哈哈。
还有一个问题,就是如何定义降低了百分之30,我的理解是对整体样本求平均值,然后修改某一个变量,看看整体样本下降了多少。其实我还有一个理解,对某一个变量操作,计算出325个样本中有多少个下降了超过百分之30,我个人觉得都对吧,第二个我没有去验证,我用的是第一个。不过我觉得应该都对,结果出来应该差距不大吧。
5. 绘图
没什么好说的,按照线性回归的模型,依照我的第四问选出的操作变量和最大值最小值,进行操作,每次操作det个就可以了,然后对133号样本预测,画图就可以
6. 总结
怎么说呢,我觉得这是我参加的最简单的一次建模吧,可能因为有基础,参加过社会上的建模比赛,感觉出题方比较温和,但是看论坛有的老哥火气就比较大,还是要好好接受题目然后再去解决问题,而不是一味的向出题方撒气。
从题目来说,前三问问题不大,第四问是挺有意思的,可惜时间不够,其实这里可以研究几个变量对RON损失的变化,然后再结合S含量,建立非线性模型,但是时间不够了。很可惜。差不多絮絮叨叨就说了这些,主要说一下自己的处理方案和一些感悟吧。