平安产险2018极客挑战赛·初赛(三)
特征工程
本次工作采用xgboost作为预测器,基于树模型的预测器对特征的质量相对敏感,因此是有必要做一些特征工程的。
删除极端值
我们选择两个重要程度较大特征,并且把他们在一个二维平面以散点打印了出来。红色蓝色分别表示,正例和负例。
1 | cValues = pd.DataFrame(y_res) |
可以看出,在这个二维的特征空间里面,正负例几乎是重合的,这就很难只通过这两个特征做分类。而且,有一些点离群过于远了,这些异常点的存在会把大量有用信息压缩在一个很小的范围。我们认为应该予以删除这些点,获得更好的训练结果。
我们采用了基于knn的方法删除异常点,通过计算每个点最邻近的5个点的平均距离,删除最离群的0.3%的点。
1 | from sklearn.neighbors import LocalOutlierFactor |
1 | 0],predicted_outlier[:,1],c=cValues1.values[:,0],marker = '.') plt.scatter(predicted_outlier[:, |
当然,这种基于knn的方法,在维度极高的情况下面临严重的维度爆炸的问题(效率及其低下)。在上一篇做了很多one-hot之后,维度已经变得高而稀疏。因此在做极端值删除之前,我们考虑先做特征选择。那么我们该留下多少特征呢?这又成为了一个新的问题。
确定被选择的特征数量
1 | thresholds = np.sort(xgb_select.feature_importances_) |
xgboost里的feature_importances_方法得出的值,是根据这个特征在全部迭代中被使用的次数决定的。我们根据feature_importance的重要性值,对全部特征进行排序,然后逐个设置阈值,不断减少特征数量进行初步的训练和预测。直到精度开始下降(一定程度)。这时需要的特征就被选择出来了。这里一共有20个重要特征(总数是57个)。
特征选择
1 | imp_values=xgb_select.feature_importances_ |
这一步简单的取出了前20个重要特征。
欠采样
前面提到,数据类别不平衡高达200:1。在这么大的不平衡级别下,即使我们通过自定义分类器的metrics也无法获得好的分类效果。根据几次简单的测试,我们认为应该把比例调整到10:1左右,才能获得好的学习效果。
1 | from imblearn.under_sampling import RandomUnderSampler |
解决类别不平衡的手段除了欠采样,还有过采样和生成过采样等等。我们尝试了这些方法,发现这么做对精度并没有太大提高,还反而拖累了学习的效率。
到这里我们就得到了一个相对干净的数据集,可以开始训练了。
- 本文链接:平安产险2018极客挑战赛·初赛(三)
- 版权声明:本文基于署名-非商业性使用-禁止演绎 3.0 中国大陆许可协议 (CC BY-NC-ND 3.0 CN)发布,欢迎转载,但是必须保留本文的署名Tsukiyo及链接。如果要用于商业目的,请联系作者。
分享