【机器学习】 - 作业7: 某闯关类手游用户流失预测

news2025/1/18 4:43:01

课程链接: 清华大学驭风计划

代码仓库: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_ 

可视化

每个特征之间的线性相关系数的可视化:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nPHynspb-1684503797278)(image/hw7/1684503732457.png)]

分布以及散点图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-raQi7gV2-1684503797279)(image/hw7/1684503757483.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

并发和线程

并行和并发 1.并行跟并发有什么区别? 从操作系统的角度来看,线程是CPU分配的最小单位。 并行就是同一时刻,两个线程都在执行。这就要求有两个CPU去分别执行两个线程。 并发就是同一时刻,只有一个执行,但是一个时间段…

详解HTTPS加密过程

目录 前言 HTTPS是什么 HTTPS的工作过程 引入对称加密 引入非对称加密 引入证书 总结 前言 对于HTTP上篇文章已经做了详细的解释了。众所周知,HTTPS要比HTTP要安全,但是为什么HTTPS要比HTTP安全呢? 这篇文章主要研究HTTPS的加密机制…

操作系统-X18 linux日志审计

Linux日志审计 在unix/类unix(Linux)系统中,日志是内核(内存)的一部分。 用于记录系统、程序运行中发生的各种事件 通过阅读日志,有助于诊断和解决系统故障 日志文件的分类 ①内核及系统日志 由系统sysl…

队列及其实现

目录 一&#xff1a;队列 1.队列的概念及结构 2.队列的实现 <1>.初始化队列 <2>.队尾入队列 <3>.队头出队列 <4>.获取队列头部元素 <5>.获取队列队尾元素 <6>.获取队列中有效元素个数 <7>.销毁队列 二&#xff1a;完整代…

如何完全卸载IDEA

工欲善其事必先利其器&#xff0c;我们在用idea的时候&#xff0c;idea的环境出现了莫名其妙的问题&#xff0c;怎么也找不到问题原因。有时候也可能是安装了不知名VB脚本&#xff0c;给系统装了一大堆的环境变量(如下图所示)&#xff0c;这个时候你可以试着把idea卸载重新安装…

Jetpack Compose UI预览

Android开发 Jetpack_Compose_2 UI预览Preview 前言 在学习jetpack compose如何编写ui之前&#xff0c;我认为还是应该先了解与Android studio配合的UI预览Preview。 这样就可以立刻看到UI效果&#xff0c;从而方便后续学习验证代码。 所需依赖 implementation "androidx…

CAPL(vTESTStudio) - 自动创建带有时间戳的报告和log

目录 getLocalTime - 获取本地时间函数 代码示例 获取当前时间并形成格式:"2023_05_22_23_20_18"

Qt中的坐标系

Qt中的坐标系 Qt中的坐标系与win10上画图工具的联系 上面这个图片的水印挡住了重要信息,然后又截了一张,显然,画图工具的像素就是Qt中的坐标系,所以,以后查坐标系直接打开Qt:画笔位置所显示的像素就是Qt的坐标!!! 再总结一下: 好奇:win10上的画图工具是qt写的吗? 答: 不是…

【SpringCloud】Nacos

文章目录 一、Nacos1、安装2、服务注册和发现3、服务分级存储模型4、负载均衡策略--NacosRule5、服务实例的权重设置 一、Nacos 1、安装 官网&#xff1a;https://nacos.io/zh-cn/ 下载 Github主页: https://github.com/alibaba/nacos Github的Release下载页: https://githu…

linux命令行如何查看命令帮助信息

一&#xff0c;简介 “授之以鱼不如授之以渔”&#xff0c;我们再学习linux命令的时候&#xff0c;想查看某个命令的详细说明&#xff0c;有哪些方法呢&#xff1f;本文来介绍一下如何在命令行查找命令的帮助信息。 二&#xff0c;linux命令格式介绍 Linux命令一般由三部分组…

【深度学习】- 作业1: Softmax实现手写数字识别

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

【深度学习】 - 作业7: 图像超分辨率重建

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

Linux网络编程—Day10

Linux服务器程序规范 Linux服务器程序一般以后台进程形式运行。后台进程又称守护进程。它没有控制终端&#xff0c;因而也不会意外接收到用户输入。 守护进程的父进程通常是init进程&#xff08;PID为1的进程&#xff09;&#xff1b;Linux服务器程序通常有一套日志系统&#…

Android 11.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

1.前言 在android11.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加 旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度, 旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现, 接下来就来分析…

chatgpt赋能Python-python_dill

Python dill - 更高效&#xff0c;更强大的对象序列化工具 在Python编程中&#xff0c;对象序列化是一个非常常见的操作&#xff0c;它将Python对象转换为可以存储或传输的格式。Python默认提供了pickle模块来实现序列化&#xff0c;但是pickle存在一些限制&#xff0c;比如无…

usb摄像头驱动-core层usb设备的注册

usb摄像头驱动-core层driver.c 文章目录 usb摄像头驱动-core层driver.cusb_bus_typeusb_device_matchusb_uevent usb_register_driver 在ubuntu中接入罗技c920摄像头打印的信息如下&#xff1a; 在内核中&#xff0c;/driver/usb/core/driver.c 文件扮演了 USB 核心驱动程序管…

复现ms17-010漏洞

复现ms17-010 复现条件环境操作效果 让我们来看看“hkl”在干嘛 复现 条件 1.靶机必须为win8以下。 2.靶机必须同攻击机处于相同网段&#xff08;即倒数第二位相同&#xff09;。 3.靶机的445端口必须要开启。 环境 虚拟机kali为攻击机&#xff0c;win7虚拟机为靶机。 kali…

SELECT LAST_INSERT_ID()自增主键冲突或者为0问题

问题 数据库为mysql&#xff1b; mapper.xml文件为mybatis-generator自动生成的&#xff1b; 连接池使用DruidDataSource&#xff1b; 最终生成的insertSelective如下&#xff1a; 出现问题&#xff1a; 主键冲突&#xff1a;[WMyBatisTraceInterceptor:54][com.mysql.jdbc.…

如何定位OOM

造成OOM的原因 定位OOM 针对第一和第二种情况需要定位OOM 系统已经挂了&#xff1a; 通过堆dump文件定位。 当JVM发生OOM时&#xff0c;自动生成DUMP文件&#xff1a; -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath${目录} java -Xms10M -Xmx10M -XX:HeapDumpOnOutOfMemo…

c#中的json数据

JSON数据 数据传输的语言&#xff0c;用于前后端数据交互的语言&#xff0c;注意xml的区别。 json和xml的区别 xml&#xff1a;可扩展标记语言&#xff0c;是一种用于标记电子文件使其具有结构性的标记语言。 json&#xff1a;(JavaScript Object Notation, JS 对象简谱) 是…