前言
本次练习承接上篇《竞赛练习—公共自行车使用量预测》的下一个竞赛,但本次主要为数据处理和模型选择,调参可参照上一篇文章。(交通事故理赔审核)
结果要求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 可作为特征选择使用。
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
小结
①本次是分类问题,数据表现出部分特征区分度低和类不平衡问题。
②处理以上问题,我们进行特征选择和数据处理和。
③如果未有太好效应,则直接进行调参。
④调参提高不多,则再一次审视模型选择。
⑤其中②③④需要耐心的交接进行。