“市场博弈与价格挑战赛”&Task2(这次大失败了呜呜)#Datawhale AI 夏令营 #Datawhale #夏令营第三期

#Datawhale AI 夏令营 #Datawhale #夏令营第三期

这周夏令营发布了Task2,在Task1的Baseline的基础上提供两个改进方向。其一是引入时间序列挖掘,进一步提升性能;其二是使用赛方推荐到ABM模型。首先,我了解了一下指南2中对时间序列在此案例中的应用,按照指南2的步骤,自己重新通过魔塔跑出的结果来看,确实挖掘出很多原先表格中无法直观看出的信息,这里放几张我自己跑的结果截图:

然而,问题来了,我该如何将时间序列应用到Baseline的改进中呢(这对我这个第一次接触代码,第一次接触这些模型的小白来说太不友好了,不知道如何操作改进,也不知应该从哪里去学习这类知识)。因为就Task1来说,我只是傻傻地按照指南1提供的代码,遵循指南1提供的步骤去做即可。但是Task2重点介绍时间序列后,提供的时间序列代码该如何用于Baseline的改进,这是我遇到的困难。我试图借助一个人工智能模型来处理,我提供给他Baseline的代码,希望它结合时间序列予以改进,并给我生成改进后的代码,它为我生成了如下代码:

import numpy as np
import pandas as pd
from pathlib import Path
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

# 数据准备部分保持不变
base_path = Path("data")
electricity_price = pd.read_csv(base_path / "electricity price.csv")
unit = pd.read_csv(base_path / "unit.csv")

sample_submit = electricity_price[electricity_price["clearing price (CNY/MWh)"].isna()].drop(columns="demand")
sample_submit.to_csv(base_path / "sample_submit.csv", index=False)

electricity_price["timestamp"] = pd.to_datetime(
    electricity_price["day"] + " " + electricity_price["time"].str.replace("24:00:00", "00:00"))

mask = electricity_price['timestamp'].dt.time == pd.Timestamp('00:00:00').time()
electricity_price.loc[mask, 'timestamp'] += pd.Timedelta(days=1)

electricity_price = electricity_price[["timestamp", "demand", "clearing price (CNY/MWh)"]]

# 特征工程:添加时间相关特征
electricity_price['hour'] = electricity_price['timestamp'].dt.hour
electricity_price['day_of_week'] = electricity_price['timestamp'].dt.dayofweek
electricity_price['month'] = electricity_price['timestamp'].dt.month

# ABM部分保持不变
sorted_unit = unit.sort_values("coal consumption (g coal/KWh)")
sorted_unit['cumulative_capacity'] = sorted_unit['Capacity(MW)'].cumsum()

prices = []
for demand in electricity_price["demand"]:
    price = sorted_unit[sorted_unit['cumulative_capacity'] >= demand]["coal consumption (g coal/KWh)"].iloc[0]
    prices.append(price)

# 将ABM结果添加为新特征
electricity_price['abm_price'] = prices

# 准备数据
train_length = 55392
X = electricity_price[['demand', 'hour', 'day_of_week', 'month', 'abm_price']].iloc[:train_length]
y = electricity_price["clearing price (CNY/MWh)"].iloc[:train_length]

# 标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 分割训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 线性回归模型
lr_model = LinearRegression()
lr_model.fit(X_train, y_train)
lr_pred = lr_model.predict(X_val)
lr_mse = mean_squared_error(y_val, lr_pred)
print(f"Linear Regression MSE: {lr_mse}")

# SARIMA模型
sarima_model = SARIMAX(y_train, order=(1, 1, 1), seasonal_order=(1, 1, 1, 24))
sarima_results = sarima_model.fit()
sarima_pred = sarima_results.forecast(steps=len(y_val))
sarima_mse = mean_squared_error(y_val, sarima_pred)
print(f"SARIMA MSE: {sarima_mse}")

# 混合模型:结合线性回归和SARIMA的结果
combined_pred = 0.5 * lr_pred + 0.5 * sarima_pred
combined_mse = mean_squared_error(y_val, combined_pred)
print(f"Combined Model MSE: {combined_mse}")

# 使用混合模型进行最终预测
X_test = electricity_price[['demand', 'hour', 'day_of_week', 'month', 'abm_price']].iloc[train_length:]
X_test_scaled = scaler.transform(X_test)
lr_final_pred = lr_model.predict(X_test_scaled)
sarima_final_pred = sarima_results.forecast(steps=len(X_test))
final_pred = 0.5 * lr_final_pred + 0.5 * sarima_final_pred

# 保存结果
sample_submit["clearing price (CNY/MWh)"] = final_pred
sample_submit.to_csv("submit.csv", index=False)

# 可视化结果
plt.figure(figsize=(12, 6))
plt.plot(electricity_price['timestamp'][:train_length], y[:train_length], label='Actual')
plt.plot(electricity_price['timestamp'][train_length:], final_pred, label='Predicted')
plt.title('Electricity Price Prediction')
plt.xlabel('Time')
plt.ylabel('Price (CNY/MWh)')
plt.legend()
plt.show()

结果,就报错了。然后,我在这个代码的基础上进一步问询做了一些修改,还是存在问题(当时做不出来直接关掉,忘记留存报错的的截图了),总之一错到底。

文章写到这里,如果有大佬恰巧看到并且有时间的话,烦请辛苦下大佬给予指导,我应该如何利用时间序列来改进Baseline,人工智能给出的结果又错在了何处呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值