用户新增预测挑战赛Baseline
1、赛题名称:用户新增预测挑战赛
2、 赛题类型:数据挖掘、二分类
赛题背景
讯飞开放平台针对不同行业、不同场景提供相应的AI能力和解决方案,赋能开发者的产品和应用,帮助开发者通过AI解决相关实际问题,实现让产品能听会说、能看会认、能理解会思考。
用户新增预测是分析用户使用场景以及预测用户增长情况的关键步骤,有助于进行后续产品和应用的迭代升级。
赛事任务
本次大赛提供了讯飞开放平台海量的应用数据作为训练样本,参赛选手需要基于提供的样本构建模型,预测用户的新增情况。
赛题数据集
赛题数据由约62万条训练集、20万条测试集数据组成,共包含13个字段。
其中uuid为样本唯一标识,eid为访问行为ID,udmap为行为属性,其中的key1到key9表示不同的行为属性,如项目名、项目id等相关字段,common_ts为应用访问记录发生时间(毫秒时间戳),其余字段x1至x8为用户相关的属性,为匿名处理字段。target字段为预测目标,即是否为新增用户。
评价指标
本次竞赛的评价标准采用f1_score,分数越高,效果越好。
赛题思路
赛题是一个典型的数据挖掘的比赛,需要人工提取特征并构建模型,并且特征差异将会带来很大分数差异。
以下是基础版本的Baseline:
以下的代码都是分版块写的,这是做AI比较常见的一个Notebook的一个框架。
何为Notebook:
一文读懂数据科学Notebook - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/558965459鉴于有人是第一次看Python相关的代码,这里附上相关关键词的链接:
Pandas简介 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/340119918NumPy 介绍 | NumPyhttps://www.numpy.org.cn/user/setting-up.html
import pandas as pd
import numpy as np
train_data = pd.read_csv('用户新增预测挑战赛公开数据/train.csv')
test_data = pd.read_csv('用户新增预测挑战赛公开数据/test.csv')
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')
在BML CodeLab上运行时长:794毫秒
def udmap_onethot(d):
v = np.zeros(9)
if d == 'unknown':
return v
d = eval(d)
for i in range(1, 10):
if 'key' + str(i) in d:
v[i-1] = d['key' + str(i)]
return v
train_udmap_df = pd.DataFrame(np.vstack(train_data['udmap'].apply(udmap_onethot)))
test_udmap_df = pd.DataFrame(np.vstack(test_data['udmap'].apply(udmap_onethot)))
train_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
test_udmap_df.columns = ['key' + str(i) for i in range(1, 10)]
在BML CodeLab上运行时长:8.919秒
这段代码是关于对一个数据集进行One-Hot编码的处理。
其中,`udmap_onethot` 函数根据输入的值 `d` 进行处理。如果 `d` 的值是 `'unknown'`,则返回一个全零的向量 `v`。否则,通过将 `d` 转换为字典的形式,并根据字典中的键值对将向量 `v` 的相应位置设置为非零值,最后返回向量 `v`。
这段代码接着创建了两个DataFrame:`train_udmap_df` 和 `test_udmap_df`。它们分别用于存储训练数据和测试数据中经过 One-Hot 编码后的结果。这两个DataFrame 的列名从 `'key1'` 到 `'key9'`,并将数据集中每个样本的 One-Hot 编码结果按行堆叠起来。
值得注意的是,这段代码使用了 `numpy` 和 `pandas` 库。`np.zeros(9)` 创建了一个长度为 9 的全零向量,`np.vstack` 将多个向量按行堆叠成矩阵,`pd.DataFrame` 将矩阵转换为 DataFrame,并使用 `train_data` 和 `test_data` 中的 `'udmap'` 列进行处理。
最后,使用 `train_udmap_df.columns` 和 `test_udmap_df.columns` 设置了列名
train_data = pd.concat([train_data, train_udmap_df], axis=1)
test_data = pd.concat([test_data, test_udmap_df], axis=1)
在BML CodeLab上运行时长:128毫秒
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())
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())
在BML CodeLab上运行时长: 50毫秒
train_data['udmap_isunknown'] = (train_data['udmap'] == 'unknown').astype(int)
test_data['udmap_isunknown'] = (test_data['udmap'] == 'unknown').astype(int)
在BML CodeLab上运行时长: 74毫秒
train_data['common_ts_hour'] = train_data['common_ts'].dt.hour
test_data['common_ts_hour'] = test_data['common_ts'].dt.hour
在BML CodeLab上运行时长: 76毫秒
这段代码将训练数据集(`train_data`)和测试数据集(`test_data`)中的日期时间数据列(`common_ts`)转换为小时数,并添加一个新的列(`common_ts_hour`)来存储转换后的结果。
具体流程如下:
1. 对训练数据集进行处理:使用 `dt.hour` 方法从 'common_ts' 列中提取小时数,并将结果存储在名为 'common_ts_hour' 的新列中。代码如下:
train_data['common_ts_hour'] = train_data['common_ts'].dt.hour
2. 对测试数据集进行处理:同样地,使用 `dt.hour` 方法从 'common_ts' 列中提取小时数,并将结果存储在名为 'common_ts_hour' 的新列中。代码如下:
test_data['common_ts_hour'] = test_data['common_ts'].dt.hour
通过以上处理,训练数据集和测试数据集中将会多出一个名为 'common_ts_hour' 的列,该列存储了每个数据样本的小时数信息。
这种处理适用于利用时间特征进行分析或建模的场景,通过将日期时间数据转换为更具体的单位(比如小时、分钟等),有助于模型更好地理解时间相关的信息。
import lightgbm as lgb
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
clf.fit(
train_data.drop(['udmap', 'common_ts', 'uuid', 'target'], axis=1),
train_data['target']
)
在BML CodeLab上运行时长: 3.686秒
在这个代码中 lightgbm 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。
相关介绍链接:LightGBM(lgb)介绍 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/165627712
这段代码展示了如何使用 scikit-learn 库中的决策树分类器(`DecisionTreeClassifier`)来进行训练。具体流程如下:
1. 导入需要的模块。该代码导入了`lightgbm`库作为 `lgb` 的别名,同时导入了 `LogisticRegression` 和 `DecisionTreeClassifier` 分别作为逻辑回归和决策树分类器的模型。
2. 创建决策树分类器实例。使用 `DecisionTreeClassifier()` 创建一个决策树分类器的实例,并赋值给变量 `clf`。
3. 进行训练。使用 `fit()` 方法来对分类器进行训练,训练的输入数据使用 `train_data` 中除了 'udmap', 'common_ts', 'uuid', 'target' 列以外的所有列(通过 `drop()` 方法去掉不需要的列),训练的目标值使用 `train_data['target']` 列。这样,分类器会根据输入数据和目标值来学习如何进行分类。
4. 训练完成后,`clf` 分类器就可以用于进行预测和其他操作。
请注意,该段代码中的训练数据和目标值的来源没有给出,你可能需要根据自己的数据做相应的调整。
pd.DataFrame({
'uuid': test_data['uuid'],
'target': clf.predict(test_data.drop(['udmap', 'common_ts', 'uuid'], axis=1))
}).to_csv('submit.csv', index=None)
在BML CodeLab上运行时长: 323毫秒
这段代码的作用是使用训练好的分类器 `clf` 对测试数据进行预测,并将结果保存到一个 CSV 文件中(满足题目的要求)。
具体流程如下:
1. 创建一个新的 DataFrame。使用 `pd.DataFrame()` 创建一个新的 DataFrame 对象。这个 DataFrame 包含两列:'uuid' 和 'target'。
- 'uuid' 列来自于测试数据集中的 'uuid' 列。
- 'target' 列通过调用 `clf.predict()` 方法对测试数据集中除 'udmap', 'common_ts', 'uuid' 列之外的所有列进行预测得到。
2. 将数据保存为 CSV 文件。使用 `to_csv()` 方法将 DataFrame 对象保存为一个名为 'submit.csv' 的 CSV 文件。在保存过程中,将索引列禁用(`index=None`),即不将索引列保存到 CSV 文件中。
通过这段代码的执行,你将获得一个名为 'submit.csv' 的 CSV 文件,其中包含测试数据的 'uuid' 列和模型对测试数据预测的 'target' 列。这个文件可用于后续的数据分析、提交结果等操作。
总结
以上是我第一次打卡学习的相关内容与感悟。
在这之中,我知道了Baseline 的代码是十分清晰的,思路上比较简单,无脑将所有特征不加太多处理直接开跑 Catboost 模型便能得到一个基本的结果。这对于我们机器学习小白是有很好的帮助的。
同时在分析代码时,也能看出特征工程与模型调优的重要性,因此机器学习“简单”却又不简单。 期待下一次的学习与提高!