(一)赛事介绍
用户新增预测是分析用户使用场景以及预测用户增长情况的关键步骤,有助于进行后续产品和应用的迭代升级。
本次大赛提供了讯飞开放平台海量的应用数据作为训练样本,参赛选手需要基于提供的样本构建模型,预测用户的新增情况。赛题数据由约62万条训练集、20万条测试集数据组成,共包含13个字段。其中uuid为样本唯一标识,eid为访问行为ID,udmap为行为属性,其中的key1到key9表示不同的行为属性,如项目名、项目id等相关字段,common_ts为应用访问记录发生时间(毫秒时间戳),其余字段x1至x8为用户相关的属性,为匿名处理字段。target字段为预测目标,即是否为新增用户。
-
(二)学习方法
小白学习方法推荐项目制学习方法,以本次比赛项目为目标进行学习,即使没有python基础或没有进行过深度学习了解,使用项目制学习方法只需了解官方提供的baseline的各行代码意思,在此基础上进行细读、精读,进而在原有代码上进行精进即可。即便是完全不懂AI和python的同学也能够学有所获。
另外,在代码中使用 train_data.info() 可以在不断优化的过程中看到每次数据量的变化大小从而为自己提供一个正确方向。
(三)学习任务1:跑通baseline
运行结果及成绩:
具体实践步骤:
首先导入了需要用到的库,包括 pandas和“决策树分类器”等。接着读取数据:通过使用 pd.read_csv 函数从文件中读取训练集和测试集数据,将其存储在数据框中。
再者对特征工程进行处理, 使用udmap_onethot 函数进行了预处理,将其转换为一个长度为9的向量,表示每个key是否存在。对 udmap 特征进行编码,生成 udmap_isunknown 特征。将处理后的 udmap 特征与原始数据拼接起来,形成新的数据框。最后使用决策树模型训练和预测,使用 fit 函数对训练集中的特征和目标进行拟合,训练了决策树模型。将预测结果和相应的 uuid 组成一个DataFrame,将其保存submit.csv 文件中。
(四)赛题思路
1.此赛题为二分类任务,其中目标是根据用户的行为、属性以及访问时间等特征,预测该用户是否属于新增用户。通过导入相关的库用于数据分析处理,科学计算的多维数组操作,并通过构建决策树分类模型进行训练达到预测结果的目的。我认为此赛题重点在于数据分析处理,通过对train文件数据进行分析对比,发现与target即用户新增相关的数据变量,从而在代码中进行删减、增加比重等操作进行优化加分。
在学习过程中应该按照官方给的流程图进行优化操作,这是使用机器学习方法,在解决机器学习问题时,一般会遵循的流程
2.F1-score是一种用于评估二分类模型性能的指标,分别从两个角度,结合了模型的精确度和召回率,主观和客观上去综合的分析TP够不够大,帮助我们综合考虑模型的预测准确性和对正样本的捕捉能力。
3.通过对几个分享视频的观看,个人思路是时间应该是一个比较关键的信息,因为此赛题是预测用户新增,按照常理来推断,第一次使用这个平台的人就是新用户,或者说第一次去登录到注册了平台账号的就算新用户,然后跟注册时间结合起来。不过现在其实是不知道“时间“这个数据的新增意义,它可能是用户的某一个标签,但多多少少新老用户是跟行为,跟时间有关系,所以可以在这方面进行一些处理和挖掘。原先的时间是精确到毫秒的,我们可以把它拆成年月日或者拆成具体小时分钟的简单拆除,当然也可以把我们的时间跟我们之前的一个行为去做一个结合,去融合出几个特征从而看看是否能达到一个优化的效果。
Uuid作为用户唯一识别标符,对target新增用户结果影响并不大,所以后期可以进行删除优化
Eid作为用户行为id对数据分析从图中可以清晰的看到在18.0至21.0时target用户新增达到一个高峰值,说明该特征是有一定效果的,所以通过对此区间进行数据提取等操作应该能进行一个优化。
通过对X8数据分析可知该数据只有0和1两种数据类型,所以由此推断此数据应代表的是用户性别,通过进一步分析可以发现当为“1“时用户新增概率为12%,当为”0“时用户新增概率为25%,所以如何对x8的数据进行处理,增加相关权重也是一个值得思考的问题。
(五)对学习任务问题的回答
- 分数为0.62742
- 代码:
回答:先建一个函数udmap_onehot,这个函数的作用就是将key转化为我们所要用的列表,从udmap里面把所用数据放到函数里面,这个函数的意思是先创造一个九行的数组,因为key最多到9,先判断是否为unkown,接着字典化d ,转为普通数字,到for循环if语句将将编程字符串组合key成为新的表头,新表从第0列开始,所以i要减1才能对应上原来表的列数,所以用v[ i - 1] = d[‘key’ + str(i)]赋值。下面将数组转换为一列一列表格,进行拼接得到所要的新数据(已经在努力理解了……..)
(六)数据探索
进行时间数据处理
train_data['common_ts_hour'] = train_data['common_ts'].dt.hour
test_data['common_ts_hour'] = test_data['common_ts'].dt.hour
train_data['common_ts_day'] = train_data['common_ts'].dt.day
test_data['common_ts_day'] = test_data['common_ts'].dt.day
train_data['commons_ts_week']=train_data['common_ts'].dt.isocalendar().week.astype(np.float32)
test_data['commons_ts_week']=test_data['common_ts'].dt.isocalendar().week.astype(np.float32)
对数据x8进行分析处理
train_data['x8_freq'] = train_data['x8'].map(train_data['x8'].value_counts()).astype(int)
test_data['x8_freq'] = test_data['x8'].map(train_data['x8'].value_counts()).astype(int)
train_data['x8_mean'] = train_data['x8'].map(train_data.groupby('x8')['target'].mean()).astype(int)
test_data['x8_mean'] = test_data['x8'].map(train_data.groupby('x8')['target'].mean()).astype(int)
test_data
使用train_data.info() 进行查看分析。
train_data.info()
train_data_finall=train_data.drop(['udmap','common_ts','uuid','target','x3'],axis=1).astype(np.float32).isna().sum(axis=0)
test_data_finall=test_data.drop(['udmap','common_ts','uuid','x3'],axis=1).astype(np.float32).isna().sum(axis=0)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 620356 entries, 0 to 620355
Data columns (total 39 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 uuid 620356 non-null int64
1 eid 620356 non-null int64
2 udmap 620356 non-null object
3 common_ts 620356 non-null datetime64[ns]
4 x1 620356 non-null int64
5 x2 620356 non-null int64
6 x3 620356 non-null int64
7 x4 620356 non-null int64
8 x5 620356 non-null int64
9 x6 620356 non-null int64
10 x7 620356 non-null int64
11 x8 620356 non-null int64
12 target 620356 non-null int64
13 udmap_isunknown 620356 non-null int64
14 key1 620356 non-null float64
15 key2 620356 non-null float64
16 key3 620356 non-null float64
17 key4 620356 non-null float64
18 key5 620356 non-null float64
19 key6 620356 non-null float64
20 key7 620356 non-null float64
21 key8 620356 non-null float64
22 key9 620356 non-null float64
23 eid_freq 620356 non-null int64
24 eid_mean 620356 non-null float32
25 eid_std 620356 non-null float32
26 common_ts_hour 620356 non-null int64
27 common_ts_day 620356 non-null int64
28 commons_ts_week 620356 non-null float32
29 x1_freq 620356 non-null int64
30 x1_mean 620356 non-null int64
31 x2_freq 620356 non-null int64
32 x2_mean 620356 non-null int64
33 x6_freq 620356 non-null int64
34 x6_mean 620356 non-null int64
35 x7_freq 620356 non-null int64
36 x7_mean 620356 non-null int64
37 x8_freq 620356 non-null int64
38 x8_mean 620356 non-null int64
dtypes: datetime64[ns](1), float32(3), float64(9), int64(25), object(1)
memory usage: 177.5+ MB
往后还有待继续认真学习优化