lightgbm 入门(下)【Datawhale AI夏令营】

lightgbm 入门(下)【Datawhale AI夏令营】

一、前述

嗨嗨嗨,家人们我又回来了!假期里大家一定要劳逸结合吼!回归正题,我们来进行 lightgbm 入门(下)的学习。 lightgbm 入门(上)以及【Task2:入门lightgbm,开始特征工程】的链接我将会放到下面以方便大家使用嘞,祝大家学习愉快~

lightgbm 入门(上)链接lightgbm 入门(上)【Datawhale AI夏令营】

【Task2:入门lightgbm,开始特征工程】链接Task2:入门lightgbm,开始特征工程

二、特征工程

1.什么是特征工程

在机器学习领域,特征工程是连接原始数据与高效机器学习模型的桥梁,我们在训练机器学习模型中特征工程用于提升模型的性能和预测精度。系统官方的来说,特征工程是一个涵盖数据采集、数据预处理、特征选择和降维技术的完整过程。

特征工程作用简述:

  • 提高预测准确性:特征工程可通过移除不相关或冗余的特征来进行模型的降维,同时减少了过拟合的风险;同时可通过适当的特征转换方式如归一化等方法确保模型不受特定量纲的影响,使各特征在同一尺度上进行比较。
  • 减少模型训练时间:降维 --> 有效的减少模型训练的好方法
  • 增强模型可解释性:通过特征工程构建的新特征可以提供对模型决策的更深入洞察(特征工程belike元数据,即数据的数据,是在原始数据的基础上进行总结、转换等的出来的新数据,比如数据中的均值、总和等就是元数据的感觉),比如通过特征工程的一些方法可以使得类别型的数据在数值模型中进行使用,它们将类别特征转换为模型可理解的格式,同时保留了特征的可解释性。
  • 适应不同模型要求:某些机器学习模型对数据的分布有严格要求,例如,线性模型常常假设特征服从正态分布。通过标准化和归一化等特征变换,可以使数据满足这些模型的前提假设,从而发挥最佳性能;对于某些特定的机器学习任务也可以通过特征模型直接提取出有意义的特征,并可直接适应于相应的模型架构。

特征工程不止包括下面我们这次学习用到的两种方法,它包括数据预处理、时间戳处理、分解类别属性、分箱、交叉特征、特征选择和特征缩放等方面,我将在下面贴上我学习时看的博客链接这个文章中有实现特征工程中特征转化中具体的实现公式及代码,想详细进行了解的同学可以去看一看嘞~

链接:什么是特征工程?如何进行特征工程?

下面我们来详细看一看学习中涉及到的两种方法嘞。

2.笔记中历史平移特征和窗口统计特征代码详解

原文中关于历史平移特征和窗口统计特征的说明都很详细并且配合着相应的图片很方便进行理解,所以这里我将不再赘述,主要进行代码的详细注释。

因为我有一些python上的基础,所以涉及到一些比较基础的函数及定义比如sort排序、groupby分组以及咱们主要用到的数组类型的使用及需注意方面不会大篇幅地进行讲解嘞,但是在对源代码进行注释的时候会完完全全地进行解释,包括函数的作用,想要进行更详细了解的同学可以通过csdn或者一些其他的学习平台进行了解嘞~都是有比较系统全面的讲解嘞,这里我就不班门弄斧啦。

源代码及注释:

# 合并训练数据和测试数据,并进行排序
data = pd.concat([test, train], axis=0, ignore_index=True)
# 将test和train两个数据框按行拼接,忽略原来的索引,重新生成新的索引
data = data.sort_values(['id','dt'], ascending=False).reset_index(drop=True)
# 对拼接后的数据框按照'id'和'dt'列进行降序排序,并重置索引

# 历史平移
for i in range(10,30):
    data[f'last{i}_target'] = data.groupby(['id'])['target'].shift(i)
# 遍历10到30之间的整数,为每个整数创建一个新列,列名为'last{i}_target'
# 该列的值是按照'id'分组后,'target'列向上移动i个位置的值(即实现上面历史平移所示图的效果)
    
# 窗口统计
data[f'win3_mean_target'] = (data['last10_target'] + data['last11_target'] + data['last12_target']) / 3
# 3个一框求其平均值

# 进行数据切分
train = data[data.target.notnull()].reset_index(drop=True)
# 从拼接后的数据框中筛选出包含非空目标值的行,作为训练集,并将其重新赋予给train这个索引
test = data[data.target.isnull()].reset_index(drop=True)
# 跟上面差不多,只不过test测试集中筛选出来的是包含空目标值的行

# 确定输入特征
train_cols = [f for f in data.columns if f not in ['id','target']]
# 创建一个列表,包含除'id'和'target'之外的所有列名,用于后续的特征工程或模型训练

