開源5個版本basline|遊戲玩家付費金額預測大賽
這幾天恰好有空,嘗試了幾種方案,但是分數都比較低,在這裡分享下,給大家提供些參考,比較粗糙,大神就不要看了。包括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<0,0,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特徵繪圖
xgb.plot.importance(importance[1:20,])
-------------------------------------------------------------------------------------------------
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]<=-1].fillna(0)
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
nowTime=datetime.datetime.now().strftime(%m%d%H%M)#現在
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]<=-1].fillna(0)
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()
nowTime=datetime.datetime.now().strftime(%m%d%H%M)#現在
name=Ridge_+nowTime+.csv
submission.to_csv(name, index=False)
公眾號:Python或R人工智慧學習
ID: Python_R_wu
推薦閱讀:
※歸屬於玩家的浪漫故事,那些改變遊戲的「世界事件」
※氪金不讓鬚眉,女性玩家或成手游市場未來增量
※SpaceX項目的兩艘回收船到底是在向誰致敬?
※生活總會讓你貓車,而你大多數時間只能平砍
※「玩遊戲的人」警察·冬瓜