【Kaggle纽约出租车车程用时预测实战(5)】XGBOOST训练模型预测结果

1. 数据准备及划分

上一步已经完成了数据独热编码的转化,接下来就需要把处理的数据添加到训练和测试数据集中,同时再去掉不需要的数据(上面去掉的都是分类数据,这里去掉的是连续数据)

1) 加载训练数据

Train_Master = pd.concat([train,
                          vendor_train,
                          store_and_fwd_flag_train,
                          cluster_pickup_train,
                          cluster_dropoff_train,
                         month_train,
#                          dom_train,
#                           hour_train,
                          hour_cate_train,
                          dow_train
                         ], axis=1)

2) 加载测试数据

Test_master = pd.concat([test, 
                         vendor_test,
                         store_and_fwd_flag_test,
                         cluster_pickup_test,
                         cluster_dropoff_test,
                         month_test,
#                          dom_test,
#                           hour_test,
                         hour_cate_test,
                          dow_test
                        ], axis=1)

3) 删除干扰数据

Train_Master = Train_Master.drop(['pickup_datetime'],axis = 1)
Test_master = Test_master.drop(['pickup_datetime'],axis = 1)
#这里是连续变量,因为前面已经进行细化的分解成天月小时,这里就可以进行数据的删除了

4) 数据划分

① 留出法划分数据

也就是之前的留出法,这里不是使用7:3,而是使用了0.01(百分之一的数据),因为数据的样本约有1500000条数据,那么百分之一的数据就有15000条了

Train, Test = train_test_split(Train_Master, test_size = 0.01)

② 接着就是提取自变量和因变量(因变量即是标签)

注意一下这个Test和上面Test_master之间的区别,首先Test数据是从Train_Master数据集里面划分出去的,大约有15000条数据,拥有训练数据中所有的特征,用来检测模型是否过拟合或者满足要求;而Test_master是要上交比赛的结果,里面是没有标签值的,这部分的数据就是来检验模型的,最终根据模型的结果给项目打分

X_train = Train.drop(['log_trip_duration'], axis=1)
#提取训练数据自变量
Y_train = Train["log_trip_duration"]
#提取训练数据因变量
X_test = Test.drop(['log_trip_duration'], axis=1)
#提取测试数据自变量
Y_test = Test["log_trip_duration"]
#提取测试数据因变量

Y_test = Y_test.reset_index().drop('index',axis = 1)
Y_train = Y_train.reset_index().drop('index',axis = 1)
#重新进行索引顺序
2. 加载模型和模拟

① 加载模型,放入相关数据

dtrain = xgb.DMatrix(X_train, label=Y_train)
#放入训练数据
dvalid = xgb.DMatrix(X_test, label=Y_test)
#放入测试数据
dtest = xgb.DMatrix(Test_master)
#放入最终的检测数据(前面已经讲清楚了)

② 参数调节

扫描二维码关注公众号,回复: 11155198 查看本文章
xgb_pars = {
    'objective':          'reg:linear',
    'learning_rate':      0.05,
    'max_depth':          7,
    'subsample':          0.8,
    'colsample_bytree':   0.7,
    'colsample_bylevel':  0.7,
    'silent':             1,
    'reg_alpha':          1,
}

③ 模型拟合

watchlist = [(dtrain, 'train'), (dvalid, 'valid')]
#设置观测对象
model = xgb.train(xgb_pars, dtrain, 500, watchlist, early_stopping_rounds=5,
      maximize=False, verbose_eval=1)
print('Modeling RMSLE %.5f' % model.best_score)

–> 输出的结果为:(可以看出本来应该运行500次的,但是实际上只运行了344步,原因就在于early_stopping_rounds=5参数的设定,也就是当连续五次模型没有改进的时候就停止运行,所以最后输出来的Best iteration就是第339次的结果,这期间验证集的分数是一直比测试集的分数要低的,所以不用担心过拟合的现象)
在这里插入图片描述

3. 模型结果
fscores = model.get_fscore()
#top_50_list = sorted(fscores, key=fscores.get, reverse=True)[:50]
#比如获得前50个特征的排序

xgb.plot_importance(model, max_num_features=70, height=0.9)
#前70特征值绘制条状图

–> 输出的结果为:(特征数据经过独热编码后就变多了)
在这里插入图片描述
图形放大部分展示(可以看出上车时间和下车的地点、行程距离及乘车地点等特征具有很强的重要性)
在这里插入图片描述

4. 模型预测
pred = model.predict(dtest)
pred = np.exp(pred) - 1
#按照比赛的规则记性预测结果输出

最后进行结果提交

submission = pd.concat([Test_id, pd.DataFrame(pred)], axis=1)
#这里的Test_id就是之前在删除之前保留的数据
submission.columns = ['id','trip_duration']
#按照要求提交保留的数据
submission['trip_duration'] = submission.apply(lambda x : 1 if (x['trip_duration'] <= 0) else x['trip_duration'], axis = 1)
submission.to_csv("submission.csv", index=False)
#如果是小于0的话就当做0来处理log(0)也就是1了,最后生成csv文件就可以提交了
原创文章 159 获赞 93 访问量 4万+

猜你喜欢

转载自blog.csdn.net/lys_828/article/details/105029579