三、模型训练与测试集预测

1.源代码详解

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']
    #根据时间戳(dt)进行筛选,时间戳大于等于31天的数据作为训练集
    val_x, val_y = train_df[train_df.dt<=30][cols], train_df[train_df.dt<=30]['target']
    #小于等于30天的数据作为验证集
    
    # 构建模型输入数据
    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,
    }#lgb参数的调整(内容过多,所以我放到下面来对每个参数进行大概的解释和了解)
    
    # 训练模型
    model = lgb.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix], 
                      categorical_feature=[], verbose_eval=500, early_stopping_rounds=500)
#使用LightGBM的train方法来训练模型。
         
    # 使用训练好的模型对验证集进行预测,并获取最佳迭代轮次下的预测结果
    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)
    # 计算验证集预测结果与真实目标之间的均方误差,并将结果存储在score这个变量中
        
    print(score)
    #打印
    
    return val_pred, test_pred
    #返回验证集和测试集的预测结果
    
lgb_oof, lgb_test = time_model(lgb, train, test, train_cols)
# 调用time_model函数,并传入相应的参数,以执行时间序列预测任务。函数返回的验证集和测试集预测结果分别赋值给lgb_oof和lgb_test

# 保存结果文件到本地
test['target'] = lgb_test
#将预测结果lgb_test添加到测试集test的目标列上
test[['id','dt','target']].to_csv('submit.csv', index=None)
#导出

2.lightgbm参数大致了解

放到这里大家只需要看一看大概知道每个参数主要是干什么用的就可以,不必要求完全记住,因为早晚会忘嘞(哭)只要用到了再来看一眼有个临时记忆就好嘞~用的多了就会自然而然地记住啦

为了方便看和对照将gb_params片段粘到下面:

 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,
    }

根据学习笔记以及task2的直播讲解中我们可知道该代码是使用LightGBM库进行梯度提升决策树(Gradient Boosting Decision Trees)模型训练的代码。下面是对每个gb_params参数的大致说明:

  • boosting_type: 指定所使用的梯度提升算法的类型。在task2中使用的是梯度提升决策树(Gradient Boosting Decision Tree)。

  • objective: 定义模型的学习目标。'regression’表示这是一个回归问题,即模型的目标是预测连续值。

  • metric: 指定用于评估模型性能的指标。这里我们使用的是均方误差(Mean Squared Error,简称MSE)。

  • min_child_weight: 定义每个叶子节点最小样本权重和的阈值。权重和低于这个阈值的叶子节点将不会有更多的数据被划分出来。

  • num_leaves: 指定决策树的最大叶子节点数。这里的值为2的5次方=决策树最多可以有32个叶子节点。
    我们可以通过增加模型深度,减少叶节点个数来实现分裂时模型深度

  • lambda_l2: L2正则化项的权重。在梯度提升中,L2正则化用于控制模型的复杂度,防止过拟合。

  • feature_fraction: 特征比例,用于控制每次迭代时考虑的特征比例。这里是0.8,意味着每次迭代会考虑当前数据集的80%作为候选特征。

  • bagging_fraction: 同上,这也是一个特征比例参数,用于控制袋外(out-of-bag, OOB)数据的采样比例。OOB是指那些在构建每个子模型时被随机留下不参与训练的数据点。

  • bagging_freq: 指定在多少次迭代后,重新洗牌并重新采样数据。有助于提高模型的多样性和减少偏差。

  • learning_rate: 学习率,用于控制每次迭代中损失函数下降的步长。较低的学习率通常会导致更稳定的训练过程,但可能会增加迭代次数。

  • seed: 随机数种子,用于确保训练过程的可重复性。

  • nthread: 指定用于训练模型的线程数。增加此值可以利用多核CPU的优势加速训练过程。

  • verbose: 日志记录级别。设置为-1表示详细记录所有信息,包括训练过程中的警告和错误消息。 这些参数共同决定了梯度提升决策树的训练过程、模型结构以及最终的性能表现。通过调整这些参数,可以根据具体的问题和数据集优化模型的性能。

总结及反思

本来我是想着对代码中涉及到的机器学习的函数再单独拿出来进行学习了解,如 Dataset()、predict()等但是因为今天是task2笔记的DDL啦(痛,但是出来玩儿真好嘿嘿)光是进行上面的学习和整理我已经开始头晕了(默默蹲到角落流泪),但是机器学习本身东西就很多,一口吃成个大胖子太着急啦,我们一起慢慢来一步步地进行探索嘞,希望我们还能在下个文章继续相见嘿嘿,一起加油!同时欢迎大家对我的文章一些不太对地地方进行指正嘞,一起学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值