2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. Kilpailun esittely
Maailmantalouden nopean kehityksen ja kaupungistumisen kiihtymisen myötä sähköjärjestelmä kohtaa yhä enemmän haasteita. Sähkön kysynnän tarkka ennustaminen on keskeistä sähköverkon vakaan toiminnan, tehokkaan energianhallinnan ja uusiutuvien energialähteiden integroinnin kannalta.
2. Tapahtumatehtävät
Ennustele taloja vastaava sähkönkulutus, kun otetaan huomioon asiaankuuluvat järjestystiedot ja muut tiedot N päivän sähkönkulutushistoriasta, jotka vastaavat useita taloja.
2024 iFLYTEK AI Developer Competition - iFLYTEK Open Platform
3. Tehtävä 2: Edistynyt lightgbm, aloita ominaisuuden suunnittelu
(1) Tuo moduuli:Tämä osio sisältää koodin edellyttämät moduulit
- 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) Tietojen valmistelu
Tietojen valmisteluvaiheessa luetaan pääasiassa harjoitusdataa ja testidataa ja suoritetaan perustietojen näyttö.
- train = pd.read_csv('./data/train.csv')
- test = pd.read_csv('./data/test.csv')
Lyhyt johdatus dataan: Niistä id on talon tunnus, dt on päivätunniste, vähimmäisharjoitusdata dt on 11 ja eri tunnukset vastaavat eri sekvenssin pituuksia. Yleisesti ottaen ero on suhteellisen suuri erilaisten talojen kulutustavoite on todellinen virrankulutus, joka on myös ennustetavoitteemme tässä kilpailussa. Seuraava on yksinkertainen visuaalinen analyysi, joka auttaa meitä ymmärtämään tiedot yksinkertaisesti.
Eri tyyppejä vastaavien kohteiden histogrammi
- 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()
Kohteen viivakaavio, jonka tunnus on 00037f39cf sekvenssinä dt:n mukaisesti
- 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) Ominaisuussuunnittelu
Tässä rakennamme pääasiassa historiallisia käännösominaisuuksia ja ikkunan tilastollisia ominaisuuksia, ja jokainen ominaisuus on perusteltu ja selitetään yksityiskohtaisesti seuraavasti:
Historiallisen käännösominaisuudet:Edellisen vaiheen tiedot saadaan alla olevan kuvan osoittamalla tavalla, ajan d-1 tiedot voidaan antaa ajalle d ja ajan d tiedot ajalle d+1, jolloin toteutuu; yhden käännösyksikön ominaisuusrakenne.
Ikkunan tilastolliset ominaisuudet: Ikkunatilastot voivat muodostaa eri ikkunoiden kokoja ja laskea sitten ikkunaalueen perusteella keski-, maksimi-, minimi-, mediaani- ja varianssitiedot, jotka voivat heijastaa tiedoissa viimeisimmän vaiheen muutoksia. Kuten alla olevasta kuvasta näkyy, kolmen aikayksikön tiedot ennen d-hetkeä voidaan tilastollisesti konstruoida antamaan minulle d-hetki.
- # 合并训练数据和测试数据,并进行排序
- 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) Mallin koulutus ja testisarjan ennustaminen
Valinta käyttää Lightgbm-mallia käytetään yleensä perusmallina tiedonlouhintakilpailuissa. Se voi saada suhteellisen vakaat pisteet ilman prosessiparametrien säätöä. Lisäksi on huomioitava, että harjoitusjoukon rakenne ja varmistusjoukko, koska tiedoilla on aikasarjasuhde, on jaettu tiukasti aikasarjan mukaan tiedot, ja aiempia tietoja käytetään vahvistustietoina, tämä varmistaa, että tiedoissa ei ole ristiinongelmia (tulevaisuuden tietoja ei käytetä historiallisten tietojen ennustamiseen).
- 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)
saadaMurto-osa.
4. Edistynyt
Ominaisuuden suunnittelun merkitys on itsestään selvä
Lisäsin joitakin ominaisuuksia, olisin voinut lisätä enemmän, mutta colabissa ei ollut tarpeeksi muistia.
Dataa on miljoonia, eikä ominaisuuksia voi lisätä. Katsotaanpa, kuinka se voidaan optimoida myöhemmin.