Datawhale 2024 年 AI 夏令营||入门lightgbm,开始特征工程
1.目标
-
使用数据集绘制柱状图和折线图,
-
使用时间序列数据构建历史平移特征和窗口统计特征,
-
使用lightgbm模型进行训练并预测。
2.
特征工程,作为机器学习项目中的核心环节之一,不仅深刻影响着模型性能的优劣,更是区分顶尖参赛者与普通参赛者的关键所在。它不仅仅是对现有数据的简单处理或转换,而是一门艺术与科学的结合,要求从业者具备深厚的领域知识、敏锐的洞察力和创新的思维方式。
数据与特征的重要性
“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。”这句话深刻地揭示了特征工程在机器学习中的核心地位。数据的质量、丰富度以及特征的有效性直接决定了模型能够学习到的信息量和复杂度,从而限定了模型性能的理论极限。即使是最先进的算法,如果缺乏高质量的特征支撑,也难以发挥出其应有的潜力。相反,通过精心的特征设计,即便是相对简单的模型,也能在特定问题上取得令人瞩目的效果。
特征工程的步骤
-
数据探索与理解:这是特征工程的起点,通过统计描述、可视化等手段,深入理解数据的分布、缺失情况、异常值等,为后续的特征选择和转换奠定基础。
-
特征选择:从原始特征集中筛选出对预测目标最有价值的特征。这可以通过相关性分析、卡方检验、互信息等方法实现,旨在减少模型的复杂度,提高训练效率和泛化能力。
-
特征构造:基于领域知识和对数据的深入理解,通过数学变换、组合、聚合等方式,创造出新的、更富表达力的特征。这一过程往往依赖于对业务逻辑的深刻理解和对数据内在关系的敏锐洞察。
-
特征缩放与标准化:为了确保不同量纲和分布的特征在模型中能够公平比较,需要对特征进行缩放或标准化处理。这有助于提升模型的收敛速度和稳定性。
-
特征编码:对于分类特征,需要通过独热编码、标签编码等方式进行数值化,以便模型能够处理。
特征工程的创新
在机器学习竞赛中,特征工程的创新往往成为获胜的关键。参赛者不仅需要运用现有的特征工程技巧,还需要结合具体问题的特点,创造性地设计出新的特征。这种创新可能来源于对业务逻辑的深入理解,也可能来自于对数据内在规律的独到发现。
总之,特征工程是机器学习项目中不可或缺的一环,它要求从业者既要有扎实的理论基础,又要有丰富的实践经验;既要能深入理解业务逻辑,又要能敏锐捕捉数据中的微妙变化。通过不断地探索和实践,我们可以在特征工程这条道路上越走越远,为机器学习模型性能的提升贡献更多的力量。
3.机器学习项目主要步骤的详细扩写
在利用机器学习模型解决实际问题的过程中,遵循一系列系统而有序的步骤是至关重要的。这些步骤不仅帮助确保项目的顺利进行,还能有效提升模型的性能和可靠性。以下是对主要步骤的详细扩写:
1. 探索性数据分析(Exploratory Data Analysis, EDA)
探索性数据分析是机器学习项目的起点,它涉及对原始数据的深入探索和可视化。在这一阶段,数据分析师或数据科学家会运用统计方法和可视化工具(如直方图、散点图、箱线图等)来揭示数据的分布、趋势、异常值以及变量之间的关系。EDA的目标是增进对数据集的理解,为后续的数据预处理和特征工程提供指导。
2. 数据预处理(Data Preprocessing)
数据预处理是机器学习项目中至关重要的一步,它直接影响到模型的性能。预处理工作包括但不限于数据清洗(如处理缺失值、异常值)、数据转换(如编码分类变量、缩放数值变量)、数据集成(合并多个数据源)以及数据规约(减少数据集的维度或样本量)。通过这些步骤,可以确保输入到模型中的数据是干净、一致且适合分析的。
3. 特征提取与工程(Feature Extraction & Engineering)
特征提取与工程是构建有效机器学习模型的关键。在这一阶段,需要根据业务需求和问题特点,从原始数据中提取出对预测目标有影响的特征。这可能需要结合领域知识、数据探索的结果以及实验性的尝试。特征工程还包括对特征的进一步处理,如特征选择(减少冗余特征)、特征构造(创造新特征)和特征变换(如PCA降维、多项式特征等),以增强模型的学习能力。
4. 切分训练集与验证集(Splitting into Training and Validation Sets)
为了评估模型的性能并防止过拟合,需要将数据集切分为训练集和验证集(有时还包括测试集)。训练集用于训练模型,而验证集则用于调整模型参数和评估模型性能。通过交叉验证等技术,可以进一步提高模型评估的准确性和稳定性。
5. 训练模型(Model Training)
在准备好数据并选择了合适的机器学习算法后,就可以开始训练模型了。训练过程涉及使用训练集数据来优化模型的参数,使模型能够准确预测目标变量。训练过程中需要监控模型的性能指标,如准确率、召回率、F1分数等,以评估模型的性能。
6. 预测与评估(Prediction & Evaluation)
完成模型训练后,就可以使用验证集或测试集来评估模型的性能了。评估过程包括使用模型对未见过的数据进行预测,并计算性能指标以衡量模型的准确性、泛化能力等。根据评估结果,可以对模型进行进一步的调整和优化。
4.
GBDT
GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。
GBDT不仅在工业界应用广泛,通常被用于多分类、点击率预测、搜索排序等任务;在各种数据挖掘竞赛中也是致命武器,据统计Kaggle上的比赛有一半以上的冠军方案都是基于GBDT。
LightGBM
LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。
LightGBM 框架中还包括随机森林和逻辑回归等模型。通常应用于二分类、多分类和排序等场景。
例如:在个性化商品推荐场景中,通常需要做点击预估模型。使用用户过往的行为(点击、曝光未点击、购买等)作为训练数据,来预测用户点击或购买的概率。根据用户行为和用户属性提取一些特征,包括:
-
类别特征(Categorical Feature):字符串类型,如性别(男/女)。
-
物品类型:服饰、玩具和电子等。
-
数值特征(Numrical Feature):整型或浮点型,如用户活跃度或商品价格等。
5.完整代码
import numpy as np # 导入NumPy库,用于数值计算
import lightgbm as lgb # 导入LightGBM库,用于构建梯度提升树模型
import pandas as pd # 导入Pandas库,用于数据处理
from sklearn.metrics import mean_squared_log_error, mean_absolute_error, mean_squared_error # 导入一些评估指标
import tqdm # 导入tqdm库,用于显示进度条
import sys # 导入sys库,用于访问与Python解释器交互的变量
import os # 导入os库,用于操作系统功能
import gc # 导入gc库,用于垃圾回收
import argparse # 导入argparse库,用于解析命令行参数
import warnings # 导入warnings库,用于警告信息处理
warnings.filterwarnings('ignore') # 忽略警告信息
from lightgbm import log_evaluation, early_stopping # 从LightGBM导入日志记录和早停功能
# 2. 读取训练集和测试集
# 使用 read_csv() 函数从文件中读取训练集数据,文件名为 'train.csv'
train = pd.read_csv('./data/data283931/train.csv')
# 使用 read_csv() 函数从文件中读取测试集数据,文件名为 'test.csv'
test = pd.read_csv('./data/data283931/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']] # 列出训练集中的特征列
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', # 使用GBDT作为提升方法
'objective': 'regression', # 目标是回归
'metric': 'mse', # 使用均方误差作为评估指标
'min_child_weight': 5, # 最小子权重
'num_leaves': 2 ** 5, # 叶子节点数
'lambda_l2': 10, # L2正则化参数
'feature_fraction': 0.8, # 特征抽样比例
'bagging_fraction': 0.8, # 样本抽样比例
'bagging_freq': 4, # 抽样频率
'learning_rate': 0.05, # 学习率
'num_threads': 4, # 使用的线程数
'seed': 2024, # 随机种子
'verbose' : -1, # 日志输出级别
}
# 训练模型
model = lgb.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix],
categorical_feature=[], callbacks=[log_evaluation(period = 100), early_stopping(stopping_rounds=100)])
# 验证集和测试集结果预测
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_y, val_pred) # 计算均方误差
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) # 将结果保存到CSV文件
使用LightGBM训练一个回归模型,预测电力需求。它首先读取训练集和测试集数据,然后生成一些特征(如历史平移和窗口统计),接着切分数据为训练集和验证集,并训练模型。最后,它预测验证集和测试集的结果,并将测试集的预测结果保存到一个CSV文件中。
6.运行结果
7.
特征工程
这里主要构建了 历史平移特征 和 窗口统计特征
特征工程是机器学习中的一个关键步骤,它涉及到从原始数据中创建新的特征或修改现有特征,以提高模型的性能。在您提供的代码中,特征工程主要关注了两种类型的特征:历史平移特征和窗口统计特征。以下是对这两种特征的介绍:
### 历史平移特征(Lagged Features)
历史平移特征是一种时间序列特征,它基于过去的观察结果来预测未来的事件。在预测问题中,特别是当目标变量依赖于其自身过去的值时,这些特征尤其有用。以下是历史平移特征的一些关键点:
- **定义**:历史平移特征是通过将目标变量的先前值沿时间轴“平移”来创建的。例如,如果目标变量是明天的电力需求,历史平移特征可能包括昨天、前天或过去一周的电力需求。
- **目的**:这些特征使模型能够学习目标变量随时间变化的模式,从而提高预测的准确性。
- **实现**:在代码中,通过`data.groupby(['id'])['target'].shift(i)`实现,其中`i`是平移的天数。这将为每个`id`(可能是房屋或其他实体)生成一个新列,该列包含目标变量的过去值。
- **应用**:在电力需求预测中,历史平移特征可以帮助模型识别出一天中不同时间的电力使用模式,比如早晨、中午或晚上的高峰时段。
### 窗口统计特征(Window Statistics Features)
窗口统计特征是从固定大小的数据窗口计算得出的统计量,用于捕捉目标变量在一段时间内的行为。这些特征对于理解目标变量的波动性和趋势非常有用。以下是窗口统计特征的一些关键点:
- **定义**:窗口统计特征通常包括平均值、中位数、最大值、最小值、标准差等统计量,这些量是从目标变量的一个固定时间窗口计算得出的。
- **目的**:这些特征提供了目标变量在特定时间窗口内的行为摘要,有助于模型识别出周期性模式或异常值。
- **实现**:在代码中,通过`data[f'win3_mean_target'] = (data['last10_target'] + data['last11_target'] + data['last12_target']) / 3`实现,这里计算了一个包含最近三天目标变量值的简单移动平均值。
- **应用**:在电力需求预测中,窗口统计特征可以帮助模型识别出短期内的需求趋势,比如需求是否在增加或减少,以及需求变化的稳定性。
### 特征工程的重要性
特征工程对于构建一个有效的预测模型至关重要。良好的特征工程可以:
- **提高模型的准确性**:通过提供更多相关信息,帮助模型更好地理解数据中的模式。
- **减少模型的复杂性**:有时,通过特征工程可以减少模型需要学习的参数数量,从而简化模型。
- **提高模型的泛化能力**:合适的特征可以减少模型过拟合训练数据的风险,提高其在新数据上的预测性能。
### 结合历史平移和窗口统计特征
在实际应用中,历史平移特征和窗口统计特征往往结合使用,以提供对目标变量行为的全面理解。例如,在电力需求预测中,模型可能同时使用过去几天的需求数据(历史平移特征)和这些天的需求平均值(窗口统计特征),来预测未来的电力使用情况。
### 结论
特征工程是一个创造性和迭代的过程,需要对数据和领域知识有深入的理解。通过精心设计的特征,可以显著提升机器学习模型的性能。在您的项目中,历史平移特征和窗口统计特征的构建是一个很好的起点,但可能还需要进一步探索其他类型的特征,如季节性特征、节假日效应、天气条件等,以充分利用所有可用信息。