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/548256

相关文章

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'