task02
Task2 版本教程将使用机器学习模型解决本次问题,模型使用简单,数据不需要过多预处理;
使用机器学习方法一般主要需要从 获取数据&增强、特征提取和模型 三个方面下手。
-
使用机器学习方法有哪几个步骤?
一般的使用机器学习模型解决问题的主要步骤为探索性数据分析、数据预处理、提取特征、切分训练集与验证集、训练模型、预测结果。
特征
这里主要构建了 历史平移特征 和 窗口统计特征;每种特征都是有理可据的,具体说明如下:
-
**历史平移特征:**通过历史平移获取上个阶段的信息;如下图所示,可以将d-1时间的信息给到d时间,d时间信息给到d+1时间,这样就实现了平移一个单位的特征构建。
-
**窗口统计特征:**窗口统计可以构建不同的窗口大小,然后基于窗口范围进统计均值、最大值、最小值、中位数、方差的信息,可以反映最近阶段数据的变化情况。如下图所示,可以将d时刻之前的三个时间单位的信息进行统计构建特征给我d时刻。
模型
选择使用Lightgbm模型,也是通常作为数据挖掘比赛的基线模型,在不需要过程调参的情况的也能得到比较稳定的分数。另外需要注意的是,训练集和验证集的构建,因为数据存在时序关系,所以严格按照时序进行切分,这里选择原始给出训练数据集dt为30之后作为训练数据,之前的数据作为验证数据,这样保证了数据不存在穿越问题(不使用未来数据预测历史数据)。
error
def time_model(lgb, train_df, test_df, cols):# 训练集和验证集切分trn_x, trn_y = train_df[train_df.dt>=31][cols], train_df[train_df.dt>=31]['target']val_x, val_y = train_df[train_df.dt<=30][cols], train_df[train_df.dt<=30]['target']# 构建模型输入数据train_matrix = lgb.Dataset(trn_x, label=trn_y)valid_matrix = lgb.Dataset(val_x, label=val_y)# lightgbm参数lgb_params = {'boosting_type': 'gbdt','objective': 'regression','metric': 'mse','min_child_weight': 5,'num_leaves': 2 ** 5,'lambda_l2': 10,'feature_fraction': 0.8,'bagging_fraction': 0.8,'bagging_freq': 4,'learning_rate': 0.05,'seed': 2024,'nthread' : 16,'verbose' : -1,}# 训练模型model = lgb.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix], categorical_feature=[], verbose_eval=500, early_stopping_rounds=500)# 验证集和测试集结果预测val_pred = model.predict(val_x, num_iteration=model.best_iteration)test_pred = model.predict(test_df[cols], num_iteration=model.best_iteration)# 离线分数评估score = mean_squared_error(val_pred, val_y)print(score)return val_pred, test_predlgb_oof, lgb_test = time_model(lgb, train, test, train_cols)# 保存结果文件到本地
test['target'] = lgb_test
test[['id','dt','target']].to_csv('submit.csv', index=None)
调用lightgbm库,设置了早停轮次“early_stopping_rounds”参数和打印log间隔“verbose_eval”参数后出现UserWarning。
或者提示TypeError: fit() got an unexpected keyword argument ‘early_stopping_rounds‘。
解决方法:参考 https://blog.csdn.net/weixin_51723388/article/details/124578560
因为lightgbm packages升级了,一些功能或者效果上有所区别。(后续具体分析)
import lightgbmcv_results = lightgbm.cv(metrics='auc',###early_stopping_rounds=30, verbose_eval=True ###)