竞赛练习—交通事故理赔审核

前言

本次练习承接上篇《竞赛练习—公共自行车使用量预测》的下一个竞赛,但本次主要为数据处理模型选择,调参可参照上一篇文章。(交通事故理赔审核
结果要求PR-AUC接近1,本文最终处理结果为PR-AUC:0.861185,排名9。

1 数据分析

1.1 数据可视化

首先我们可以检查有无缺失值——结果是没有缺失值。

print(train.isnull().any())# 缺失值检查

然后再查看各变量与Evaluation的相关性

print(train.corr()['Evaluation'])# 查看特征相关性

可以发现,在36个问题中绝大多数是接近0的负相关,只有少部分为正相关
于是我们查看其中为-0.006511的Q1和为0.410700的Q28,当然还有作为估计值的Evaluation的分布情况

for i in ['Q1', 'Q28', 'Evaluation']:

sns.countplot(x=i, data=train)# 查看数据集各变量和类别的**分布**

plt.show()

Evaluation——审核能否通即是0和1的分布,绝大多数都为可以通过并且占据17/20。
Q1——取值几乎都为0,和它相同分布的特征还有许多,这些特征难以体现区分度
Q28——有不同的取值,虽然大多为0,但分布还不算太过悬殊。



我们先使用表现最好的标杆模型——RF(随机森林分类),使用其默认参数,在三折交叉验证下查看PR-AUC的值

RP-AUC数值为:0.8429819733147138
耗时:51.35982632637024秒

1.2 类不平衡处理

类不平衡(class-imbalance)是指在训练分类器中所使用的训练集的类别分布不均。
于是我尝试使用过采样SMOTE算法

from collectionsimport Counter

from imblearn.over_samplingimport SMOTE

# print(Counter(train_y))

smo = SMOTE(random_state=42)

train_x, train_y = smo.fit_sample(train_x, train_y)

# print(Counter(train_y))

可以发现在SMOTE处理后,两个类别样本数量达到相同

RP-AUC数值为:0.8399920675137803
耗时:107.54732489585876 秒


使用过采样的样本训练后,分数下降了,时间还提升了。这是由于过采样它不可避免的带来更大的运算开销,其次当数据中噪音过大时,结果反而可能会更差因为噪音也被重复使用。(欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响?

1.3 特征选择

由于在Q1特征中,表现出绝大特征值为0,这是方差极为低的特征,难以带来有效的信息。

1.3.1 移除方差较低特征

方差为0的特征会被自动移除。剩下的特征按设定的方差的阈值进行选择。

from sklearn.feature_selectionimport VarianceThreshold

sel = VarianceThreshold(threshold=.09) # 选择方差大于0.9的特征

train = sel.fit_transform(train)

test = sel.fit_transform(test)

RP-AUC数值为:0.8300324079765956
耗时:39.80928683280945 秒


移除方差较低的特征后,分数降低很大,时间却降低很多。因为许多特征都表现出方差低的情况,移除后剩下为数不多的特征,此时耗时自然下降,但信息不足以支撑模型训练。(使用scikit-learn进行特征选择

2 模型选择

类不平衡处理移除方差较低的特征后模型表现都不大好。于是我们直接对RF模型进行调参,会发现多次调参仍提升不多
于是考虑选择其他模型,在这之前我们先分析标杆模型和其类似的模型

2.1 LASSO逻辑回归模型

LASSO 的特点:趋向于使得一部分θ 值变为 0,也就是说 LASSO 认为与θ= 0 对应的特征是完全没有用的,而剩下与θ不为 0 所对应的特征是有用的,所以 LASSO 可作为特征选择使用。

机器学习:模型泛化(LASSO 回归)

2.2 随机森林分类模型

随机森林的特点:是在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择,即每棵树随机选择样本并随机选择特征,使得具有很好的抗噪能力,性能稳定。

随机森林(原理/样例实现/参数调优)

2.3 XGBoost分类模型

XGBoost的特点:

①使用许多策略去防止过拟合,如:正则化项、Shrinkage and Column Subsampling等。
②目标函数优化利用了损失函数关于待求函数的二阶导数。
③支持并行化,这是XGBoost的闪光点,虽然树与树之间是串行关系,但是同层级节点可并行。具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行。训练速度快。
④添加了对稀疏数据的处理。
⑤交叉验证,early stop,当预测结果已经很好的时候可以提前停止建树,加快训练速度。
⑥支持设置样本权重,该权重体现在一阶导数g和二阶导数h,通过调整权重可以去更加关注一些样本。

可参考我上一篇《xgboost回归模型—公共自行车使用量预测》文章

其实发现标杆模型都有一个特点,即可以特征选择,对稀疏特征有较好的处理能力。
所以最终我选择XGBoost分类模型,因为他即结合Lasso回归中正则化处理,又结合了随机森林中集成思想特征选择,所以对处理Q1这类特征有较好的反响。还有一点是根据上一篇文章对xgboost的处理,发现仔细调参后可较大幅度提升性能


3 调参

使用XGBoost分类模型,使用其默认参数,在三折交叉验证下查看PR-AUC的值

RP-AUC数值为:0.8238557416902802
耗时:30.34992218017578 秒


发现分数降低很大,但耗时降低。但不要紧张,我们参考网上同样使用xgboost的(竞赛文章)和上一篇调参方法(有时间可以三个参数一起调),在经历几个晚上运行终于调出较高的数值。

cv_params = {}

other_params = {'base_score':0.5, 'booster':'gbtree', 'colsample_bylevel':0.9,

'colsample_bytree':0.4, 'gamma':0.4, 'learning_rate':0.13,

'max_delta_step':0, 'max_depth':5, 'min_child_weight':1, 'missing':None,

'n_estimators':800, 'n_jobs': -1, 'nthread':4, 'objective':'binary:logistic',

'random_state':0, 'reg_alpha':1, 'reg_lambda':1, 'scale_pos_weight':1,

'seed':27, 'silent':True, 'subsample':0.9}

model = XGBClassifier(**other_params)

clf = GridSearchCV(estimator=model, param_grid=cv_params, scoring='average_precision', verbose=1, n_jobs=-1, cv=3)

clf.fit(train_x, train_y)

RP-AUC数值为:0.8583719786179845
耗时:93.17677021026611 秒


这里我们再对数据进行以上类不平衡问题和特征选择,并代入调参后的XGBoost模型,结果不尽人意。所以还是采取不处理,仅调参的XGBoost模型。

最终处理结果为PR-AUC:0.861185,排名9

小结

①本次是分类问题,数据表现出部分特征区分度低类不平衡问题。
②处理以上问题,我们进行特征选择和数据处理和
③如果未有太好效应,则直接进行调参
④调参提高不多,则再一次审视模型选择
⑤其中②③④需要耐心的交接进行。

代码与数据在我的代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。