Datawhale AI 夏令营:入门lightgbm,开始特征工程

一、使用LightGBM解决机器学习问题

1. 数据集的可视化分析

在机器学习的任务中,首先需要对数据集进行可视化分析,以理解数据的分布和特征。

  • 柱状图和折线图绘制
    • 使用Python中的matplotlib或者seaborn库绘制柱状图和折线图。
    • 柱状图用于展示类别型变量的分布或者计数统计。
    • 折线图通常用于展示时间序列数据的趋势变化。
2. 特征工程

特征工程是提升机器学习模型性能的关键步骤,特别是在时间序列数据中。

  • 历史平移特征:
    • 对于时间序列数据,可以构建历史平移特征,即将过去若干时间点的数据作为新的特征。
    • 例如,对于每个时间点,可以添加前一天、前一周或前一个月的特征值。
  • 窗口统计特征:
    • 通过定义窗口大小,计算在该窗口内的统计量,如均值、标准差、最大最小值等。
    • 这种方法能够捕捉数据的局部趋势和周期性。
3. 使用LightGBM模型进行训练和预测

LightGBM是一种高效的梯度提升框架,适用于各种机器学习任务,特别是大规模和高维度数据集。

  • 训练步骤:

准备数据集,包括特征工程后的数据。

定义模型参数,如学习率、树的数量、深度等。

使用交叉验证(cross-validation)来调优参数,防止过拟合。

  • 预测步骤:

使用训练好的模型对新数据进行预测。

可以根据具体问题调整阈值或者后处理方法来优化预测结果。

4. 深入学习和优化
  • 持续改进特征:

通过数据分析和领域知识不断改进特征工程,提高模型的预测能力。

  • 模型调优:

尝试不同的模型参数组合和特征选择策略,以提高模型的泛化能力和性能。

二、基本概念

GBDT

1. 模型概述

GBDT是一种集成学习方法,通过串行训练多棵决策树来逐步提升模型的预测能力。它的核心思想是结合多棵树的预测结果,从而获得比单棵树更好的泛化能力和预测精度。

  • 集成学习:通过结合多个弱分类器(决策树),GBDT能够减少偏差并提高模型的预测准确性。

  • 梯度提升:GBDT采用梯度提升方法,每棵新树的训练目标是减少之前模型的残差(或者对于某些损失函数,是负梯度)。

2. 应用领域和优势

GBDT在各个领域都有广泛的应用,并且在工业界和数据科学竞赛中都表现出色:

  • 工业应用

    • 多分类:适用于处理具有多个类别的分类问题,例如文本分类、图像分类等。
    • 点击率预测:在在线广告和推荐系统中,GBDT可以预测用户点击某个广告或推荐的概率。
    • 搜索排序:用于搜索引擎中,通过学习用户的点击模式和搜索行为来优化搜索结果的排序。
  • 竞赛应用

    • Kaggle竞赛:据统计,大量的Kaggle竞赛中的冠军方案都采用了GBDT作为核心模型,因其优秀的预测能力和鲁棒性。
3. 关键优点

GBDT相比其他机器学习模型具有多个显著优点:

  • 预测准确性高:通过集成多棵树的方法,GBDT能够有效地捕捉数据中的复杂关系,提升预测精度。
  • 不易过拟合:GBDT在训练过程中通过集成学习和梯度提升来逐步优化模型,减少了过拟合的风险。
  • 处理多种数据类型:适用于处理数值型、类别型和混合型数据,具有较好的通用性。 

LightGBM

1. 场景介绍

在个性化商品推荐场景中,通常需要构建点击预估模型来预测用户点击或购买某个商品的概率。这种模型能够通过分析用户的历史行为(点击、曝光但未点击、购买等),以及用户的属性特征来提供个性化的推荐服务。

2. 特征工程

在构建点击预估模型时,需要从用户行为和用户属性中提取合适的特征,包括:

  • 类别特征(Categorical Feature)

    • 字符串类型的特征,如性别(男/女)、用户地区等。
    • LightGBM能够直接处理类别特征,不需要进行额外的编码工作,因此可以直接将字符串特征作为输入。
  • 物品类型

    • 商品的类别信息,如服饰、玩具、电子产品等。
    • 这些信息可以帮助模型理解用户对不同类型商品的偏好和行为模式。
  • 数值特征(Numerical Feature)

    • 整型或浮点型的特征,例如用户的活跃度指标、商品的价格等。
    • 这些特征可以直接作为模型的输入,帮助模型更准确地预测用户的行为。
3. LightGBM模型的优势

