Partage de technologie

Deuxième phase du camp d'été IA Datawhale 2024 - Défi de prévision de la demande d'énergie

2024-07-12

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

#AIsummercamp#Datawhale #summercamp

1. Introduction au concours

Avec le développement rapide de l’économie mondiale et l’accélération de l’urbanisation, le système électrique est confronté à des défis croissants. Une prévision précise de la demande d’électricité est cruciale pour le fonctionnement stable du réseau électrique, une gestion efficace de l’énergie et l’intégration des sources d’énergie renouvelables.

2. Tâches événementielles

Compte tenu des données de séquence pertinentes et d'autres informations sur N jours d'historique de consommation d'électricité correspondant à plusieurs maisons, prédisez la consommation d'électricité correspondant aux maisons.

Concours de développeurs iFLYTEK AI 2024 - Plateforme ouverte iFLYTEK  

3.Tâche 2 : Lightgbm avancé, démarrer l'ingénierie des fonctionnalités

(1) Module d'importation :Cette section contient les modules requis par le code

  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) Préparation des données

Au cours de la phase de préparation des données, les données d'entraînement et les données de test sont principalement lues et l'affichage des données de base est effectué.

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

Une brève introduction aux données : Parmi eux, id est l'identifiant de la maison, dt est l'identifiant du jour, les données d'entraînement minimales dt sont 11 et différents identifiants correspondent à différentes longueurs de séquence est le type de maison. De manière générale, il existe une différence relativement grande dans l'ensemble. la consommation de différents types de maisons ; l'objectif est la consommation électrique réelle, qui est également notre objectif de prévision pour ce concours. Ce qui suit est une analyse visuelle simple pour nous aider à avoir une compréhension simple des données.

  • Histogramme des cibles correspondant à différents types

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

  • Le graphique linéaire de la cible avec l'identifiant 00037f39cf comme séquence selon 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) Ingénierie des fonctionnalités

Ici, nous construisons principalement des fonctionnalités de traduction historique et des fonctionnalités statistiques de fenêtre ; chaque fonctionnalité est bien fondée et est expliquée en détail comme suit :

  • Fonctionnalités de traduction historique :Les informations de l'étape précédente sont obtenues par traduction historique comme le montre la figure ci-dessous, les informations du temps d-1 peuvent être données au temps d, et les informations du temps d peuvent être données au temps d+1, réalisant ainsi la construction caractéristique d’une unité de traduction.

  • Caractéristiques statistiques de la fenêtre : Les statistiques de fenêtre peuvent créer différentes tailles de fenêtre, puis calculer les informations de moyenne, maximale, minimale, médiane et de variance en fonction de la plage de fenêtre, ce qui peut refléter les modifications apportées aux données au cours de l'étape la plus récente. Comme le montre la figure ci-dessous, les informations des trois unités de temps avant le moment d peuvent être construites statistiquement pour me donner le moment.

    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) Formation du modèle et prédiction des ensembles de tests

    Choisir d'utiliser le modèle Lightgbm est généralement utilisé comme modèle de base dans les compétitions d'exploration de données. Il peut obtenir des scores relativement stables sans avoir besoin d'ajuster les paramètres du processus. De plus, il convient de noter que la construction de l'ensemble de formation et de l'ensemble de vérification, parce que les données ont une relation de série chronologique, est strictement divisée en fonction de la série chronologique. Ici, l'ensemble de données de formation d'origine dt est 30 comme formation. données, et les données précédentes sont utilisées comme données de vérification, cela garantit qu'il n'y a pas de problème de croisement dans les données (les données futures ne sont pas utilisées pour prédire les données historiques).

  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)

obtenirFraction.

4.Avancé

L’importance de l’ingénierie des fonctionnalités va de soi

J'ai ajouté quelques fonctionnalités supplémentaires, j'aurais pu en ajouter davantage, mais Colab n'avait pas assez de mémoire.

Il existe des millions de données et il n'y a aucun moyen d'ajouter plus de fonctionnalités. Voyons comment les optimiser plus tard.