锂离子电池生产参数调控及生产温度预测挑战赛

目录

  • 概要
  • 整体架构流程
  • 技术名词解释
  • Baseline代码详解
  • 导入库
  • 数据准备 
  • 参数设置 
  • 时间特征函数 
  •  训练与预测

概要

本次比赛为数据挖掘类型的比赛,聚焦于工业场景。本赛题实质上为回归任务,其中会涉及到时序预测相关的知识。

通过电炉空间温度推测产品内部温度,设计烧结过程的温度场和浓度场的最优控制律:

  • 任务输入:电炉对应17个温区的实际生产数据,分别是电炉上部17组加热棒设定温度T1-1 ~ T1-17,电炉下部17组加热棒设定温度T2-1~T2-17,底部17组进气口的设定进气流量V1-V17;
  • 任务输出:电炉对应17个温区上部空间和下部空间17个测温点的测量温度值。

整体架构流程

机器学习模型:

优点:模型使用简单,数据预处理的需求也大大减少。

步骤

  • 数据预处理

  • 切分训练集与验证集
  • 训练模型
  • 生成最后的预测结果。

技术名词解释

LightGBM  

GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛,通常被用于多分类、点击率预测、搜索排序等任务;在各种数据挖掘竞赛中也是致命武器,据统计Kaggle上的比赛有一半以上的冠军方案都是基于GBDT。而LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。

基本原理:

  • 基于Histogram的决策树算法

  • 带深度限制的 Leaf-wise 算法
  • 单边梯度采样算法
  • 互斥特征捆绑算法

Pandas

Pandas 是 Pythonopen in new window 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。

其适用于处理以下类型的数据:

  • 与 SQL 或 Excel 表类似的,含异构列的表格数据;
  • 有序和无序(非固定频率)的时间序列数据;
  • 带行列标签的矩阵数据,包括同构或异构型数据;
  • 任意其它形式的观测、统计数据集, 数据转入 Pandas 数据结构时不必事先标记。

Scikit-learn

Scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包。它通过NumPy, SciPy和Matplotlib等python数值计算的库实现高效的算法应用,并且涵盖了几乎所有主流机器学习算法。sklearn中常用的模块有分类、回归、聚类、降维、模型选择、预处理。 

Tqdm

Tqdm 是一个快速,可扩展的Python进度条,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator)。

DataFrame 

