系列文章目录
【Datawhale Ai 夏令营】用户新增预测挑战赛baseline
【Datawhale Ai 夏令营】用户新增预测挑战赛:分类器比较和特征工程
文章目录
前言
前面两篇系列文章,通过特征工程和比较模型来提高分数,这篇文章将会增加新的特征,并且比较新的分类器。
一、新的特征
引入分钟,日期,星期,和一天中的每10分钟的特征。
train_data['common_ts_min'] = train_data['common_ts'].dt.minute
test_data['common_ts_min'] = test_data['common_ts'].dt.minute
train_data['day'] = train_data['common_ts'].dt.day
test_data['day'] = test_data['common_ts'].dt.day
train_data['dat_of_week'] = train_data['common_ts'].dt.day_of_week
test_data['dat_of_week'] = test_data['common_ts'].dt.day_of_week
train_data['ten_minutes_in_day'] = train_data['common_ts_hour'] * 6 + train_data['common_ts'].dt.minute // 10
test_data['ten_minutes_in_day'] = test_data['common_ts_hour'] * 6 + test_data['common_ts'].dt.minute // 10
引入后各分类模型提升如下:
1.SGDClassifier
2.DecisionTreeClassifier
3.MultinomialNB
4.RandomForestClassifier
二、新的分类器
1.xgboost
XGBoost 代表“Extreme Gradient Boosting”,其中“Gradient Boosting”一词源自Friedman 的论文Greedy Function Approximation: A Gradient Boosting Machine 。XGBoost是一个树集成模型,他将K(树的个数)个树的结果进行求和,作为最终的预测值。
pred = cross_val_predict(
XGBClassifier(),
train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),
train_data['target']
)
print(classification_report(train_data['target'], pred, digits=3))
2.LightGBM
LightGBM在 Histogram 算法之上进行进一步的优化。首先它抛弃了大多数 GBDT 工具使用的按层生长 (level-wise) 的决策树生长策略,而使用了带有深度限制的按叶子生长 (leaf-wise) 算法。Level-wise 过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上 Level-wise 是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。
Leaf-wise 则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同 Level-wise 相比,在分裂次数相同的情况下,Leaf-wise 可以降低更多的误差,得到更好的精度。Leaf-wise 的缺点是可能会长出比较深的决策树,产生过拟合。因此 LightGBM 在 Leaf-wise 之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
pred = cross_val_predict(
lgb.LGBMClassifier(),
train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),
train_data['target']
)
print(classification_report(train_data['target'], pred, digits=3))
总结
提出新的特征,增加新的分类器进行比较。未来模型增长点可以着重于对模型参数的精细化调整和模型融合,如使用网格化搜索获取最优参数然后使用Stacking方法对得分优秀的模型进行融合。