这几天恰好有空,尝试了几种方案,但是分数都比较低,在这里分享下,给大家提供些参考,比较粗糙,大神就不要看了。包括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
领取专属 10元无门槛券
私享最新 技术干货