pandas官方对DataFrame的定义了三个特点:Two-dimensional(二维), size-mutable(尺寸可 …
通俗的说,DataFrame是一种表格型数据结构,由行(rows)和列(columns)组成,index为行索引,column为列索引。我们可以对整行和整列进行操作。可以理解成是一种存放Series对象,结构类似于字典的容器。

Baseline代码详解

导入库

# 导入所需要的库
import pandas as pd # 导入pandas库(pd),用于处理数据的工具
import lightgbm as lgb # 机器学习模型 LightGBM(lgb)
from sklearn.metrics import mean_absolute_error # 导入mean_absolute_error函数,用 MAE 的计算函数作为评分
from sklearn.model_selection import train_test_split # 导入train_test_split函数,拆分训练集与验证集工具
from tqdm import tqdm # 导入tqdm函数,显示循环的进度条工具

数据准备 

# 数据准备

train_dataset = pd.read_csv("./data/train.csv") # Pandas 库 (pd)用于读取CSV文件train.csv的原始训练数据,存储为train_dataset。
test_dataset = pd.read_csv("./data/test.csv") # Pandas 库 (pd)用于读取CSV文件test.csv的原始测试数据(用于提交),存储为test_dataset。

submit = pd.DataFrame() # 使用 Pandas 库 (pd),创建一个DataFrame定义的submit,提交的最终数据。
submit["序号"] = test_dataset["序号"] # 将 test_dataset 中的“序号”(索引)列提取出来,以便对齐测试数据的序号。

MAE_scores = dict() # 定义评分项。

参数设置 

# 参数设置
pred_labels = list(train_dataset.columns[-34:]) # 选取 train_dataset 的倒数第34列到最后一列的所有列名,形成 pred_labels————包含列名的列表,包含需要预测的标签。
train_set, valid_set = train_test_split(train_dataset, test_size=0.2) # 拆分数据集。拆分比例为80%的训练集和20%的验证集

# 设定 LightGBM 训练参,查阅参数意义:https://lightgbm.readthedocs.io/en/latest/Parameters.html
lgb_params = {
        'boosting_type': 'gbdt',#设置提升类型
        'objective': 'regression',#目标函数
        'metric': 'mae',#评估函数
        'min_child_weight': 5,#子节点的最小权重和
        'num_leaves': 2 ** 5,# 叶子节点数
        'lambda_l2': 10,#L2 正则化项的权重
        'feature_fraction': 0.8,# 建树的特征选择比例
        'bagging_fraction': 0.8,# 建树的样本采样比例
        'bagging_freq': 4,#每 4 次迭代执行bagging
        'learning_rate': 0.05,# 学习速率
        'seed': 2023,#随机种子
        'nthread' : 16,#线程数
        'verbose' : -1,#是否输出训练过程日志
    }

no_info = lgb.callback.log_evaluation(period=-1) #回调函数,禁用训练日志输出。

时间特征函数 

# 时间特征函数
def time_feature(data: pd.DataFrame, pred_labels: list=None) -> pd.DataFrame:
    """提取数据中的时间特征。

    输入: 
        data: Pandas.DataFrame
            需要提取时间特征的数据。

        pred_labels: list, 默认值: None
            需要预测的标签的列表。如果是测试集,不需要填入。
    
    输出: data: Pandas.DataFrame
            提取时间特征后的数据。
    """
    
    data = data.copy() # 复制数据,避免后续影响原始数据。
    data = data.drop(columns=["序号"]) # 去掉“序号”特征。
    
    data["时间"] = pd.to_datetime(data["时间"]) # 将”时间“特征的文本内容转换为 Pandas 可处理的格式。
    data["month"] = data["时间"].dt.month # 添加新特征“month”,代表”当前月份“。
    data["day"] = data["时间"].dt.day # 添加新特征“day”,代表”当前日期“。
    data["hour"] = data["时间"].dt.hour # 添加新特征“hour”,代表”当前小时“。
    data["minute"] = data["时间"].dt.minute # 添加新特征“minute”,代表”当前分钟“。
    data["weekofyear"] = data["时间"].dt.isocalendar().week.astype(int) # 添加新特征“weekofyear”,代表”当年第几周“,并转换成 int,否则 LightGBM 无法处理。
    data["dayofyear"] = data["时间"].dt.dayofyear # 添加新特征“dayofyear”,代表”当年第几日“。
    data["dayofweek"] = data["时间"].dt.dayofweek # 添加新特征“dayofweek”,代表”当周第几日“。
    data["is_weekend"] = data["时间"].dt.dayofweek // 6 # 添加新特征“is_weekend”,代表”是否是周末“,1 代表是周末,0 代表不是周末。

    data = data.drop(columns=["时间"]) # LightGBM 无法处理这个特征,它已体现在其他特征中,故丢弃。

    if pred_labels: # 如果提供了 pred_labels 参数,则执行该代码块。
        data = data.drop(columns=[*pred_labels]) # 去掉所有待预测的标签。
    
    return data # 返回最后处理的数据。

test_features = time_feature(test_dataset) # 处理测试集的时间特征,无需 pred_labels。
test_features.head(5)

 运行结果:锂离子电池生产参数调控及生产温度预测挑战赛_第1张图片

 训练与预测

# 从所有待预测特征中依次取出标签进行训练与预测。
for pred_label in tqdm(pred_labels):
    # print("当前的pred_label是:", pred_label)
    train_features = time_feature(train_set, pred_labels=pred_labels)
    # 处理训练集的时间特征————使用 time_feature 函数处理训练集 train_set的时间特征,并将其中的待预测标签列表pred_labels 传递给该函数,得到训练集特征 train_features
    # train_features = enhancement(train_features_raw)
    train_labels = train_set[pred_label] 
    # 从 train_set 训练集中取出当前待预测的标签 pred_label,作为训练集的标签数据 train_labels 
    # print("当前的train_labels是:", train_labels)
    train_data = lgb.Dataset(train_features, label=train_labels) 
    # 将训练集特征 train_features 和训练集标签 train_labels 转换为 LightGBM 可处理的数据类型 lgb.Dataset,存储在 train_data 中


    valid_features = time_feature(valid_set, pred_labels=pred_labels)
    # 处理验证集的时间特征————使用 time_feature 函数处理验证集 valid_set 的时间特征,并将其中的待预测标签列表 pred_labels 传递给该函数,得到验证集特征 valid_features
    # valid_features = enhancement(valid_features_raw)
    valid_labels = valid_set[pred_label]
    # 从验证集valid_set中取出当前待预测的标签 pred_label,作为验证集的标签数据
    # print("当前的valid_labels是:", valid_labels)
    valid_data = lgb.Dataset(valid_features, label=valid_labels) 
    # 将验证集特征valid_features 和标签label转换为 LightGBM 可处理的类型lgb.Dataset,存储在 valid_data 中

    # 训练模型,参数依次为:导入模型设定参数、导入训练集、设定模型迭代次数(200)、导入验证集、禁止输出日志
    model = lgb.train(lgb_params, train_data, 200, valid_sets=valid_data, callbacks=[no_info])
    #使用 LightGBM 模型,根据的模型设定参数 lgb_params 对训练集 train_data 进行训练,设定模型迭代次数为 200,同时传入验证集 valid_data ,并禁用输出日志,得到训练好的模型 model
    valid_pred = model.predict(valid_features, num_iteration=model.best_iteration) 
    # 选择效果最好的模型 model 对验证集特征 valid_features 预测,得到验证集的预测结果 valid_pred
    test_pred = model.predict(test_features, num_iteration=model.best_iteration) 
    # 选择效果最好的模型进行测试集预测
    MAE_score = mean_absolute_error(valid_pred, valid_labels) 
    # 计算验证集预测数据 valid_pred 与真实数据 valid_labels 的 平均绝对误差 MAE,将其存储在字典 MAE_scores 中
    MAE_scores[pred_label] = MAE_score 
    # 以标签 pred_label 为键,将对应标签的 MAE 值存入评分项中。

    submit[pred_label] = test_pred 
    # 将测试集预测数据 test_pred 以标签 pred_label 为列名,存入最终提交数据 submit 中。
     
submit.to_csv('submit_result.csv', index=False) # 保存最后的预测结果到 submit_result.csv

运行结果:

锂离子电池生产参数调控及生产温度预测挑战赛_第2张图片

你可能感兴趣的:(人工智能)