Обмен технологиями

Второй этап летнего лагеря Datawhale 2024 AI — задача по прогнозированию спроса на электроэнергию

2024-07-12

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

#AIsummercamp#Datawhale #summercamp

1. Знакомство с конкурсом

В условиях быстрого развития мировой экономики и ускорения урбанизации энергетическая система сталкивается с растущими проблемами. Точное прогнозирование спроса на электроэнергию имеет решающее значение для стабильной работы энергосистемы, эффективного управления энергопотреблением и интеграции возобновляемых источников энергии.

2. Задачи мероприятия

Учитывая соответствующие данные последовательности и другую информацию за N дней истории потребления электроэнергии, соответствующую нескольким домам, спрогнозируйте потребление электроэнергии, соответствующее домам.

Конкурс разработчиков искусственного интеллекта iFLYTEK 2024 — Открытая платформа iFLYTEK  

3. Задача 2: Расширенный LightGBM, начало разработки функций

(1) Модуль импорта:Этот раздел содержит модули, необходимые коду.

  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) Подготовка данных

На этапе подготовки данных в основном считываются данные обучения и тестовые данные, а также выполняется отображение основных данных.

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

Краткое введение в данные: Среди них id — это идентификатор дома, dt — идентификатор дня, минимальные данные обучения dt — 11, а разные идентификаторы соответствуют разным типам последовательностей — это тип дома. Вообще говоря, в целом существует относительно большая разница; потребление различных типов домов; целью является фактическое энергопотребление, которое также является целью нашего прогноза для этого конкурса. Ниже приводится простой визуальный анализ, который поможет нам лучше понять данные.

  • Гистограмма целей, соответствующих разным типам

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

  • Линейная диаграмма цели с идентификатором 00037f39cf в виде последовательности согласно 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) Разработка функций

Здесь мы в основном строим исторические функции перевода и статистические функции окон. Каждая функция хорошо обоснована и подробно объясняется следующим образом:

  • Особенности исторического перевода:Информация предыдущего этапа получается посредством исторического перевода; как показано на рисунке ниже, информация времени d-1 может быть передана времени d, а информация времени d может быть передана времени d+1, реализуя таким образом особенность построения одной единицы перевода.

  • Статистические характеристики окна: Статистика окон может создавать окна разных размеров, а затем вычислять среднее, максимальное, минимальное, медианное значение и информацию о дисперсии на основе диапазона окна, которая может отражать изменения в данных на самом последнем этапе. Как показано на рисунке ниже, информация о трех единицах времени до момента d может быть статистически построена, чтобы дать мне момент 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) Обучение модели и прогнозирование тестового набора

    Модель Lightgbm обычно используется в качестве базовой модели на соревнованиях по интеллектуальному анализу данных. Она позволяет получить относительно стабильные результаты без необходимости корректировки параметров процесса. Кроме того, следует отметить, что построение обучающего набора и проверочного набора, поскольку данные имеют связь временных рядов, строго разделены в соответствии с временными рядами. Здесь исходный набор обучающих данных dt равен 30 в качестве обучающего. данные, а предыдущие данные используются в качестве данных проверки, это гарантирует отсутствие проблем пересечения данных (будущие данные не используются для прогнозирования исторических данных).

  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)

получатьДоля.

4.Дополнительно

Важность разработки функций очевидна.

Я добавил еще несколько функций, мог бы добавить еще, но у colab не хватило памяти.

Есть миллионы данных, и нет возможности добавить больше функций. Посмотрим, как их оптимизировать позже.