Condivisione della tecnologia

Seconda fase del campo estivo AI Datawhale 2024: sfida di previsione della domanda di energia

2024-07-12

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

#AIsummercamp#Datawhale #summercamp

1. Introduzione al concorso

Con il rapido sviluppo dell’economia globale e l’accelerazione dell’urbanizzazione, il sistema energetico si trova ad affrontare sfide crescenti. Una previsione accurata della domanda di elettricità è fondamentale per il funzionamento stabile della rete elettrica, una gestione efficace dell’energia e l’integrazione delle fonti energetiche rinnovabili.

2. Attività evento

Dati i dati di sequenza rilevanti e altre informazioni di N giorni di cronologia del consumo di elettricità corrispondenti a più case, prevedere il consumo di elettricità corrispondente alle case.

Concorso per sviluppatori AI iFLYTEK 2024: piattaforma aperta iFLYTEK  

3.Attività2: Lightgbm avanzato, avvio della progettazione delle funzionalità

(1) Modulo di importazione:In questa sezione sono contenuti i moduli richiesti dal codice

  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) Preparazione dei dati

Nella fase di preparazione dei dati, vengono principalmente letti i dati di addestramento e di test e viene eseguita la visualizzazione dei dati di base.

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

Una breve introduzione ai dati: Tra questi, id è l'ID della casa, dt è l'identificatore del giorno, i dati di addestramento minimi dt sono 11 e ID diversi corrispondono a lunghezze di sequenza diverse. In generale, c'è una differenza relativamente ampia nel complesso consumo di diversi tipi di case; l'obiettivo è il consumo energetico effettivo, che è anche il nostro obiettivo di previsione per questa competizione. Quella che segue è una semplice analisi visiva per aiutarci ad avere una semplice comprensione dei dati.

  • Istogramma dei target corrispondenti a diversi tipi

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

  • Il grafico a linee del target con ID come 00037f39cf come sequenza secondo 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) Ingegneria delle funzionalità

Qui costruiamo principalmente funzionalità di traduzione storica e funzionalità statistiche della finestra; ciascuna funzionalità è ben fondata ed è spiegata in dettaglio come segue:

  • Caratteristiche della traduzione storica:L'informazione della fase precedente è ottenuta attraverso la traduzione storica; come mostrato nella figura seguente, l'informazione del tempo d-1 può essere data al tempo d, e l'informazione del tempo d può essere data al tempo d+1, realizzando così la costruzione caratteristica di un'unità di traduzione.

  • Caratteristiche statistiche della finestra: Le statistiche della finestra possono costruire diverse dimensioni della finestra e quindi calcolare le informazioni sulla media, il massimo, il minimo, la mediana e la varianza in base all'intervallo della finestra, che può riflettere le modifiche nei dati nella fase più recente. Come mostrato nella figura seguente, le informazioni delle tre unità di tempo prima del momento d possono essere costruite statisticamente per dare il momento me 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) Addestramento del modello e previsione del test set

    La scelta di utilizzare il modello Lightgbm viene solitamente utilizzato come modello di base nelle competizioni di data mining. Può ottenere punteggi relativamente stabili senza la necessità di modificare i parametri del processo. Inoltre, va notato che la costruzione del set di addestramento e del set di verifica, poiché i dati hanno una relazione di serie temporale, è rigorosamente divisa in base alla serie temporale. Qui, il set di dati di addestramento originale dt è 30 come addestramento dati e i dati precedenti vengono utilizzati come dati di verifica, ciò garantisce che non vi siano problemi di incrocio tra i dati (i dati futuri non vengono utilizzati per prevedere i dati storici).

  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)

OttenereFrazione.

4.Avanzato

L’importanza dell’ingegneria delle funzionalità è evidente

Ho aggiunto alcune altre funzionalità, avrei potuto aggiungerne altre, ma Colab non aveva memoria sufficiente.

Ci sono milioni di dati e non c'è modo di aggiungere altre funzionalità. Vediamo come ottimizzarli in seguito.