课程链接: 清华大学驭风计划
代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com)
驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算机语言(刘知远教授) 以及数据结构与算法(邓俊辉教授)。本人是综合成绩第一名,除了数据结构与算法其他单科均为第一名。代码和报告均为本人自己实现,由于篇幅限制,只展示任务布置以及关键代码,如果需要报告或者代码可以私聊博主
机器学习部分授课老师为张敏教授,主要主要通过介绍决策树,线性回归,贝叶斯模型,SVM算法,K近邻算法,Kmeans算法以及集成学习算法等入门机器学习。
有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~
一、案例简介
手游在当下的日常娱乐中占据着主导性地位,成为人们生活中放松身心的一种有效途径。近年来,各种类型的手游,尤其是闯关类的休闲手游,由于其对碎片化时间的利用取得了非常广泛的市场。然而在此类手游中,新用户流失是一个非常严峻的问题,有相当多的新用户在短暂尝试后会选择放弃,而如果能在用户还没有完全卸载游戏的时候针对流失可能性较大的用户施以干预(例如奖励道具、暖心短信),就可能挽回用户从而提升游戏的活跃度和公司的潜在收益,因此用户的流失预测成为一个重要且挑战性的问题。在毕业项目中我们将从真实游戏中非结构化的日志数据出发,构建用户流失预测模型,综合已有知识设计适合的算法解决实际问题。
二、作业说明
- 根据给出的实际数据(包括用户游玩历史,关卡特征等),预测测试集中的用户是否为流失用户(二分类);
- 方法不限,使用百度云进行评测,评价指标使用 AUC;
- 提交代码与实验报告,报告展示对数据的观察、分析、最后的解决方案以及不同尝试的对比等;
- 最终评分会参考达到的效果以及对所尝试方法的分析。
三、报告
核心代码
通过特征工程然后进行特征筛选:
'''在这里猜想是否的影响因素包括:登陆天数,登陆次数,一次通关率,最后一天玩的次数,最后一天的胜率,总共花费时间,最大闯关次,最多尝试某一关次数,平均通过率,平均通关时长(相对),平均剩余步数(成功),平均使用道具次数'''
def deal_data(data):
'''最核心的数据处理
'mean_helpLoss','lastDay_play_freq','mean_passRate_last5','mean_passRate_last20','mean_passRate_abs','mean_duration', '''
data_ = pd.DataFrame()
#游戏体验相关
data_['play_count'] = data.groupby('user_id').size() #累积闯关次数
# data_['mean_helpWin'] = data[data['f_success'] ==1].groupby('user_id')['f_help'].mean() #成功通过平均使用道具次数
# data_['mean_helpLoss'] = data[data['f_success'] ==0].groupby('user_id')['f_help'].mean() #失败通过平均使用道具次数
data_.fillna(0,inplace= True) #有的id从没有用过help,所以这里出现nan用0填充,但是后面的rest_step需要用1填充
data_['mean_reststep'] = data[data['f_success'] ==1].groupby('user_id')['f_reststep'].mean() #成功通关里的平均剩余步数
temp = data_[ data_['mean_reststep'].isnull()].index
data_['mean_reststep'].fillna( data[data ['f_success'] ==0].groupby('user_id')['f_reststep'].mean()[temp] , inplace=True) ##这里因为有的人成功过所以在这里填充了非完成的步数
##重试有关
data_['max_level'] = data[data['f_success'] ==1].groupby('user_id')['level_id'].unique().map(lambda x : len(x)) ##通关数
data_.fillna(0.01,inplace= True) #有的id从没有用过help,所以这里出现nan用0填充,但是后面的rest_step需要用1填充
data_['retry_freq'] = data_['max_level'] / data_['play_count'] #绝对重试率
data_['retry_freq_abs'] = data_['retry_freq'] / data.groupby('user_id')['f_avg_retrytimes'].mean() #相对重试率
data_['most_try'] = cal_mostTry(data) ##最多尝试某关的次数
#最后一天有关
data_['lastDay_play'] , data_['last_tryPassrate'] = lastDay_try(data) ##最后一天尝试的次数,以及平均通过率
# data_['lastDay_play_freq'] = data_['lastDay_play'] / data_['play_count'] #最后一天尝试的次数占总次数的比例,有可能最后一天逐渐减少然后弃游,或者反之
# #通过率有关
# data_['mean_passRate_last5'] = ave_success(data , no = 5) #最后10局胜率
# data_['mean_passRate_last20'] = ave_success(data , no = 20) #最后20局胜率,与30局胜率类似
data_['mean_passRate_last30'] = ave_success(data , no = 30) #最后30局胜率
# data_['mean_passRate'] = data.groupby('user_id')['f_success'].mean() #平均绝对通过率,取消与retry_freq类似
# data_['mean_passRate_abs'] = data_['mean_passRate'] / data.groupby('user_id')['f_avg_passrate'].mean() #相对平均通过率: 平均通过率/关卡平均通过率
#时间有关
data_['total_duration'] = data.groupby('user_id')['f_duration'].sum() #累积时间
# data_['mean_duration'] = data.groupby('user_id')['f_duration'].mean() #平均闯关时间
data_['login_days'] = data.groupby('user_id')['day'].unique().apply(len) #登陆天数
# data_['mean_durationWin_abs'] = data.groupby('user_id')['f_duration'].mean() - data.groupby('user_id')['f_avg_win_duration'].mean() #平均尝试时间/平均通关时间
data_['mean_duration_abs'] = data.groupby('user_id')['f_duration'].mean() / data.groupby('user_id')['f_avg_duration'].mean() #平均尝试时间/平均尝试时间
data_['login_days_abs'] = data.groupby('user_id')['day'].unique().map(lambda x : len(x) / (4 - min(x) + 1)) ##是否连续登陆1
data_['exc_time'] = data.groupby('user_id')['exc_time'].mean() ##相对时间差
data_['addicted_time_900'] = addicted_times(data,900) ##寻找最优解在900s
data_.fillna(0,inplace= True) #有的id从没有用过help,所以这里出现nan用0填充,但是后面的rest_step需要用1填充
return data_
train_df_ , test_df_ , dev_df_ = deal_data(train_df) ,deal_data(test_df) , deal_data(dev_df)
train_df_
可视化
每个特征之间的线性相关系数的可视化:
分布以及散点图: