DataFountain-大型多人在线角色扮演游戏中玩家充值金额预测(baseline)

本文主要是介绍DataFountain-大型多人在线角色扮演游戏中玩家充值金额预测(baseline),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面 :这个竞赛是DataFountain的一个训练赛,持续的时间也是比较长,不清楚后面会卷到多少分去。我也是前天才看到,想着做着玩儿玩儿,真正把数据下载下来才发现整个数据还是比较杂乱的,所以提供这个baseline希望给大家提供一点参考。目前的话我是0.65分左右排第3,这个baseline大概能到0.6左右。baseline比较粗糙,希望有大佬指点一二!
打个广告 : 目前的话我没有固定的做竞赛队友,一直是单打独斗,希望能找几个队友一起做数据竞赛(CV, NLP,数据分析都可以),一起学习进步。缺队友的友友可以私信我哦(本人现在研一,计科专业)!
赛题我就不重复了, 可以直接点赛题链接

数据处理

目前的话数据处理的部分还是比较粗糙的

import pandas as pd 
pd.set_option('display.max_columns',None)
pd.set_option('display.max_rows',None)
import numpy as np
from sklearn.model_selection import KFold
import sys
np.set_printoptions(threshold=sys.maxsize)
from sklearn.model_selection import train_test_split
from lightgbm import LGBMRegressor as LGBR
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings("ignore")df2 = pd.read_csv("../raw_data/role_consume_op.csv")
df3 = pd.read_csv("../raw_data/role_evolve_op.csv")
df7 = pd.read_csv("../raw_data/role_pay.csv")
df8 = pd.read_csv("../out_put/submission_sample.csv")
role_id = list(df7['role_id'].unique())
test_id = list(df8['role_id'])df3 = df3[df3["role_id"].isin(role_id)]
df2 = df2[df2["role_id"].isin(role_id)]df2["day"] = df2["dt"].apply(lambda x: x[7:8])
for i in role_id:df3.loc[df3["role_id"] == i, "day"] = df3[df3["role_id"] == i]["dt"].apply(lambda x: x[9:10])

处理df7-role_pay.csv

role_pay.csv 这个文件是一部分用户的充值文件,包含了这部分用户的前面7天的充值金额,赛题是让去预测第8天的充值金额。其他文件虽然提供了前面7天的游戏用户的一些行为特征,但是没有提供第8天的。
我的想法就是用滑动窗口的思想构造一个前6天预测第7天的训练集, 然后用2-7天的充值金额做测试集去预测第8天的充值金额。然后将前面7天用户的行为特征拼接到滑动窗口创建的特征集后面一起训练。

df_train_1 = pd.DataFrame()
for i in role_id:df7_one_day = df7[df7["role_id"]==i]["dt"].map(lambda x : x[9:10])df_train_1 = pd.concat([df_train_1, df7_one_day], axis=0)df_train_1 = df_train_1.sort_index()
df7["day"] = df_train_1
df7 = df7.iloc[:,[0, 1, 4]]ds = dict()
for i in role_id:ds[i] = [0 for i in range(7)]for i in df7.values:ds[i[0]][int(i[2])-2] += i[1]

处理df2-role_consume_op.csv

role_consume_op.csv这个表的内容记录的是一部分游戏用户对游戏中一些货币的消耗情况,我的想法就是只选取每个用户每天最终level, 每种货币的消耗的总量,每天的最终现存值当作特征,具体代码如下
在这里插入图片描述

yhl_2 = pd.DataFrame()
for i in role_id:df2_role = df2[df2["role_id"] == i]for j in ["2", "3", "4", "5", "6", "7", "8"]:cols = df2_role.columnsdf2_role_days = df2_role[df2_role["day"]==j]if list(df2_role_days.values) == []:df2_role_days = pd.DataFrame([[i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, j]])df2_role_days.columns = colslevel = df2_role_days["level"].values[-1]use_t1 = df2_role_days["use_t1"].sum()use_t2 = df2_role_days["use_t2"].sum()remain_t1 = df2_role_days["remain_t1"].values[-1]remain_t2 = df2_role_days["remain_t2"].values[-1]df2_yhl = pd.DataFrame([[i, level, use_t1,use_t2,remain_t1, remain_t2,df2_role_days["day"].values[-1]]])yhl_2 = pd.concat([yhl_2, df2_yhl], axis=0)df_yhl_2 = yhl_2.iloc[:, [1, 2, 3, 4, 5]].values
df_yhl_2 = df_yhl_2.reshape(-1, 35)

df3-role_evolve_op.csv(感觉加上效果更差了, 可能是这个方式构造的特征太稀疏了)

这个表记录的是一部分游戏用户消耗各种道具的信息。升级类型type只有几种,可以看作类型变量,游戏用户有什么升级类型就记为1, 然后是对每天消耗道具量求和,其他的信息还没找到合适的使用方式。(但是加上这个表效果好像没啥变化)
在这里插入图片描述

yhl_3 = pd.DataFrame()
for i in role_id:df3_role = df3[df3["role_id"] == i]for j in ["2", "3", "4", "5", "6", "7", "8"]:cols = df3_role.columnsdf3_role_days = df3_role[df3_role["day"]==j]if list(df3_role_days.values) == []:df3_role_days = pd.DataFrame([[i, 0, 0, 0, 0, 0, 0, 0, j]])df3_role_days.columns = colsfea = []type_ = set(list(df3_role_days["type"].values))fea_type = [0 for i in range(11)]for j in type_:fea_type[j-1] = 1num = [df3_role_days["num"].sum()]fea += [i]fea += fea_typefea += numfea += [df3_role_days["day"].values[-1]]df3_yhl = pd.DataFrame([fea])yhl_3 = pd.concat([yhl_3, df3_yhl], axis=0)df_yhl_3 = yhl_3.iloc[:, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]].values
df_yhl_3 = df_yhl_3.reshape(-1, 84)

另外几个行为数据文件差不多也是这个处理方式, 就不贴出来了!

滑动窗口构建训练集

用前6天的充值记录 + df2 + df3 构造的每天游戏用户的行为做特征,第7天的充值做label
用2-7天的充值记录 + df2 + df3 构造的每天游戏用户的行为做特征,去预测第8天的充值

x, y = [], []
for idx, i in enumerate(role_id):x.append(ds[i][:-1] + list(df_yhl_2[idx])[:30] + list(df_yhl_3[idx])[:72]+list(df_yhl_4[idx])[:36] + list(df_yhl_5[idx])[:24])y.append(ds[i][-1])
x = np.array(x)
y = np.array(y)
display(x.shape, y.shape)scaler = StandardScaler()
scaler = scaler.fit(x)
x = scaler.transform(x)x_test = []
for idx, i in enumerate(role_id):x_test.append(ds[i][1:] + list(df_yhl_2[idx])[5:] + list(df_yhl_3[idx])[12:] +list(df_yhl_4[idx])[6:] + list(df_yhl_5[idx])[4:])
display(np.array(x_test).shape)
x_test = scaler.transform(x_test)

训练

训练这里应该做做交叉验证和特征筛选的, 毕竟拼接了太多特征,有没有用还不知道。

x_tr, x_te, y_tr, y_te = train_test_split(x, y, test_size=0.2, random_state=2023)
clf = LGBR(verbose= -1)
cv_params = {"max_depth" : [3, 7, 13],"n_estimators" : [300, 700, 1000],"learning_rate" : [0.005, 0.01,0.02]
}
eval_set = [(x_te, y_te)]
clf_search = GridSearchCV(clf, param_grid=cv_params, scoring='neg_mean_squared_error',n_jobs=-1, cv=5)clf_search.fit(x_tr, y_tr, eval_set=eval_set)
print(clf_search.best_params_)

预测结果

前面的用户充值记录只有1200多个用户, 但是要预测近4000名用户, 我是默认了充值记录没有的用户第8天也不充值,其实可以先做模型利用用户行为特征去预测一个用户是否充值,这样比直接记0会更好。还有就是这个数据是真实的数据,充值金额应该也可以做做文章!!

这篇关于DataFountain-大型多人在线角色扮演游戏中玩家充值金额预测(baseline)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/548257

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

kkFileView在线预览office的常见问题以及解决方案

《kkFileView在线预览office的常见问题以及解决方案》kkFileView在线预览Office常见问题包括base64编码配置、Office组件安装、乱码处理及水印添加,解决方案涉及版本适... 目录kkFileView在线预览office的常见问题1.base642.提示找不到OFFICE组件

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl