挑战赛】学习笔记"/>
【Datawhale夏令营项目学习——用户新增预测挑战赛】学习笔记
Datawhale夏令营项目学习——用户新增预测挑战赛
- 2023 讯飞开发者大赛——用户新增预测挑战赛
- 赛题 baseline
- 特征工程
- 数据信息查看
- 数据格式处理
- 提取新特征
- 模型选择
- 模型迭代优化
2023 讯飞开发者大赛——用户新增预测挑战赛
此题类型为数据挖掘赛题,是一个二分类任务,提供了讯飞开放平台海量的应用数据作为训练样本,参赛选手需要基于提供的样本构建模型,预测用户的新增情况。用户新增预测是分析用户使用场景以及预测用户增长情况的关键步骤,有助于进行后续产品和应用的迭代升级。
赛题地址:用户新增预测挑战赛
赛题 baseline
Datawhale 助教使用百度 AI Studio,将本赛题 Baseline 部署在线上平台,可一键 fork 运行代码,看到成绩,并有危定坤助教对 baseline 的详细讲解。
baseline 地址:=1
baseline 讲解视频:=copy_web
baseline 中包含简单数据预处理和特征工程,并使用决策树模型进行训练和预测,提交评测平台拿到 0.626 分。
特征工程
数据的预处理包括空缺值填充、异常值处理、归一化等操作,使得原数据完整且整齐,方便后续处理和特征提取,本赛题提供的原数据比较干净,不需要过多的数据处理,可以直接进行特征工程。
数据信息查看
使用 Pandas 库的 read_csv 方法读取训练数据和测试数据,并使用df.info()
查看数据的信息
train_data = pd.read_csv('用户新增预测挑战赛公开数据/train.csv')
test_data = pd.read_csv('用户新增预测挑战赛公开数据/test.csv')
可以看到数据的信息,包括列名、数据类型、缺失值等信息。
数据格式处理
从上图中可以注意到udmap
的类型为 object,需要经过处理才能给模型去训练,baseline 里使用 one_hot 编码方法进行了数据处理,编写udmap_onethot
函数将原始的 udmap
特征进行处理,将其转换为一个长度为9的向量,表示每个key是否存在,若存在则提取其值并存放得到新特征,与原数据拼接。
此外,原数据中common_ts
为数据的时间戳,为了直观的查看数据并方便后续特征提取,需要将其转化为正常的时间格式。
train_data['common_ts'] = pd.to_datetime(train_data['common_ts'], unit='ms')
test_data['common_ts'] = pd.to_datetime(test_data['common_ts'], unit='ms')
提取新特征
原数据中的eid
代表用户的访问行为类型,按经验考虑,此数据对于用户是否为新用户的判定具有较大的影响,所以在此数据的基础上可以发掘一些新特征,比如 baseline 中提取eid
特征的频次(出现次数)和每种eid
对应的 target
的均值作为新的特征。
# 提取 eid 的频次特征
# 使用 map() 方法将每个样本的 eid 映射到训练数据中 eid 的频次计数
train_data['eid_freq'] = train_data['eid'].map(train_data['eid'].value_counts())
test_data['eid_freq'] = test_data['eid'].map(train_data['eid'].value_counts())# 提取 eid 的标签特征
# 使用 groupby() 方法按照 eid 进行分组,然后计算每个 eid 分组的目标值均值
train_data['eid_mean'] = train_data['eid'].map(train_data.groupby('eid')['target'].mean())
test_data['eid_mean'] = test_data['eid'].map(train_data.groupby('eid')['target'].mean())
此外,我们还联想到用户的访问时间也许对目标预测是具有较大贡献度的,所以可以提取时间 common_ts
的小时部分来生成 common_ts_hour
特征,类似的,也可以提取日期作为新特征。
train_data['common_ts_hour'] = train_data['common_ts'].dt.hour
test_data['common_ts_hour'] = test_data['common_ts'].dt.hour
模型选择
在做完初步的特征工程后,就可以将处理后的数据丢给模型去训练和预测了,为了更好的发挥出数据和特征蕴藏的价值,需要选择一个合适且高效的模型,所以可以进行简单的模型选择和验证。
由于此赛题为二分类问题,再考虑到数据特征较多,使用树模型是比较好的选择,这次参考助教学长提供的cross_val_predict
交叉验证方法来进行简单的模型选择。
# 导入模型
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.ensemble import RandomForestClassifier
# 导入交叉验证和评价指标
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import classification_report# 训练并验证SGDClassifier
pred = cross_val_predict(SGDClassifier(max_iter=10),train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),train_data['target']
)
print(classification_report(train_data['target'], pred, digits=3))# 训练并验证DecisionTreeClassifier
pred = cross_val_predict(DecisionTreeClassifier(),train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),train_data['target']
)
print(classification_report(train_data['target'], pred, digits=3))# 训练并验证MultinomialNB
pred = cross_val_predict(MultinomialNB(),train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),train_data['target']
)
print(classification_report(train_data['target'], pred, digits=3))# 训练并验证RandomForestClassifier
pred = cross_val_predict(RandomForestClassifier(n_estimators=5),train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),train_data['target']
)
print(classification_report(train_data['target'], pred, digits=3))
下图是DecisionTreeClassifier
决策树的输出结果,可见其macro avg 的f1_score
(本赛题的评测指标)较高,因此可以选择此模型用来训练和预测。
模型迭代优化
特征工程和模型优化不是一蹴而就的,需要不断的尝试和探索,发掘新特征,舍弃贡献度较低的特征,在特征相对确定后,就持续优化模型的各项参数,来不断挺高预测的准确度。
分类模型除了这些比较基础的机器学习模型外,还有 lightgbm、xgboost、catboost 等集成模型提升机,都是kaggle、天池等数据大赛平台上大杀四方的利器。作者本人也是该类比赛的初学者,此次学习中在 baseline 之外,我自己也尝试了使用 lightgbm 模型,该模型需要注意的一点是,其预测结果并非 target 中的 binary 类型,而是连续的概率,需要选择合适的阈值去划分并作二值化。虽然刚开始的分数还不及 baseline 的决策树,但在不断的特征工程和模型优化后(详细可见下篇笔记),分数得到了有显著提高,如下图所示。
关于lightgbm、xgboost、catboost等模型,详细可见 Datawhale 公众号这篇推文,有详细的介绍和解读。
CatBoost vs. LightGBM vs. XGBoost:谁是提升机中的王者?
天道酬勤,与君共勉!!!
更多推荐
【Datawhale夏令营项目学习——用户新增预测挑战赛】学习笔记
发布评论