LightGBM作为一个高效的梯度提升框架,在个性化推荐场景中具有以下优势:

  • 训练效率高

    • LightGBM支持高效率的并行训练,能够快速处理大规模数据集,适合处理海量的用户行为数据。
  • 内存消耗低

    • LightGBM设计了一些优化算法和数据结构,使得其在训练过程中内存消耗较低,能够处理大规模的特征空间。
  • 准确率高

    • 通过梯度提升和优化的训练策略,LightGBM能够提供比较高的预测精度,有效地捕捉用户的偏好和行为模式。
  • 支持多种模型

    • LightGBM不仅仅支持GBDT(梯度提升决策树),还支持随机森林和逻辑回归等模型,可以根据具体场景选择合适的模型。
4. 实践建议
  • 数据预处理

    • 在使用LightGBM之前,需要对数据进行适当的清洗和特征工程,确保数据质量和模型的效果。
  • 参数调优

    • LightGBM有许多参数可以调整,如学习率、树的数量、树的深度等,建议通过交叉验证来优化这些参数,以获得最佳的模型性能。
  • 模型评估

    • 使用合适的评估指标(如AUC、准确率、召回率等)来评估模型的预测效果,确保模型在实际应用中具有良好的性能。

 三、进阶代码

(1)导入模块

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')

(2)探索性数据分析(EDA)

train = pd.read_csv('./data/train.csv')
test = pd.read_csv('./data/test.csv')

数据简单介绍:

  • 其中id为房屋id,

  • dt为日标识,训练数据dt最小为11,不同id对应序列长度不同;

  • type为房屋类型,通常而言不同类型的房屋整体消耗存在比较大的差异;

  • target为实际电力消耗,也是我们的本次比赛的预测目标。

下面进行简单的可视化分析,帮助我们对数据有个简单的了解。

  • 不同type类型对应target的柱状图

import matplotlib.pyplot as plt
# 不同type类型对应target的柱状图
type_target_df = train.groupby('type')['target'].mean().reset_index()
plt.figure(figsize=(8, 4))
plt.bar(type_target_df['type'], type_target_df['target'], color=['blue', 'green'])
plt.xlabel('Type')
plt.ylabel('Average Target Value')
plt.title('Bar Chart of Target by Type')
plt.show()

 

  • id为00037f39cf的按dt为序列关于target的折线图

    specific_id_df = train[train['id'] == '00037f39cf']
    plt.figure(figsize=(10, 5))
    plt.plot(specific_id_df['dt'], specific_id_df['target'], marker='o', linestyle='-')
    plt.xlabel('DateTime')
    plt.ylabel('Target Value')
    plt.title("Line Chart of Target for ID '00037f39cf'")
    plt.show()

    (3)特征工程

历史平移特征(Lag Feature)

历史平移特征是指利用过去时间点的数据来构建新的特征。在时间序列数据或者具有时间关联的数据中,这种特征可以帮助模型捕捉数据的趋势和周期性。

  • 例子

    • 对于股票市场数据,可以构建过去几天的股价平移特征,如前一天、前两天、前一周等的收盘价或涨跌幅。
    • 对于销售数据,可以构建过去几个月的销售量平移特征,如前一个月、前三个月等的销售量统计。
  • 实现方法

    • 使用Python中的pandas库进行时间序列数据的处理和特征构建。
    • 可以通过移动窗口函数(rolling)或者手动定义滞后时间来创建历史平移特征。

 

窗口统计特征(Window Statistics)

窗口统计特征是通过定义一个滑动窗口来计算在该窗口内的统计量。这种特征可以帮助模型捕捉数据的局部统计特性和动态变化。

  • 例子

    • 滑动平均值:在每个时间点计算过去一周的平均销售量。
    • 滑动标准差:在每个时间点计算过去一个月的收盘价的标准差。
    • 滑动最大最小值:在每个时间点计算过去三天的最高和最低温度。
  • 实现方法

    • 使用pandas中的rolling函数结合统计函数(如mean、std、max、min等)来计算滑动窗口内的统计特征。
    • 可以根据具体问题和数据的周期性来选择窗口大小和统计函数。
# 合并训练数据和测试数据,并进行排序
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']]

 (4)模型训练与测试集预测

这里选择使用Lightgbm模型,也是通常作为数据挖掘比赛的基线模型,在不需要过程调参的情况的也能得到比较稳定的分数。

另外需要注意的训练集和验证集的构建:因为数据存在时序关系,所以需要严格按照时序进行切分,

  • 这里选择原始给出训练数据集中dt为30之后的数据作为训练数据,之前的数据作为验证数据

  • 这样保证了数据不存在穿越问题(不使用未来数据预测历史数据)

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)

四、总结

通过学习和实践,掌握了使用LightGBM解决机器学习问题的关键步骤和技巧。特征工程在机器学习竞赛中尤为重要,通过细致的数据分析和有效的特征构建,可以显著提升模型的效果。记住,数据和特征的质量决定了机器学习模型的上限,模型和算法只是逼近这个上限的工具。

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值