2019中国银联高校极客挑战赛-数据建模

2019中国银联数据建模

  • 赛题
    • code

大赛地址: https://college.upaas.unionpay.com/upgeek-web/user/login

第一次参加这样的竞赛,用xgboost写的baseline先占坑后续再写。

赛题

本次大赛基于脱敏和采样后的约 40,000 条用户消费行为数据,预测在未来的一段时间内,用户对于某产品是否会有购买和收藏的行为。
参赛团队需要设计相应的算法进行数据分析和处理,比赛结果按照指定的评价指标使用在线评测数据进行评测和排名,得分最优者获胜。

code

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import log_loss
import numpy as np
import xgboost as xgb
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_predict
import lightgbm as lgb
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt

# 加载数据
def load_csv():
    train = pd.read_csv('/home/kesci/input/round11379/train_round_1.csv')
    test = pd.read_csv('/home/kesci/input/round11379/test_round_1.csv')
    train.fillna(-1, inplace=True)
    test.fillna(-1, inplace=True)
    return train,test

# xgboost模型
def xgb_model(train,test):
    train_x = train.drop(['user_id','Product_id','seller','favorite','purchase'],axis=1)
    # print(train_x.feature_importances_)
    train_y_favorite = train['favorite'].values
    train_y_purchase = train['purchase'].values
    test_x = test.drop(['user_id','Product_id','seller'],axis=1)
    test_x = test_x[train_x.columns.values].values

    xgb_train_favorite = xgb.DMatrix(train_x.values, label=train_y_favorite)
    xgb_train_purchase = xgb.DMatrix(train_x.values, label=train_y_purchase)
    
    xgb_test= xgb.DMatrix(test_x)

    params = {'booster': 'gbtree',
              'objective': 'rank:pairwise',  # 二分类的问题
              # 'gamma':0.1,  # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。
              'max_depth': 7,  # 构建树的深度,越大越容易过拟合
              # 'lambda':2,  # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
              'subsample': 0.75,  # 随机采样训练样本
              'colsample_bytree': 0.75,  # 生成树时进行的列采样
              'min_child_weight': 3,
              # 这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言
              # ,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
              # 这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
              'silent': 0,  # 设置成1则没有运行信息输出,最好是设置为0.
              'eta': 0.03,  # 如同学习率
              'nthread': 7,  # cpu 线程数
              'eval_metric': 'auc'  # 评价方式
              }

    plst = list(params.items())
    num_iterations = 200  # 迭代次数
    watchlist1 = [(xgb_train_favorite, 'train_favorite')]
    watchlist2 = [(xgb_train_purchase, 'train_purchase')]
    # early_stopping_rounds    当设置的迭代次数较大时,early_stopping_rounds 可在一定的迭代次数内准确率没有提升就停止训练
    favorite = xgb.train(plst, xgb_train_favorite, num_iterations, watchlist1)
    purchase = xgb.train(plst, xgb_train_purchase, num_iterations, watchlist2)
    pred_favorite = favorite.predict(xgb_test)
    pred_purchase = purchase.predict(xgb_test)

    return pred_favorite, pred_purchase

# 生成结果
def gene_result(pred_favorite, pred_purchase,test_range):
    tess = test_range[['user_id','Product_id']]
    tess.rename(columns={'Product_id':'product_id'}, inplace = True)
    a = pd.DataFrame(pred_favorite, columns=['pred_favorite'])
    b = pd.DataFrame(pred_purchase, columns=['pred_purchase'])
    res = pd.concat([tess[['user_id','product_id']],b['pred_purchase'],a['pred_favorite']],axis=1)
    res.to_csv("/home/kesci/work/test_result.csv", index=None)#不保存行索引

#主函数
def main():
    train,test = load_csv()
    # train.head()
    # test.head()
    # xgb模型
    pred_favorite, pred_purchase = xgb_model(train,test)
    gene_result(pred_favorite, pred_purchase, test)
    print("success")

main()

好不容易有个结果了,但是想进复试还得加油上分呀。

你可能感兴趣的:(竞赛)