Datacastle算法竞赛-精品旅行服务成单预测-AUC:0.94+解决方案

29 篇文章 0 订阅
8 篇文章 0 订阅

Datacastle在前一段时间发布了一个算法竞赛-精品旅行服务成单预测。当时空闲时间比较多就报名参加了,后面为了赶论文进度没有继续做下去,最后的一次提交结果是0.94+的auc。共计提取了76个特征,分别使用了基于权重和stacking的模型融合方法,下面是对特征和模型的一些整理。
一、特征
1.基本信息:如用户性别,省份,年龄等。
2.历史订购信息:之前是否购买过精品,订购每种类型订单的比率。
3.历史订单信息:order 的 actionType 的最后一个 行为, 倒数第二个, 倒数第三个等(需要亲自试验);order所在城市(actionType一共有9个,其中1是唤醒app;2~4是浏览产品,无先后关系;5~9则是有先后关系的,从填写表单到提交订单再到最后支付。)
4.时间信息:用户actionType时间间隔均值,方差,最后一个值,最小值,倒数第二个、倒数第四个,最后三个时间间隔均值,最后三个时间间隔方差,距离最近的各个actionType的时间和时间间隔的均值、方差以及均值的最大值、最小值,均值乘以方差,还有当时采取各个action的时间是周几。
5.点击信息:用户点击各个type的次数占总次数的比例。
6.评论信息:用户的评分,评论的关键词个数,关键字长度(这个应该还可以加个情感分析的ヽ( ̄▽ ̄)و)。
7.用户行为:用户最后一个action距离最近的各个action间隔距离,各个行为占比。
值得注意的是,本次比赛对组合特征做的不够好,后来参考了竞赛圈其他同学分享的组合特征,如历史最后一次时间对应action中点击的什么,最后操作那一天 action 的count,用户actionType为5,6,7的平均时长,用户的评论是否在历史表中等,受益匪浅。
二、模型
最开始的时候使用了GradientBoostingRegressor,SVR,XGBRegressor三者按照3:3:4的比例进行的权重组合。后来为了提升预测效果,决定在模型方面下点功夫,参考了一个数据科学的工具包,加入stacking,贴一个使用方法,方面后续使用:

from heamy.dataset import Dataset
from heamy.estimator import Regressor, Classifier
from heamy.pipeline import ModelsPipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
from sklearn.neighbors import KNeighborsRegressor
from sklearn.ensemble import GradientBoostingRegressor
from xgboost import XGBRegressor
import pandas as pd
##事先将特征保存到文件中,比较重要,因为jupyter notebook随时会挂掉(⊙_⊙)
train = pd.read_csv('train_part_76_features.csv')
test = pd.read_csv('test_part_76_features.csv')
col = [c for c in train if c not in ['userid','label']]
X_train = train[col]
y_train = train['label'].values 
X_test = test[col]
"""
##使用基于距离的回归方法需要归一化
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train[col] = scaler.fit_transform(X_train)
X_test[col] = scaler.transform(X_test)#此处感谢批评区同学的指出,如果重新拟合分布会与训练集不一致~
"""
dataset = Dataset(X_train,y_train,X_test)
model_gbrt = Regressor(dataset=dataset, estimator=GradientBoostingRegressor, parameters={'learning_rate': 0.01,'random_state':3,'n_estimators':200\
                                                                         ,'subsample':0.8, 'max_depth' :20 },name='gbrt')
#GradientBoostingRegressor(learning_rate=0.2, random_state=3, n_estimators=200, subsample=0.8, 
#                      max_depth =10)
#model_knn =  Regressor(dataset=dataset, estimator=KNeighborsRegressor, parameters={'n_jobs': -1,'n_neighbors':3},name='knn')
# 
model_xgbr = Regressor(dataset=dataset, estimator=XGBRegressor, parameters={'learning_rate': 0.01,'random_state':3,'n_estimators':200\
                                                                        ,'subsample':0.8, 'objective': 'reg:linear','max_depth' :10},name='xgb')
#model_mlp =  Regressor(dataset=dataset, estimator=MLPRegressor, parameters={'hidden_layer_sizes': 10,'random_state':9},name='mlp')
# initialize RandomForest & LinearRegression
model_rf = Regressor(dataset=dataset, estimator=RandomForestRegressor, parameters={'n_estimators': 50},name='rf')
#model_lr = Regressor(dataset=dataset, estimator=LinearRegression, parameters={'normalize': True},name='lr')


# Stack two models
# Returns new dataset with out-of-fold predictions
pipeline = ModelsPipeline(model_rf,model_xgbr)
stack_ds = pipeline.stack(k=5,seed=9)

# Train LinearRegression on stacked data (second stage)
stacker = Regressor(dataset=stack_ds, estimator=LinearRegression)
results = stacker.predict()
# Validate results using 10 fold cross-validation
#results = stacker.validate(k=10,scorer=mean_absolute_error)

换用stacking方法并进行调参后分数相较于之前提高了大约10%。
完整代码位于:https://github.com/zoneplus/datacastle-travel-prediction。欢迎批评指正~

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值