技術共有

Datawhale 2024 AI サマーキャンプ第 2 フェーズ - 電力需要予測チャレンジ

2024-07-12

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

#AIサマーキャンプ#データホエール #サマーキャンプ

1. コンテストの紹介

世界経済の急速な発展と都市化の加速に伴い、電力システムは増大する課題に直面しています。電力需要の正確な予測は、送電網の安定した運用、効果的なエネルギー管理、再生可能エネルギー源の統合にとって非常に重要です。

2. イベントタスク

複数の住宅に対応する N 日間の電力使用量履歴の関連シーケンス データとその他の情報が与えられた場合、各住宅に対応する電力使用量を予測します。

2024 iFLYTEK AI 開発者コンペティション - 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 はハウス 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 に与えることができます。翻訳の 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 に十分なメモリがありませんでした。

数百万のデータがあり、これ以上の機能を追加する方法はありません。それを最適化する方法を後で見てみましょう。