Compartilhamento de tecnologia

Segunda fase do Datawhale 2024 AI Summer Camp - Desafio de previsão de demanda de energia

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

#AIsummercamp#Datawhale #summercamp

1. Introdução à competição

Com o rápido desenvolvimento da economia global e a aceleração da urbanização, o sistema energético enfrenta desafios crescentes. A previsão precisa da procura de eletricidade é crucial para o funcionamento estável da rede elétrica, a gestão eficaz da energia e a integração de fontes de energia renováveis.

2. Tarefas de evento

Dados os dados sequenciais relevantes e outras informações do histórico de consumo de eletricidade de N dias correspondentes a múltiplas casas, preveja o consumo de eletricidade correspondente às casas.

Competição de desenvolvedores de IA iFLYTEK 2024 - plataforma aberta iFLYTEK  

3.Tarefa 2: Lightgbm avançado, iniciar engenharia de recursos

(1) Módulo de importação:Esta seção contém os módulos exigidos pelo código

  1. import numpy as np
  2. import pandas as pd
  3. import lightgbm as lgb
  4. from sklearn.metrics import mean_squared_log_error, mean_absolute_error
  5. import tqdm
  6. import sys
  7. import os
  8. import gc
  9. import argparse
  10. import warnings
  11. warnings.filterwarnings('ignore')

(2) Preparação de dados

No estágio de preparação de dados, os dados de treinamento e de teste são principalmente lidos e a exibição de dados básicos é realizada.

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

Uma breve introdução aos dados: Entre eles, id é o ID da casa, dt é o identificador do dia, os dados de treinamento mínimos dt são 11 e IDs diferentes correspondem a diferentes comprimentos de sequência. Em geral, há uma diferença relativamente grande no geral; a meta de consumo de diferentes tipos de casas é o consumo real de energia, que também é nossa meta de previsão para esta competição. A seguir está uma análise visual simples para nos ajudar a ter uma compreensão simples dos dados.

  • Histograma de alvos correspondentes a diferentes tipos

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

  • O gráfico de linhas do alvo com id como 00037f39cf como sequência de acordo com dt

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

(3) Engenharia de recursos

Aqui construímos principalmente recursos de tradução histórica e recursos estatísticos de janela, cada recurso é bem fundamentado e explicado em detalhes a seguir:

  • Recursos de tradução histórica:A informação da etapa anterior é obtida através da tradução histórica conforme mostra a figura abaixo, a informação do tempo d-1 pode ser dada ao tempo d, e a informação do tempo d pode ser dada ao tempo d+1, concretizando assim a construção de recursos de uma unidade de tradução.

  • Características estatísticas da janela: As estatísticas de janela podem construir diferentes tamanhos de janela e, em seguida, calcular as informações de média, máximo, mínimo, mediana e variância com base no intervalo da janela, o que pode refletir as alterações nos dados no estágio mais recente. Conforme mostrado na figura abaixo, as informações das três unidades de tempo antes do momento d podem ser construídas estatisticamente para me dar o momento d.

    1. # 合并训练数据和测试数据,并进行排序
    2. data = pd.concat([test, train], axis=0, ignore_index=True)
    3. data = data.sort_values(['id','dt'], ascending=False).reset_index(drop=True)
    4. # 历史平移
    5. for i in range(10,30):
    6. data[f'last{i}_target'] = data.groupby(['id'])['target'].shift(i)
    7. # 窗口统计
    8. data[f'win3_mean_target'] = (data['last10_target'] + data['last11_target'] + data['last12_target']) / 3
    9. # 进行数据切分
    10. train = data[data.target.notnull()].reset_index(drop=True)
    11. test = data[data.target.isnull()].reset_index(drop=True)
    12. # 确定输入特征
    13. train_cols = [f for f in data.columns if f not in ['id','target']]

    4) Treinamento de modelo e previsão de conjunto de testes

    A escolha de usar o modelo Lightgbm é geralmente usado como modelo básico em competições de mineração de dados. Ele pode obter pontuações relativamente estáveis ​​​​sem a necessidade de ajuste de parâmetros de processo. Além disso, deve-se notar que a construção do conjunto de treinamento e do conjunto de verificação, porque os dados têm um relacionamento de série temporal, é estritamente dividido de acordo com a série temporal. Aqui, o conjunto de dados de treinamento original dt é 30 como o treinamento. dados, e os dados anteriores são usados ​​como dados de verificação, isso garante que não haja problema de cruzamento nos dados (dados futuros não são usados ​​para prever dados históricos).

  1. def time_model(clf, train_df, test_df, cols):
  2. # 训练集和验证集切分
  3. trn_x, trn_y = train_df[train_df.dt>=31][cols], train_df[train_df.dt>=31]['target']
  4. val_x, val_y = train_df[train_df.dt<=30][cols], train_df[train_df.dt<=30]['target']
  5. # 构建模型输入数据
  6. train_matrix = clf.Dataset(trn_x, label=trn_y)
  7. valid_matrix = clf.Dataset(val_x, label=val_y)
  8. # lightgbm参数
  9. lgb_params = {
  10. 'boosting_type': 'gbdt',
  11. 'objective': 'regression',
  12. 'metric': 'mse',
  13. 'min_child_weight': 5,
  14. 'num_leaves': 2 ** 5,
  15. 'lambda_l2': 10,
  16. 'feature_fraction': 0.8,
  17. 'bagging_fraction': 0.8,
  18. 'bagging_freq': 4,
  19. 'learning_rate': 0.05,
  20. 'seed': 2024,
  21. 'nthread' : 16,
  22. 'verbose' : -1,
  23. }
  24. # 训练模型
  25. model = clf.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix],
  26. categorical_feature=[], verbose_eval=500, early_stopping_rounds=500)
  27. # 验证集和测试集结果预测
  28. val_pred = model.predict(val_x, num_iteration=model.best_iteration)
  29. test_pred = model.predict(test_df[cols], num_iteration=model.best_iteration)
  30. # 离线分数评估
  31. score = mean_squared_error(val_pred, val_y)
  32. print(score)
  33. return val_pred, test_pred
  34. lgb_oof, lgb_test = time_model(lgb, train, test, train_cols)
  35. # 保存结果文件到本地
  36. test['target'] = lgb_test
  37. test[['id','dt','target']].to_csv('submit.csv', index=None)

pegarFração.

4.Avançado

A importância da engenharia de recursos é evidente

Adicionei mais alguns recursos, poderia ter adicionado mais, mas o colab não tinha memória suficiente.

Existem milhões de dados e não há como adicionar mais recursos. Vamos ver como otimizá-los mais tarde.