游戏玩家付费金额预测大赛

这几天恰好有空,尝试了几种方案,但是分数都比较低,在这里分享下,给大家提供些参考,比较粗糙,大神就不要看了。包括R语言和Python。R语言包括三个:流氓版本,线性回归,xgboost;Python两个版本:领回归和lgb。

比赛链接

比赛任务

建立模型通过用户注册账户后7天之内的游戏数据,预测用户在45天内的消费金额

比赛数据

1)训练集(带标签):2288007个样本 带标签的训练集中共有2288007个样本。tap_fun_train.csv中存有训练集样本的全部信息,user_id为样本的id,prediction_pay_price为训练集标签,其他字段为特征。

2)测试集:828934个样本 tap_fun_test.csv中存有测试集的特征信息,除无prediction_pay_price字段外,格式同tap_fun_train.csv。参赛者的目标是尽可能准确地预测第45天的消费金额prediction_pay_price。

3) tap4fun 数据字段解释.xlsx 为本次比赛数据109个字段的解释,每个属性对应的数据均用“数值”表示,无空值。

比赛奖项

一等奖(一支队伍):50000元奖金

二等奖(一支队伍):30000元奖金

三等奖(一支队伍):20000元奖金

前五名团队还将获得tap4fun直面绿色通道

时间安排

正赛阶段:6月19日-8月31日

报名开始:6月19日11:00

线上评分:2018年6月19日 11:00--8月31日 15:00

提交代码:2018年8月31日 17:00--9月2日 16:00

人工复核:2018年9月2日--9月12日

公布结果:2018年9月14日

注:2018年8月31日17:00排行榜将刷新为B榜成绩

开源代码

-------------------------------------------------------------------------------------------------

R语言

--------------------------------------------------------------------------------------------------------

library(dplyr)

library(ggplot2)

library(xgboost)

library(lubridate)

library(data.table)

options(scipen = 200)#不要以科学计数法显示

版本1:流氓方式(效果最好-65分)

计算前七天充值金额与预测目标的相关性:0.7352345,高度相关(关系图如首页),直接使用一个变量乘以系数提交,目前比较好的系数是4.3,线上成绩65.71001,大概20名左右。

cor(tap_fun_train$pay_price,tap_fun_train$prediction_pay_price)#计算相关性

比较重要的特征还有ivory_add_value,pay_count大家可以尝试加入更多的进行回归

简单代码如下:

setwd("C:/Users/wuzhengxiang/Desktop/游戏玩家付费金额预测大赛")

tap_fun_train = fread("tap_fun_train.csv",header=T)#2288007--1-2242019/2288007 付费比例2%

tap_fun_test = fread("tap_fun_test.csv" ,header=T)#828934

predict_final = select(tap_fun_test,user_id)

predict_final$prediction_pay_price = 4.3*tap_fun_test$pay_price

write.csv(predict_final,'lm-07072319.csv', row.names = FALSE, quote = FALSE)

版本2:线性回归版本(效果很差127分)

model = lm(prediction_pay_price~ pay_price+ivory_add_value+pay_count,data = tap_fun_train)

pred = predict(model,data = tap_fun_test)

predict_final = select(tap_fun_test,user_id)

predict_final$prediction_pay_price = pred

