minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. Introdução à competição
Com o rápido desenvolvimento da economia global e a aceleração da urbanização, o sistema energético enfrenta desafios crescentes. A previsão precisa da procura de eletricidade é crucial para o funcionamento estável da rede elétrica, a gestão eficaz da energia e a integração de fontes de energia renováveis.
2. Tarefas de evento
Dados os dados sequenciais relevantes e outras informações do histórico de consumo de eletricidade de N dias correspondentes a múltiplas casas, preveja o consumo de eletricidade correspondente às casas.
Competição de desenvolvedores de IA iFLYTEK 2024 - plataforma aberta iFLYTEK
3.Tarefa 2: Lightgbm avançado, iniciar engenharia de recursos
(1) Módulo de importação:Esta seção contém os módulos exigidos pelo código
- 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) Preparação de dados
No estágio de preparação de dados, os dados de treinamento e de teste são principalmente lidos e a exibição de dados básicos é realizada.
- train = pd.read_csv('./data/train.csv')
- test = pd.read_csv('./data/test.csv')
Uma breve introdução aos dados: Entre eles, id é o ID da casa, dt é o identificador do dia, os dados de treinamento mínimos dt são 11 e IDs diferentes correspondem a diferentes comprimentos de sequência. Em geral, há uma diferença relativamente grande no geral; a meta de consumo de diferentes tipos de casas é o consumo real de energia, que também é nossa meta de previsão para esta competição. A seguir está uma análise visual simples para nos ajudar a ter uma compreensão simples dos dados.
Histograma de alvos correspondentes a diferentes tipos
- 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()
O gráfico de linhas do alvo com id como 00037f39cf como sequência de acordo com 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) Engenharia de recursos
Aqui construímos principalmente recursos de tradução histórica e recursos estatísticos de janela, cada recurso é bem fundamentado e explicado em detalhes a seguir:
Recursos de tradução histórica:A informação da etapa anterior é obtida através da tradução histórica conforme mostra a figura abaixo, a informação do tempo d-1 pode ser dada ao tempo d, e a informação do tempo d pode ser dada ao tempo d+1, concretizando assim a construção de recursos de uma unidade de tradução.
Características estatísticas da janela: As estatísticas de janela podem construir diferentes tamanhos de janela e, em seguida, calcular as informações de média, máximo, mínimo, mediana e variância com base no intervalo da janela, o que pode refletir as alterações nos dados no estágio mais recente. Conforme mostrado na figura abaixo, as informações das três unidades de tempo antes do momento d podem ser construídas estatisticamente para me dar o momento d.
- # 合并训练数据和测试数据,并进行排序
- 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) Treinamento de modelo e previsão de conjunto de testes
A escolha de usar o modelo Lightgbm é geralmente usado como modelo básico em competições de mineração de dados. Ele pode obter pontuações relativamente estáveis sem a necessidade de ajuste de parâmetros de processo. Além disso, deve-se notar que a construção do conjunto de treinamento e do conjunto de verificação, porque os dados têm um relacionamento de série temporal, é estritamente dividido de acordo com a série temporal. Aqui, o conjunto de dados de treinamento original dt é 30 como o treinamento. dados, e os dados anteriores são usados como dados de verificação, isso garante que não haja problema de cruzamento nos dados (dados futuros não são usados para prever dados históricos).
- 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)
pegarFração.
4.Avançado
A importância da engenharia de recursos é evidente
Adicionei mais alguns recursos, poderia ter adicionado mais, mas o colab não tinha memória suficiente.
Existem milhões de dados e não há como adicionar mais recursos. Vamos ver como otimizá-los mais tarde.