私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. コンテストの紹介
世界経済の急速な発展と都市化の加速に伴い、電力システムは増大する課題に直面しています。電力需要の正確な予測は、送電網の安定した運用、効果的なエネルギー管理、再生可能エネルギー源の統合にとって非常に重要です。
2. イベントタスク
複数の住宅に対応する N 日間の電力使用量履歴の関連シーケンス データとその他の情報が与えられた場合、各住宅に対応する電力使用量を予測します。
2024 iFLYTEK AI 開発者コンペティション - iFLYTEK オープン プラットフォーム
3.タスク 2: 高度な lightgbm、特徴量エンジニアリングの開始
(1) インポートモジュール:このセクションには、コードに必要なモジュールが含まれています
- 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) データの準備
データ準備段階では主に学習データやテストデータを読み込み、基礎的なデータの表示を行います。
- train = pd.read_csv('./data/train.csv')
- test = pd.read_csv('./data/test.csv')
データの簡単な紹介:このうち、id はハウス ID、dt は日識別子、最小トレーニング データ dt は 11、異なる ID は異なるシーケンス長に対応し、ハウス タイプは一般的に、比較的大きな違いがあります。さまざまなタイプの住宅の消費電力量を目標とし、このコンペティションの予測目標でもあります。以下は、データを簡単に理解するのに役立つ簡単な視覚的分析です。
さまざまなタイプに対応するターゲットのヒストグラム
- 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()
dt に従ったシーケンスとして ID が 00037f39cf であるターゲットの折れ線グラフ
- 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) 特徴量エンジニアリング
ここでは主に履歴翻訳機能とウィンドウ統計機能を構築します。各機能は十分に根拠があり、以下で詳しく説明します。
歴史的翻訳の特徴:前段階の情報は、下図のように履歴変換によって取得され、時刻 d-1 の情報を時刻 d に、時刻 d の情報を時刻 d+1 に与えることができます。翻訳の 1 単位の特徴構造。
ウィンドウの統計的特性:ウィンドウ統計では、さまざまなウィンドウ サイズを構築し、ウィンドウ範囲に基づいて平均、最大、最小、中央値、分散情報を計算できます。これにより、最新の段階でのデータの変化を反映できます。以下の図に示すように、d モーメント以前の 3 つの時間単位の情報を統計的に構築して 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) モデルのトレーニングとテストセットの予測
Lightgbm モデルの使用を選択すると、通常、データ マイニング コンテストのベースライン モデルとして使用され、プロセス パラメーターの調整を必要とせずに比較的安定したスコアを取得できます。なお、訓練セットと検証セットの構築は、データには時系列の関係があるため、厳密に時系列に応じて分割されることに注意すべきである。ここで、訓練としての元の訓練データセットdtは30である。これにより、データに交差の問題がないことが保証されます (過去のデータを予測するために将来のデータは使用されません)。
- 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)
得る分数。
4.上級者向け
特徴量エンジニアリングの重要性は自明のことです
さらにいくつかの機能を追加しました。さらに追加することもできましたが、colab に十分なメモリがありませんでした。
数百万のデータがあり、これ以上の機能を追加する方法はありません。それを最適化する方法を後で見てみましょう。