Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. Introducción al concurso
Con el rápido desarrollo de la economía global y la aceleración de la urbanización, el sistema eléctrico enfrenta desafíos cada vez mayores. La previsión precisa de la demanda de electricidad es crucial para el funcionamiento estable de la red eléctrica, la gestión eficaz de la energía y la integración de fuentes de energía renovables.
2. Tareas de eventos
Dados los datos de secuencia relevantes y otra información de N días de historial de consumo de electricidad correspondiente a varias casas, prediga el consumo de electricidad correspondiente a las casas.
Concurso de desarrolladores de IA iFLYTEK 2024: plataforma abierta iFLYTEK
3.Tarea 2: Lightgbm avanzado, iniciar ingeniería de funciones
(1) Módulo de importación:Esta sección contiene los módulos requeridos por el 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) Preparación de datos
En la etapa de preparación de datos, se leen principalmente los datos de entrenamiento y de prueba y se muestran los datos básicos.
- train = pd.read_csv('./data/train.csv')
- test = pd.read_csv('./data/test.csv')
Una breve introducción a los datos: Entre ellos, id es el ID de la casa, dt es el identificador del día, los datos de entrenamiento mínimos dt son 11 y diferentes ID corresponden a diferentes longitudes de secuencia. En términos generales, existe una diferencia relativamente grande en el tipo de casa. El consumo de diferentes tipos de casas; el objetivo es el consumo de energía real, que también es nuestro objetivo de predicción para esta competencia. El siguiente es un análisis visual simple para ayudarnos a tener una comprensión simple de los datos.
Histograma de objetivos correspondientes 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()
El gráfico de líneas del objetivo con ID como 00037f39cf como secuencia según 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) Ingeniería de funciones
Aquí construimos principalmente características de traducción histórica y características estadísticas de ventana, cada característica está bien fundamentada y se explica en detalle a continuación:
Funciones de traducción histórica:La información de la etapa anterior se obtiene mediante traducción histórica como se muestra en la figura siguiente, la información del tiempo d-1 se puede pasar al tiempo d, y la información del tiempo d se puede pasar al tiempo d+1, logrando así la construcción característica de una unidad de traducción.
Características estadísticas de la ventana: Las estadísticas de ventana pueden construir diferentes tamaños de ventana y luego calcular la información media, máxima, mínima, mediana y varianza en función del rango de ventana, que puede reflejar los cambios en los datos en la etapa más reciente. Como se muestra en la figura siguiente, la información de las tres unidades de tiempo antes del momento d se puede construir estadísticamente para darme el 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) Entrenamiento de modelos y predicción de conjuntos de pruebas.
La elección de utilizar el modelo Lightgbm se suele utilizar como modelo de referencia en competiciones de minería de datos. Puede obtener puntuaciones relativamente estables sin necesidad de ajustar los parámetros del proceso. Además, cabe señalar que la construcción del conjunto de entrenamiento y el conjunto de verificación, debido a que los datos tienen una relación de serie de tiempo, se divide estrictamente de acuerdo con la serie de tiempo. Aquí, el conjunto de datos de entrenamiento original dt es 30 como entrenamiento. datos, y los datos anteriores se utilizan como datos de verificación, lo que garantiza que no haya problemas de cruce en los datos (los datos futuros no se utilizan para predecir datos 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)
conseguirFracción.
4.Avanzado
La importancia de la ingeniería de características es evidente
Agregué algunas funciones más, podría haber agregado más, pero colab no tenía suficiente memoria.
Hay millones de datos y no hay forma de agregar más funciones. Veamos cómo optimizarlos más adelante.