赞
踩
示例题目:2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 (xfyun.cn)
时间序列问题是一类重要的统计和数据分析问题,它涉及对按时间顺序排列的数据点进行分析、建模和预测。时间序列数据是由一系列随时间变化而观测到的数值组成的,这些数据可以反映各种现象,如股票价格、气温变化、销售额、交通流量等。时间序列分析广泛应用于经济学、金融学、气象学、工程学、公共卫生学等众多领域。
时间依赖性:时间序列数据中的观测值之间存在时间上的依赖性,即当前的值往往受到过去值的影响。这种依赖性是时间序列数据最本质的特征,它使得时间序列分析能够揭示数据随时间变化的动态规律。
趋势性:时间序列数据可能呈现出一种长期的增长或下降趋势。这种趋势可能是由于外部因素(如政策变化、技术进步等)或内部因素(如市场需求、消费者偏好等)引起的。趋势分析是时间序列分析的重要内容之一。
季节性:某些时间序列数据会呈现出周期性的波动,这种波动通常与季节、节日、假期等因素有关。季节性分析有助于我们理解数据中的周期性变化,并据此进行预测和规划。
随机性:尽管时间序列数据具有时间依赖性、趋势性和季节性等特点,但仍然存在一些无法解释的随机波动。这些随机波动可能是由于偶然因素、测量误差或系统噪声等原因引起的。在时间序列分析中,我们需要考虑这些随机波动对预测结果的影响。
不可重复性:每个时间序列都是独特的,因为它包含了在特定时间点和条件下发生的特定事件和观测值。这意味着我们不能简单地复制或重新生成一个完全相同的时间序列,除非在完全相同的条件下进行重复实验或观测。
数据长度:时间序列的长度(即观测值的数量)可以影响分析的复杂性和准确性。较长的时间序列通常包含更多的信息,有助于揭示更复杂的模式和关系。然而,过长的时间序列也可能包含过多的噪声和冗余信息,需要进行适当的数据预处理和特征选择。
非平稳性:许多时间序列数据是非平稳的,即其统计特性(如均值、方差等)随时间而变化。非平稳性增加了时间序列分析的难度,因为传统的统计方法往往假设数据是平稳的。为了处理非平稳时间序列,我们可能需要采用差分、趋势分解或季节性调整等方法来使其变得平稳。
- # 1. 导入需要用到的相关库
- # 导入 pandas 库,用于数据处理和分析
- import pandas as pd
- # 导入 numpy 库,用于科学计算和多维数组操作
- import numpy as np
- # 使用 read_csv() 函数从文件中读取训练集数据,文件名为 'train.csv'
- train = pd.read_csv('train.csv')
- # 使用 read_csv() 函数从文件中读取测试集数据,文件名为 'test.csv'
- test = pd.read_csv('test.csv')
dt列表示时间或日期的某种索引,且从较小的数值开始(如1, 2, 3, ...)
这里选择dt<=20作为条件,意味着我们关注从时间起点开始的前20个单位时间(但实际上是第11到第20个,因为dt=1时也在内)
使用groupby按id分组,然后对每个分组内的target列计算平均值
注意:这里的选择可能忽略了dt的确切范围,因为我们是直接对所有dt<=20的数据进行平均,而不是对每个id分别考虑其最近的11-20个时间单位
- target_mean = train[train['dt'] <= 20].groupby('id')['target'].mean().reset_index()
- # train[train['dt'] <= 20]:首先筛选出dt列值小于或等于20的行。
- # .groupby('id'):然后按照id列的值对数据进行分组。
- # ['target'].mean():对每个分组内的target列计算平均值。
- # .reset_index():将分组键(即id)从索引转换为DataFrame中的一列,并添加一个新的整数索引。
使用merge函数将target_mean DataFrame与test DataFrame合并
合并基于id列,使用左连接(how='left'),这样test中的所有id都会保留在结果中
如果某个id在target_mean中没有对应的平均值(即该id在训练集的指定时间段内没有记录),则合并后的DataFrame中该id的target列将为NaN
test = test.merge(target_mean, on='id', how='left')
test[['id', 'dt', 'target']].to_csv('submit.csv', index=None)
使用机器学习方法一般主要需要从 获取数据&增强、特征提取和模型 三个方面下手。
数据预处理是机器学习流程中至关重要的一个环节,它直接影响到后续模型的性能和准确度。数据预处理通常包括以下几个步骤:
GBDT(Gradient Boosting Decision Tree),全称为梯度提升决策树,是一种基于集成学习思想的决策树模型。它通过迭代地训练多个弱学习器(通常是决策树),并将它们的预测结果累加起来作为最终的预测输出。下面将从GBDT的定义、原理、优缺点及应用等方面进行详细介绍。
定义
GBDT是一种迭代式的boosting算法,通过不断减小训练过程产生的残差,对数据进行回归或分类。其核心在于利用损失函数的负梯度作为残差的近似值,通过多轮迭代来构建一个强大的预测模型。
原理
优缺点
优点
缺点
应用
GBDT以其卓越的预测精度、良好的泛化能力以及对异常值的稳健性,广泛应用于信用评分、广告点击预测、疾病诊断等多个实际场景。例如,在信用评分领域,GBDT可以通过分析用户的各种信息(如年龄、收入、消费习惯等)来预测用户的信用等级;在广告点击预测领域,GBDT可以根据用户的浏览历史和点击行为来预测用户是否会对某个广告进行点击。
综上所述,GBDT是一种强大的集成学习算法,在回归和分类任务中表现出色。然而,在实际应用中也需要注意其优缺点和适用范围,以便更好地发挥其性能。
LightGBM(Light Gradient Boosting Machine)是一种快速、高效的机器学习算法,属于梯度提升框架的一种,主要用于处理分类、回归和排序等任务。它由微软公司开发,旨在提供一个高效、快速的梯度提升决策树(GBDT)实现,具有较低的内存占用和更快的训练速度。以下是对LightGBM的详细介绍:
基本原理
LightGBM基于梯度提升决策树(GBDT)的原理,通过迭代地构建决策树来优化损失函数。与传统的GBDT算法相比,LightGBM在以下几个方面进行了优化:
基于直方图的算法:LightGBM使用了一种基于直方图的算法来处理数据。它将特征值离散化为有限的桶(bins),并为每个桶计算累计统计量(如梯度和样本数),从而构建直方图。这种方法减少了内存消耗并加速了训练过程。
单边梯度采样(GOSS):为了处理不平衡的数据分布,LightGBM采用了单边梯度采样算法。该算法保留梯度较大的样本,并对梯度较小的样本进行随机采样,同时增加这些样本的权重,以保持数据分布的一致性。
互斥特征捆绑(EFB):为了减少特征的数量并降低计算复杂度,LightGBM通过特征捆绑的方式将互斥的特征合并为一个新的特征。这种方法在不损失太多信息的情况下减少了特征的数量。
带深度限制的叶子生长(leaf-wise):在构建决策树时,LightGBM采用了按叶子节点分割的策略(leaf-wise),即每次选择增益最大的叶子节点进行分裂,并限制树的最大深度。这种策略可以更快地降低损失函数,但也可能导致过拟合。
优点
训练速度快:由于采用了基于直方图的算法和高效的并行计算技术,LightGBM的训练速度非常快,特别适合处理大规模数据集。
内存占用低:通过离散化特征和构建直方图,LightGBM显著降低了内存消耗,使得在内存有限的环境下也能进行高效的训练。
支持分布式与GPU:LightGBM支持分布式训练,可以充分利用多机多核的计算资源。同时,它也支持GPU加速,进一步提高了训练速度。
高准确率:通过优化算法和特征选择等方法,LightGBM能够构建出具有较高准确率的模型。
支持多种任务:LightGBM不仅支持分类和回归任务,还支持排序等任务,具有广泛的应用场景。
应用场景
LightGBM在多个领域都有广泛的应用,包括但不限于:
推荐系统:用于商品推荐、广告推荐等任务。
搜索引擎:用于网页排序、广告排序等任务。
金融风控:用于信用评分、欺诈检测等任务。
医疗健康:用于疾病诊断、药物研发等任务。
自然语言处理:用于情感分析、文本分类等任务。
图像识别:用于图像分类、目标检测等任务。
时间序列预测:用于股票价格预测、交通流量预测等任务。
综上所述,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
- # 告诉 Python 解释器忽略掉所有的警告信息
- warnings.filterwarnings('ignore')
warnings.filterwarnings('ignore')
是 Python 中用于控制警告信息(warnings)显示的一个语句。这个语句来自于 Python 的 warnings
模块,该模块允许你控制警告的过滤、显示等行为。
当你调用 warnings.filterwarnings('ignore')
时,你实际上是在告诉 Python 解释器忽略掉所有的警告信息。这意味着,即使代码中存在可能会触发警告的条件,这些警告也不会被打印到控制台或日志文件中。
- train = pd.read_csv('train.csv')
- test = pd.read_csv('test.csv')
-
- type_target_df = train.groupby('type')['target'].mean().reset_index()
- plt.figure(figsize=(8, 4)) # 设置图形的大小为8x4英寸。
- plt.bar(type_target_df['type'], type_target_df['target'], color=['blue', 'green'])
- plt.xlabel('Type') # X轴标签
- plt.ylabel('Average Target Value') # Y轴标签
- plt.title('Bar Chart of Target by Type') # 图形标题
- plt.show() # 显示图形
- plt.figure(figsize=(10, 5))
- # 使用plot函数绘制折线图。specific_id_df['dt']作为x轴的数据,specific_id_df['target']作为y轴的数据。marker='o'表示在数据点上添加圆圈标记,linestyle='-'表示使用实线连接数据点。
- 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()
这里主要构建了 历史平移特征 和 窗口统计特征
历史平移特征是一种在数据分析和机器学习中常用的特征提取方法,特别是在处理时间序列数据时。这种方法的基本思想是将过去某个时间点的数据值作为当前时间点的特征。具体来说,对于单位d时刻的数据,直接将d-1时刻(或其他历史时间点)的值作为特征加入到数据集中。
特点与应用:
窗口统计特征是通过在时间序列数据上滑动一个固定大小的窗口,并计算窗口内数据的统计量来提取的特征。这些统计量可以包括最大值、最小值、均值、中位数、方差等。
特点与应用:
- data = pd.concat([test, train], axis=0, ignore_index=True)
- data = data.sort_values(['id', 'dt'], ascending=False).reset_index(drop=True)
pd.concat([test, train], axis=0, ignore_index=True)
: 这行代码将测试集(test
)和训练集(train
)沿着行方向(axis=0
)合并成一个新的DataFrame data
。ignore_index=True
参数确保新的DataFrame的索引是从0开始重新排序的。data.sort_values(['id','dt'], ascending=False).reset_index(drop=True)
: 这行代码根据'id'
和'dt'
列对data
进行降序排序。排序后,使用reset_index(drop=True)
重置索引,以确保索引的连续性。- for i in range(10, 30):
- data[f'last{i}_target'] = data.groupby(['id'])['target'].shift(i)
i
创建一个新列f'last{i}_target'
。这些新列是通过groupby(['id'])
对'target'
列进行分组,并使用shift(i)
函数将每个'id'
组的'target'
值向下移动i
个位置得到的。这实际上是在创建历史特征,即每个时间点的'target'
值之前的第i
个时间点的'target'
值。data[f'win3_mean_target'] = (data['last10_target'] + data['last11_target'] + data['last12_target']) / 3
'win3_mean_target'
的新列,该列是前三个历史平移特征('last10_target'
、'last11_target'
和'last12_target'
)的平均值。这可以视为一个窗口统计特征,其中窗口大小为3(即最近的3个历史'target'
值)- train = data[data.target.notnull()].reset_index(drop=True)
- test = data[data.target.isnull()].reset_index(drop=True)
data
DataFrame切分回训练集(train
)和测试集(test
)。这是通过检查'target'
列是否包含非空值来完成的。'target'
列非空的行被分配给训练集,而'target'
列为空的行则被分配给测试集。reset_index(drop=True)
用于重置索引,确保索引的连续性。train_cols = [f for f in data.columns if f not in ['id', 'target']]
train_cols
的列表,其中包含除了'id'
和'target'
之外的所有列名。这些列名将被用作训练模型的输入特征。这里选择使用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参数:
1. 核心参数
1.1 树结构相关参数
1.2 训练控制参数
2. 正则化参数
3. 采样参数
4. 其他重要参数
参考文章:
1、从零入门机器学习竞赛 - 飞书云文档 (feishu.cn)
2、Task2:入门lightgbm,开始特征工程 - 飞书云文档 (feishu.cn)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。