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)
#放入最终的检测数据(前面已经讲清楚了)
② 参数调节
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文件就可以提交了