2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. Einführung in den Wettbewerb
Mit der rasanten Entwicklung der Weltwirtschaft und der Beschleunigung der Urbanisierung steht das Energiesystem vor wachsenden Herausforderungen. Eine genaue Prognose des Strombedarfs ist für den stabilen Betrieb des Stromnetzes, ein effektives Energiemanagement und die Integration erneuerbarer Energiequellen von entscheidender Bedeutung.
2. Event-Aufgaben
Prognostizieren Sie anhand der relevanten Sequenzdaten und anderer Informationen über N Tage des Stromverbrauchsverlaufs für mehrere Häuser den Stromverbrauch für die Häuser.
2024 iFLYTEK AI Developer Competition – iFLYTEK Open Platform
3.Aufgabe 2: Erweitertes LightGBM, Feature-Engineering starten
(1) Importmodul:Dieser Abschnitt enthält die für den Code erforderlichen Module
- import numpy as np
- import pandas as pd
- import lightgbm as lgb
- from sklearn.metrics import mean_squared_log_error, mean_absolute_error
- import tqdm
- import sys
- import os
- import gc
- import argparse
- import warnings
- warnings.filterwarnings('ignore')
(2) Datenaufbereitung
In der Datenvorbereitungsphase werden hauptsächlich Trainingsdaten und Testdaten gelesen und eine grundlegende Datenanzeige durchgeführt.
- train = pd.read_csv('./data/train.csv')
- test = pd.read_csv('./data/test.csv')
Eine kurze Einführung in die Daten: Unter diesen ist id die Haus-ID, dt die Tageskennung, die minimale Trainingsdatenzahl dt beträgt 11 und unterschiedliche IDs entsprechen unterschiedlichen Sequenzlängen. Im Allgemeinen gibt es einen relativ großen Unterschied im Gesamtbild Der Zielwert für den Stromverbrauch verschiedener Haustypen ist der tatsächliche Stromverbrauch, der auch unser Prognoseziel für diesen Wettbewerb ist. Das Folgende ist eine einfache visuelle Analyse, die uns helfen soll, die Daten einfach zu verstehen.
Histogramm von Zielen, die verschiedenen Typen entsprechen
- import matplotlib.pyplot as plt
- # 不同type类型对应target的柱状图
- type_target_df = train.groupby('type')['target'].mean().reset_index()
- plt.figure(figsize=(8, 4))
- plt.bar(type_target_df['type'], type_target_df['target'], color=['blue', 'green'])
- plt.xlabel('Type')
- plt.ylabel('Average Target Value')
- plt.title('Bar Chart of Target by Type')
- plt.show()
Das Liniendiagramm des Ziels mit der ID 00037f39cf als Sequenz gemäß dt
- specific_id_df = train[train['id'] == '00037f39cf']
- plt.figure(figsize=(10, 5))
- plt.plot(specific_id_df['dt'], specific_id_df['target'], marker='o', linestyle='-')
- plt.xlabel('DateTime')
- plt.ylabel('Target Value')
- plt.title("Line Chart of Target for ID '00037f39cf'")
- plt.show()
(3) Feature-Engineering
Hier konstruieren wir hauptsächlich historische Übersetzungsmerkmale und Fensterstatistikmerkmale. Jedes Merkmal ist fundiert und wird wie folgt ausführlich erläutert:
Historische Übersetzungsfunktionen:Die Informationen der vorherigen Stufe werden durch historische Übersetzung erhalten. Wie in der folgenden Abbildung gezeigt, können die Informationen der Zeit d-1 der Zeit d und die Informationen der Zeit d der Zeit d + 1 gegeben werden, wodurch realisiert wird die Merkmalskonstruktion einer Übersetzungseinheit.
Statistische Fenstereigenschaften: Fensterstatistiken können unterschiedliche Fenstergrößen erstellen und dann die Mittelwert-, Maximal-, Minimal-, Median- und Varianzinformationen basierend auf dem Fensterbereich berechnen, die die Änderungen in den Daten in der letzten Phase widerspiegeln können. Wie in der Abbildung unten gezeigt, können die Informationen der drei Zeiteinheiten vor dem d-Moment statistisch so konstruiert werden, dass sie mir den d-Moment ergeben.
- # 合并训练数据和测试数据,并进行排序
- data = pd.concat([test, train], axis=0, ignore_index=True)
- data = data.sort_values(['id','dt'], ascending=False).reset_index(drop=True)
-
- # 历史平移
- for i in range(10,30):
- data[f'last{i}_target'] = data.groupby(['id'])['target'].shift(i)
-
- # 窗口统计
- data[f'win3_mean_target'] = (data['last10_target'] + data['last11_target'] + data['last12_target']) / 3
-
- # 进行数据切分
- train = data[data.target.notnull()].reset_index(drop=True)
- test = data[data.target.isnull()].reset_index(drop=True)
-
- # 确定输入特征
- train_cols = [f for f in data.columns if f not in ['id','target']]
4) Modelltraining und Testsatzvorhersage
Die Verwendung des Lightgbm-Modells wird normalerweise als Basismodell bei Data-Mining-Wettbewerben verwendet. Es kann relativ stabile Ergebnisse erzielen, ohne dass eine Anpassung der Prozessparameter erforderlich ist. Darüber hinaus ist zu beachten, dass die Konstruktion des Trainingssatzes und des Verifizierungssatzes aufgrund der Zeitreihenbeziehung streng nach Zeitreihen unterteilt ist. Hier beträgt der ursprüngliche Trainingsdatensatz dt 30 als Training Daten, und die vorherigen Daten werden als Verifizierungsdaten verwendet. Dadurch wird sichergestellt, dass es in den Daten kein Kreuzungsproblem gibt (zukünftige Daten werden nicht zur Vorhersage historischer Daten verwendet).
- def time_model(clf, train_df, test_df, cols):
- # 训练集和验证集切分
- trn_x, trn_y = train_df[train_df.dt>=31][cols], train_df[train_df.dt>=31]['target']
- val_x, val_y = train_df[train_df.dt<=30][cols], train_df[train_df.dt<=30]['target']
- # 构建模型输入数据
- train_matrix = clf.Dataset(trn_x, label=trn_y)
- valid_matrix = clf.Dataset(val_x, label=val_y)
- # lightgbm参数
- lgb_params = {
- 'boosting_type': 'gbdt',
- 'objective': 'regression',
- 'metric': 'mse',
- 'min_child_weight': 5,
- 'num_leaves': 2 ** 5,
- 'lambda_l2': 10,
- 'feature_fraction': 0.8,
- 'bagging_fraction': 0.8,
- 'bagging_freq': 4,
- 'learning_rate': 0.05,
- 'seed': 2024,
- 'nthread' : 16,
- 'verbose' : -1,
- }
- # 训练模型
- model = clf.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix],
- categorical_feature=[], verbose_eval=500, early_stopping_rounds=500)
- # 验证集和测试集结果预测
- val_pred = model.predict(val_x, num_iteration=model.best_iteration)
- test_pred = model.predict(test_df[cols], num_iteration=model.best_iteration)
- # 离线分数评估
- score = mean_squared_error(val_pred, val_y)
- print(score)
-
- return val_pred, test_pred
-
- lgb_oof, lgb_test = time_model(lgb, train, test, train_cols)
-
- # 保存结果文件到本地
- test['target'] = lgb_test
- test[['id','dt','target']].to_csv('submit.csv', index=None)
erhaltenFraktion.
4.Fortgeschritten
Die Bedeutung des Feature Engineering liegt auf der Hand
Ich habe einige weitere Funktionen hinzugefügt, ich hätte noch mehr hinzufügen können, aber Colab hatte nicht genug Speicher.
Es gibt Millionen von Daten und es gibt keine Möglichkeit, weitere Funktionen hinzuzufügen. Schauen wir uns später an, wie wir sie optimieren können.