AI夏令营第三期-用户新增挑战赛之小白学习笔记

(一)赛事介绍

用户新增预测是分析用户使用场景以及预测用户增长情况的关键步骤,有助于进行后续产品和应用的迭代升级。

本次大赛提供了讯飞开放平台海量的应用数据作为训练样本,参赛选手需要基于提供的样本构建模型,预测用户的新增情况。赛题数据由约62万条训练集、20万条测试集数据组成,共包含13个字段。其中uuid为样本唯一标识,eid为访问行为ID,udmap为行为属性,其中的key1到key9表示不同的行为属性,如项目名、项目id等相关字段,common_ts为应用访问记录发生时间(毫秒时间戳),其余字段x1至x8为用户相关的属性,为匿名处理字段。target字段为预测目标,即是否为新增用户。

  1.  (二)学习方法

小白学习方法推荐项目制学习方法,以本次比赛项目为目标进行学习,即使没有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的数据进行处理,增加相关权重也是一个值得思考的问题。

(五)对学习任务问题的回答

  1. 分数为0.62742
  2. 代码:

 

回答:先建一个函数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

往后还有待继续认真学习优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值