datawhale AI夏令营 AI经济 Tast3 10999.2512

空口也只是白 2024-08-11 15:31:02 阅读 95

 赛题背景

对于电力市场中主体博弈产生的结算价格的预测具有重要的理论和现实意义。电力部门推动能源转型促进可持续发展的主体。因此,对电力市场主体行为的分析以及最终的市场结算价格的预测能够促进多学科融合,推动电力部门以及电力市场的产业转型。此外,可靠的电力系统保障社会稳定与安全,提升应急响应能力,并增强国家的全球竞争力和未来应对挑战的能力。

 数据集说明

评价指标

时间序列预测lightgbm+线性回归

经过几天的学习和数据的探索,对特征进行了创重新的构造,主要是基于对时间的特征提取,代码如下,并对部分特征做onehot独热编码

import holidays

def create_features(df):

    df = df.copy()

    df["hour"] = df.index.hour

    df["day"] = df.index.day

    df["weekday"] = df.index.weekday

    df["month"] = df.index.month

    df["quarter"] = df.index.quarter

    df["year"] = df.index.year

    df["is_windy_season"] = df.index.month.isin([1, 2, 3, 4, 5, 9, 10, 11, 12])

    df["is_valley"] = df.index.hour.isin([10, 11, 12, 13, 14, 15])

    china_holidays = holidays.China()

    df['days_is_holidays']=df.index.map(lambda x: x in china_holidays).astype(int)

    return df

df = create_features(electricity_price)

# 对时间特征进行独热编码(One-Hot Encoding),删除第一列以避免多重共线性

df2 = pd.get_dummies(

    data=df,        # 需要进行独热编码的 DataFrame

    columns=["hour", "day", "month", "year", "weekday","quarter"],  # 需要独热编码的列

    drop_first=True         # 删除第一列以避免多重共线性

)

     当然我觉得后续可以尝试做不同的编码提高模型,可以参考知乎这个文章深度盘点:类别型特征编码方法总结 - 知乎 (zhihu.com)

 

然后对时间数据做了一些滑窗特征,滞后特征,移动均值等

def cal_range(x):

    return x.max() - x.min()

def increase_num(x):

    return (x.diff() > 0).sum()

def decrease_num(x):

    return (x.diff() < 0).sum()

def increase_mean(x):

    diff = x.diff()

    return diff[diff > 0].mean()

def decrease_mean(x):

    diff = x.diff()

    return diff[diff < 0].abs().mean()

def increase_std(x):

    diff = x.diff()

    return diff[diff > 0].std()

def decrease_std(x):

    diff = x.diff()

    return diff[diff < 0].std() 

 但是时间尽管做了这些特征构造,结果实际上还是很有限大概在12500左右,然后引入了第一篇的思路,加入通过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)

print(len(prices))

prices[:5]

训练模型

下面这个模型我是做了数据集划分,我想先自己测试一下模型的结果,但是可以看到,训练集和测试集差距过大,因为这个时间数据的特点,导致训练集和测试集分布差距过大,可以通过时序图和分布图观察。

使用所有数据过后,可以看到结果为7090.3415,但是我发现catboost和xgboost的训练结果远远优于lightgbm,线性回归,前两个结果在3600-3900,后两个在7000-18000左右,但是提交到官方后后面两个结果反而更好,难道这个越大越好吗,不是很理解这点,后面我把4个模型融合过后,结果在11500-11900,最好的一次成绩是lightgbm和线性回归融合结果为10999.2512

 

后续可以提高成绩的方法(初步想法)

继续做特征工程,构造更多更有效的特征,深度挖掘信息

引入其他有效的数据集

在现有的模型上进一步优化,模型融合,参数调优(费时),交叉验证

构造更复杂的模型,比如深度学习,强化学习,神经网络等

研究两个表之间的关联,能不能得到其他的有效信息,包括建立规划模型等



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。