моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. Знакомство с конкурсом
В условиях быстрого развития мировой экономики и ускорения урбанизации энергетическая система сталкивается с растущими проблемами. Точное прогнозирование спроса на электроэнергию имеет решающее значение для стабильной работы энергосистемы, эффективного управления энергопотреблением и интеграции возобновляемых источников энергии.
2. Задачи мероприятия
Учитывая соответствующие данные последовательности и другую информацию за N дней истории потребления электроэнергии, соответствующую нескольким домам, спрогнозируйте потребление электроэнергии, соответствующее домам.
Конкурс разработчиков искусственного интеллекта iFLYTEK 2024 — Открытая платформа iFLYTEK
3. Задача 2: Расширенный LightGBM, начало разработки функций
(1) Модуль импорта:Этот раздел содержит модули, необходимые коду.
- import numpy as np
- import pandas as pd
- import lightgbm as lgb
- from sklearn.metrics import mean_squared_log_error, mean_absolute_error
- import tqdm
- import sys
- import os
- import gc
- import argparse
- import warnings
- warnings.filterwarnings('ignore')
(2) Подготовка данных
На этапе подготовки данных в основном считываются данные обучения и тестовые данные, а также выполняется отображение основных данных.
- train = pd.read_csv('./data/train.csv')
- test = pd.read_csv('./data/test.csv')
Краткое введение в данные: Среди них id — это идентификатор дома, dt — идентификатор дня, минимальные данные обучения dt — 11, а разные идентификаторы соответствуют разным типам последовательностей — это тип дома. Вообще говоря, в целом существует относительно большая разница; потребление различных типов домов; целью является фактическое энергопотребление, которое также является целью нашего прогноза для этого конкурса. Ниже приводится простой визуальный анализ, который поможет нам лучше понять данные.
Гистограмма целей, соответствующих разным типам
- import matplotlib.pyplot as plt
- # 不同type类型对应target的柱状图
- type_target_df = train.groupby('type')['target'].mean().reset_index()
- plt.figure(figsize=(8, 4))
- plt.bar(type_target_df['type'], type_target_df['target'], color=['blue', 'green'])
- plt.xlabel('Type')
- plt.ylabel('Average Target Value')
- plt.title('Bar Chart of Target by Type')
- plt.show()
Линейная диаграмма цели с идентификатором 00037f39cf в виде последовательности согласно dt
- specific_id_df = train[train['id'] == '00037f39cf']
- plt.figure(figsize=(10, 5))
- 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()
(3) Разработка функций
Здесь мы в основном строим исторические функции перевода и статистические функции окон. Каждая функция хорошо обоснована и подробно объясняется следующим образом:
Особенности исторического перевода:Информация предыдущего этапа получается посредством исторического перевода; как показано на рисунке ниже, информация времени d-1 может быть передана времени d, а информация времени d может быть передана времени d+1, реализуя таким образом особенность построения одной единицы перевода.
Статистические характеристики окна: Статистика окон может создавать окна разных размеров, а затем вычислять среднее, максимальное, минимальное, медианное значение и информацию о дисперсии на основе диапазона окна, которая может отражать изменения в данных на самом последнем этапе. Как показано на рисунке ниже, информация о трех единицах времени до момента d может быть статистически построена, чтобы дать мне момент d.
- # 合并训练数据和测试数据,并进行排序
- 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']]
4) Обучение модели и прогнозирование тестового набора
Модель Lightgbm обычно используется в качестве базовой модели на соревнованиях по интеллектуальному анализу данных. Она позволяет получить относительно стабильные результаты без необходимости корректировки параметров процесса. Кроме того, следует отметить, что построение обучающего набора и проверочного набора, поскольку данные имеют связь временных рядов, строго разделены в соответствии с временными рядами. Здесь исходный набор обучающих данных dt равен 30 в качестве обучающего. данные, а предыдущие данные используются в качестве данных проверки, это гарантирует отсутствие проблем пересечения данных (будущие данные не используются для прогнозирования исторических данных).
- def time_model(clf, 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 = clf.Dataset(trn_x, label=trn_y)
- valid_matrix = clf.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 = clf.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)
получатьДоля.
4.Дополнительно
Важность разработки функций очевидна.
Я добавил еще несколько функций, мог бы добавить еще, но у colab не хватило памяти.
Есть миллионы данных, и нет возможности добавить больше функций. Посмотрим, как их оптимизировать позже.