第一次参加这样的竞赛,用xgboost写的baseline先占坑后续再写。
本次大赛基于脱敏和采样后的约 40,000 条用户消费行为数据,预测在未来的一段时间内,用户对于某产品是否会有购买和收藏的行为。
参赛团队需要设计相应的算法进行数据分析和处理,比赛结果按照指定的评价指标使用在线评测数据进行评测和排名,得分最优者获胜。
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()
好不容易有个结果了,但是想进复试还得加油上分呀。