기술나눔

Datawhale 2024 AI Summer Camp 2차 - 전력수요 예측 챌린지

2024-07-12

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

#AIsummercamp#Datawhale #summercamp

1. 공모전 소개

세계 경제의 급속한 발전과 도시화의 가속화로 인해 전력 시스템은 점점 더 많은 도전에 직면해 있습니다. 정확한 전력수요 예측은 전력망의 안정적인 운영, 효과적인 에너지 관리, 신재생에너지원의 통합을 위해 매우 중요합니다.

2. 이벤트 과제

여러 주택에 해당하는 N일간의 전력 소비 이력에 대한 관련 시퀀스 데이터와 기타 정보를 바탕으로 해당 주택에 해당하는 전력 소비량을 예측합니다.

2024 iFLYTEK AI 개발자 공모전 - iFLYTEK 오픈 플랫폼  

3.Task2: 고급 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는 집 ID이고, dt는 요일 식별자이며, 최소 훈련 데이터 dt는 11이며, 서로 다른 ID는 서로 다른 시퀀스 길이에 해당합니다. 일반적으로 말하면 전체적으로는 상대적으로 큰 차이가 있습니다. 다양한 유형의 주택 소비량 목표는 실제 전력 소비량이며 이는 이번 대회의 예측 목표이기도 합니다. 다음은 데이터에 대한 간단한 이해를 돕기 위한 간단한 시각적 분석입니다.

  • 다양한 유형에 해당하는 대상의 히스토그램

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

  • dt에 따른 시퀀스로 ID가 00037f39cf인 대상의 꺾은선형 차트

  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 모멘트 이전의 3개 시간 단위 정보를 통계적으로 구성하여 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에 메모리가 부족했습니다.

수백만 개의 데이터가 있는데 더 이상 기능을 추가할 방법이 없습니다. 나중에 최적화하는 방법을 살펴보겠습니다.