Berbagi teknologi

Perkemahan Musim Panas AI Datawhale 2024 Tahap Kedua - Tantangan Perkiraan Permintaan Listrik

2024-07-12

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

#AIsummercamp#Datawhale #summercamp

1. Pengenalan kompetisi

Dengan pesatnya perkembangan ekonomi global dan percepatan urbanisasi, sistem ketenagalistrikan menghadapi tantangan yang semakin besar. Perkiraan permintaan listrik yang akurat sangat penting untuk stabilitas pengoperasian jaringan listrik, manajemen energi yang efektif, dan integrasi sumber energi terbarukan.

2. Tugas acara

Mengingat data urutan yang relevan dan informasi lain dari N hari riwayat konsumsi listrik yang terkait dengan beberapa rumah, prediksi konsumsi listrik yang terkait dengan rumah-rumah tersebut.

Kompetisi Pengembang AI iFLYTEK 2024-Platform Terbuka iFLYTEK  

3.Tugas2: Lightgbm tingkat lanjut, mulai rekayasa fitur

(1) Impor modul:Bagian ini berisi modul-modul yang dibutuhkan oleh kode

  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) Persiapan data

Pada tahap persiapan data, data latih dan data uji sebagian besar dibaca, dan data dasar ditampilkan.

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

Pengenalan singkat tentang data: Diantaranya, id adalah ID rumah, dt adalah pengidentifikasi hari, data pelatihan minimum dt adalah 11, dan ID yang berbeda sesuai dengan panjang urutan yang berbeda adalah tipe rumah konsumsi berbagai jenis rumah; targetnya adalah konsumsi daya aktual, yang juga merupakan target prediksi kami untuk kompetisi ini. Berikut ini adalah analisis visual sederhana untuk membantu kita memahami data secara sederhana.

  • Histogram target sesuai dengan tipe yang berbeda

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

  • Bagan garis target dengan id 00037f39cf sebagai urutan menurut 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) Rekayasa fitur

Di sini kami terutama membangun fitur terjemahan historis dan fitur statistik jendela, setiap fitur memiliki dasar yang kuat dan dijelaskan secara rinci sebagai berikut:

  • Fitur terjemahan sejarah:Informasi tahap sebelumnya diperoleh melalui penerjemahan sejarah; seperti terlihat pada gambar di bawah ini, informasi waktu d-1 dapat diberikan ke waktu d, dan informasi waktu d dapat diberikan ke waktu d+1, sehingga dapat diwujudkan. konstruksi fitur satu unit terjemahan.

  • Karakteristik statistik jendela: Statistik jendela dapat membuat ukuran jendela yang berbeda, lalu menghitung informasi mean, maksimum, minimum, median, dan varians berdasarkan rentang jendela, yang dapat mencerminkan perubahan data pada tahap terkini. Seperti ditunjukkan pada gambar di bawah, informasi dari tiga satuan waktu sebelum momen d dapat dikonstruksi secara statistik untuk menghasilkan momen 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) Pelatihan model dan prediksi set pengujian

    Memilih untuk menggunakan model Lightgbm biasanya digunakan sebagai model dasar dalam kompetisi penambangan data. Model ini dapat memperoleh skor yang relatif stabil tanpa memerlukan penyesuaian parameter proses. Selain itu, perlu diperhatikan bahwa konstruksi set pelatihan dan set verifikasi, karena data memiliki hubungan deret waktu, dibagi secara ketat menurut deret waktu. Di sini, kumpulan data pelatihan asli dt adalah 30 sebagai pelatihan data, dan data sebelumnya digunakan sebagai data verifikasi, hal ini memastikan tidak ada masalah persilangan dalam data (data masa depan tidak digunakan untuk memprediksi data historis).

  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)

mendapatkanPecahan.

4. Lanjutan

Pentingnya rekayasa fitur sudah jelas

Saya menambahkan beberapa fitur lagi, saya dapat menambahkan lebih banyak lagi, tetapi colab tidak memiliki cukup memori.

Ada jutaan data, dan tidak ada cara untuk menambahkan lebih banyak fitur. Mari kita lihat cara mengoptimalkannya nanti.