predict_final$prediction_pay_price = if_else(predict_final$prediction_pay_price

#预测结果导出

write.csv(predict_final,'lm-0707-01.csv', row.names = FALSE, quote = FALSE)

版本3:xgboost(效果一般-72分)

#基础数据读取

setwd("C:/Users/wuzhengxiang/Desktop/游戏玩家付费金额预测大赛")

tap_fun_train = fread("tap_fun_train.csv",header=T)#2288007--1-2242019/2288007 付费比例2%

tap_fun_test = fread("tap_fun_test.csv" ,header=T)#828934

train = tap_fun_train

test = tap_fun_test

LABEL=train$prediction_pay_price

train$register_time = NULL

train$prediction_pay_price = NULL

test$register_time = NULL

user_id = select(tap_fun_test,user_id)

#异常值处理、特征选择

train[is.na(train)] = -1

test[is.na(test)] = -1

#数据变化

dtrain = xgb.DMatrix(data.matrix(train), label = LABEL)

dtest = xgb.DMatrix(data.matrix(test))

#参数设置

param = list(booster = "gbtree",

objective = "reg:linear",

eval_metric = "rmse",

#gamma=0.2,

#lambda=2,

eta = 0.05,

subsample = 0.65,

colsample_bytree = 0.75,

min_child_weight = 3,

max_depth = 5

)

#交叉验证

model.cv = xgb.cv(data = dtrain,

params=param,

nrounds = 10000,

nfold = 5,

print_every_n = 10,

early_stopping_rounds = 30

)

#test-rmse:3726.037988+1361.778319

#模型建立

model_xgb = xgboost(data = dtrain,

params=param,

print_every_n = 100,

nrounds = 1200)

#结果预测

pred = predict(model_xgb, dtest)

predict_final = data.frame(user_id, prediction_pay_price = pred)

#预测结果导出

pred_xgb=str_c("pred_final-",str_c(str_sub(Sys.time(),1,10),

str_sub(Sys.time(),12,13),str_sub(Sys.time(),15,16),sep="_"),".csv")

write.csv(predict_final ,pred_xgb , row.names = FALSE, quote = FALSE,fileEncoding = "utf8")

#特征重要性评估

names = dimnames(data.matrix(train))[[2]]

importance=xgb.importance(names,model = model_xgb)

#top10特征绘图

-------------------------------------------------------------------------------------------------

Python

--------------------------------------------------------------------------------------------------------

import gc

import re

import sys

import time

import os.path

import os

import datetime

import numpy as np

import pandas as pd

import lightgbm as lgb

版本1:lgb算法(81分)

#工作空间设置

data_path = 'C:/Users/wuzhengxiang/Desktop/游戏玩家付费金额预测大赛'

os.chdir(data_path)#设置当前工作空间

print (os.getcwd())#获得当前工作目录

#数据读取

tap_fun_train = pd.read_csv('tap_fun_train.csv')#2288007

tap_fun_test = pd.read_csv('tap_fun_test.csv')#828934

tap_fun_test['prediction_pay_price'] = -1

#protein_concat = pd.concat([tap_fun_train,tap_fun_test])

data = pd.concat([tap_fun_train,tap_fun_test])

#模型训练

train_feat = data[data['prediction_pay_price']> -1].fillna(0)

testt_feat = data[data['prediction_pay_price']

label_x = train_feat['prediction_pay_price']

label_y = testt_feat['prediction_pay_price']

submission = testt_feat[['user_id']]

train_feat = train_feat.drop('prediction_pay_price',axis=1)

testt_feat = testt_feat.drop('prediction_pay_price',axis=1)

#train_feat = train_feat.drop('user_id',axis=1)

#testt_feat = testt_feat.drop('user_id',axis=1)

train_feat = train_feat.drop('register_time',axis=1)

testt_feat = testt_feat.drop('register_time',axis=1)

#lgb算法

train = lgb.Dataset(train_feat, label = label_x)

test = lgb.Dataset(testt_feat, label = label_y,reference=train)

params = {

'boosting_type': 'gbdt',

'objective': 'regression_l2',

'metric': 'l2',

#'objective': 'multiclass',

#'metric': 'multi_error',

'min_child_weight': 3,

'num_leaves': 2 ** 5,

#'lambda_l2': 10,

'subsample': 0.75,

'colsample_bytree': 0.65,

'colsample_bylevel': 0.75,

'learning_rate': 0.01,

'tree_method': 'exact',

'seed': 2018,

'nthread': 12,

'silent': True

}

num_round = 8000

gbm = lgb.train(params,

train,

num_round,

verbose_eval=50,

valid_sets=[train,test]

)

preds_sub = gbm.predict(testt_feat)

#结果保存

submission['prediction_pay_price'] = preds_sub

name='lgb_'+nowTime+'.csv'

submission.to_csv(name, index=False)

#特征重要性

features = pd.DataFrame()

features['features'] = gbm.feature_name()

features['importance'] = gbm.feature_importance()

features.sort_values(by=['importance'],ascending=False,inplace=True)

版本2:岭回归(97分)

from sklearn.linear_model import Ridge

from scipy.sparse import coo_matrix

def offline_train():

train_feat = data[data['prediction_pay_price']> -1].fillna(0)

testt_feat = data[data['prediction_pay_price']

label_x = train_feat['prediction_pay_price']

label_y = testt_feat['prediction_pay_price']

submission = testt_feat[['user_id']]

train_feat = train_feat.drop('prediction_pay_price',axis=1)

testt_feat = testt_feat.drop('prediction_pay_price',axis=1)

train_feat = train_feat.drop('user_id',axis=1)

testt_feat = testt_feat.drop('user_id',axis=1)

train_feat = train_feat.drop('register_time',axis=1)

testt_feat = testt_feat.drop('register_time',axis=1)

offline_traindata = coo_matrix(train_feat)

offline_testdata = coo_matrix(testt_feat)

print(offline_traindata.shape[0], offline_testdata.shape[0])

clf = Ridge()

model = clf.fit(offline_traindata, label_x)

res = model.predict(offline_testdata)

submission['prediction_pay_price'] = res

offline_train()

name='Ridge_'+nowTime+'.csv'

submission.to_csv(name, index=False)

ID: Python_R_wu

Python或R学习

ID:Python_R_wu

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180707G0EOB800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券