引言
本次学习笔记将讨论机器学习中回归预测问题的常见思路和实践方式。我们将探讨常见问题解决思路、机器学习方法的关键步骤,以及深入了解一种流行的机器学习模型——LightGBM。
常见问题解决思路
回归预测问题的常见思路主要涉及使用机器学习和深度学习模型。为取得不错效果,通常的思路包括以下几点:
- 使用机器学习模型,如LightGBM、XGBoost等。
- 使用深度学习模型(神经网络等)进行实践。
- 模型的搭建相对复杂,需构建模型结构,对数值数据进行标准化处理。
Task2 版本的教程思路
Task2 版本教程将使用机器学习模型来解决回归预测问题。这里的关键优势在于使用简单的机器学习方法,而无需进行过多的数据预处理。
使用机器学习方法的关键步骤
在使用机器学习模型解决问题时,通常需要遵循以下主要步骤:
- 探索性数据分析
- 数据预处理
- 特征提取
- 切分训练集与验证集
- 模型训练
- 结果预测
基础概念入门
GBDT(Gradient Boosting Decision Tree)
GBDT是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型。该模型具有训练效果好、不易过拟合等优点。在工业界和数据挖掘竞赛中都广泛应用,常用于多分类、点击率预测、搜索排序等任务。
LightGBM
LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,具有高效率的并行训练、更快的训练速度、更低的内存消耗、更好的准确率等优点。通常应用于二分类、多分类和排序等场景。
进阶代码详解
在进阶代码示例中,我们看到了完整的代码流程,包括导入模块、探索性数据分析(EDA)、特征工程、模型训练与测试集预测。这让我们更清楚地理解了机器学习方法的实际应用过程。
导入模块
在此部分,我们引入了所需的模块,其中包括了NumPy、Pandas、LightGBM等常用模块。
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.metrics import mean_squared_log_error, mean_absolute_error, mean_squared_error
import tqdm
import sys
import os
import gc
import argparse
import warnings
warnings.filterwarnings('ignore')
探索性数据分析(EDA)
探索性数据分析是数据准备阶段的关键一步,通过读取训练数据和测试数据,并进行基本的数据展示,有助于我们对数据有初步的了解。
train = pd.read_csv('./data/train.csv')
test = pd.read_csv('./data/test.csv')
特征工程
在特征工程部分,我们实现了历史平移特征和窗口统计特征的构建。这些特征是基于合理的推论,通过特征工程的方式对数据进行深度挖掘。
# 合并训练数据和测试数据,并进行排序
data = pd.concat([test, train], axis=0, ignore_index=True)
data = data.sort_values(['id','dt'], ascending=False).reset_index(drop=True)
# 历史平移
for i in range(10,30):
data[f'last{i}_target'] = data.groupby(['id'])['target'].shift(i)
# 窗口统计
data[f'win3_mean_target'] = (data['last10_target'] + data['last11_target'] + data['last12_target']) / 3
# 进行数据切分
train = data[data.target.notnull()].reset_index(drop=True)
test = data[data.target.isnull()].reset_index(drop=True)
# 确定输入特征
train_cols = [f for f in data.columns if f not in ['id','target']]
模型训练与测试集预测
最后,我们选择使用LightGBM模型进行训练,并严格按照时序进行训练集和验证集的切分。这样保证了数据不存在穿越问题,即不使用未来数据预测历史数据。
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_pred
lgb_oof, lgb_test = time_model(lgb, train, test, train_cols)
# 保存结果文件到本地
test['target'] = lgb_test
test[['id','dt','target']].to_csv('submit.csv', index=None)