国电投-光伏电站人工智能运维大数据处理分析比赛(记录)

news2024/12/24 9:56:18

前言

1-1 简介

        DataFountain平台举办的比赛,赛题:光伏电站人工智能运维大数据处理分析。以下是比赛链接:光伏电站人工智能运维大数据处理分析 Competitions - DataFountain

1-2 任务背景

        在分析光伏发电原理的基础上,论证了辐照度、光伏板工作温度等影响光伏输出功率的因素,通过实时监测的光伏板运行状态参数和气象参数建立预测模型,预估光伏电站瞬时发电量。其中光伏板运行状态参数包括太阳能电池板背板温度、其组成的光伏阵列的电压和电流;气象参数包括太阳能辐照度、环境温湿度、风速、风向等。本质为回归任务,通过多个维度的X去预测发电量Y。

1-3 数据介绍

 其中比赛官网给出了各个字段的详细介绍;

表格字段及含义如下:
  ID:当前记录条数; 
  板温:光伏电池板背测温度;
  现场温度:光伏电站现场温度;
  转换效率:为计算得到的平均转换效率;
  转换效率A:数据采集点A处的光伏板转换效率;
  转换效率B:数据采集点B处的光伏板转换效率;
  转换效率C:数据采集点C处的光伏板转换效率;
  转换效率D:数据采集点D处的光伏板转换效率;
  电压A:为数据采集点A处汇流箱电压值;
  电压B:为数据采集点B处汇流箱电压值;
  电压C:为数据采集点C处汇流箱电压值;
  电压D:为数据采集点D处汇流箱电压值;
  电流A:为采集点A处汇流箱电流值;
  电流B:为采集点B处汇流箱电流值;
  电流C:为采集点C处汇流箱电流值;
  电流D:为采集点D处汇流箱电流值;
  功率A:为采集点A处的功率Pa,P=UI;
  功率B:为采集点B处的功率Pb,P=UI;
  功率C:为采集点C处的功率Pc,P=UI;
  功率D:为采集点D处的功率Pd,P=UI;
  平均功率:为A、B、C三点功率的平均值:(Pa+Pb+Pc)/3;
  风速:为光伏电厂现场风速测量值;
  风向:为光伏电厂现场风的来向;
  预估发电量为:需经过参赛者分析计算得到的预测功率值;

2 任务实现

2-1 深度学习-多元线性回归

        赛题任务是根据多个自变量X(板温、温度等) 来确定唯一的因变量Y(光伏发电量),非常典型的多元线性回归任务。多元回归任务的公式如下:

        y = {k_{1}} x_{1}+ {k_{2}} x_{2}+ {k_{3}} x_{3}+ ...+{k_{n}} x_{n}+ b

 2-1-1 导入工具库

import pandas as pd
import numpy as np
import torch 
import torch.nn
from sklearn.preprocessing import scale
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

2-1-2  查看数据

train_data_path = '/home/zhenhengdong/WORk/Relation_Extraction/Jupyter_files/Codes/Untitled Folder/public.train.csv'
Train_data = pd.read_csv(train_data_path)
test_data_path = '/home/zhenhengdong/WORk/Relation_Extraction/Jupyter_files/Codes/Untitled Folder/test_data.csv'
Test_data = pd.read_csv(test_data_path)

2-1-3  读入数据

        采用np.loadtxt()方法读入数据。原始数据中每一行包含20个维度的X与一个Y,将X和Y进行分割。

#跳过表头,并且设置数据格式
train_XY  = np.loadtxt(train_data_path, delimiter=',', skiprows = 1,dtype=np.float32)
test_XY = np.loadtxt(test_data_path, delimiter=',', skiprows = 1,dtype=np.float32)

#分割多维度X和Y
TrainX_data = torch.from_numpy(train_XY[:, 1:-1])# 除去id后 取前20列 
TrainY_data = torch.from_numpy(train_XY[:, [-1]])# 取最后1列

TestX_data = torch.from_numpy(test_XY[:, 1:-1])# 除去id后 取前20列 
TestY_data = torch.from_numpy(test_XY[:, [-1]])# 取最后1列

 2-1-4 数据归一化

#归一化
TrainX_data, TrainY_data = torch.FloatTensor(scale(TrainX_data)), torch.unsqueeze(torch.FloatTensor(TrainY_data), dim=1)
#归一化
TestX_data, TestY_data = torch.FloatTensor(scale(TestX_data)), torch.unsqueeze(torch.FloatTensor(TestY_data), dim=1)

 2-1-5 定义模型结构

        由于是多元线性回归任务,在模型定义中采用线性层和激活函数搭配的方式进行构建。其中采用Relu()函数作为激活函数。激活函数可以设定设定了一个中间层hidden_num。

class Net(torch.nn.Module):
    def __init__(self, input_num, hidden_num, output_num):
        super(Net, self).__init__()
        self.net = torch.nn.Sequential(
            torch.nn.Linear(input_num, hidden_num),
            torch.nn.ReLU(),
            torch.nn.Linear(hidden_num, output_num),
            torch.nn.ReLU()
        )
    def forward(self, input):
        return self.net(input)

2-1-6 实例化模型

        模型实例化中,将输入维度设定为19,采用了数据中的19的维度(除去设备id),中间层进行过渡,将19维度的信息转换为10维度,并采用激活函数进行变换,最后将10维度的数据转换为1维。

net = Net(input_num=19, hidden_num=10, output_num=1)

 2-1-7 设置超参数

epochs = 500
learning_rate = 0.001
batch_size = 10
total_step = int(TrainX_data.shape[0] / batch_size)

2-1-8 定义优化器与损失函数  

        采用Adam优化器,Adam优化器结合了AdaGrad和RMSProp两种优化算法的优点。对梯度的一阶矩估计(First Moment Estimation,即梯度的均值)和二阶矩估计(Second Moment Estimation,即梯度的未中心化的方差)进行综合考虑,计算出更新步长

        损失函数测量输入x和目标y中每个元素之间的均方误差。

optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)
loss_func = torch.nn.MSELoss()

2-1-9 定义参数重置函数

        保证每次重新执行for循环时从开始训练。

def weight_reset(m):
    if isinstance(m, torch.nn.Conv2d) or isinstance(m, torch.nn.Linear):
        m.reset_parameters()

2-1-10 开始训练

%%time
net.apply(weight_reset)
epoch_train_loss_value = []
step_train_loss_value = []
epoch_valid_loss_value = []

for i in range(epochs):
    for step in range(total_step):
        xs = TrainX_data[step * batch_size:(step + 1) * batch_size, :]
        ys = TrainY_data[step * batch_size:(step + 1) * batch_size]
        prediction = net(xs)
        loss = loss_func(prediction, ys)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        step_train_loss_value.append(loss.cpu().detach().numpy())
    valid_loss = loss_func(net(TestX_data), TestY_data)
    epoch_valid_loss_value.append(valid_loss)
    epoch_train_loss_value.append(np.mean(step_train_loss_value))
    if i%50==0:
        print('epoch={:3d}/{:3d}, train_loss={:.4f}, valid_loss={:.4f}'.format(i + 1,
                                                                    epochs,
                                                                    np.mean(step_train_loss_value),
                                                                    valid_loss))

2-1-11 损失值可视化 

new_epoch_valid_loss_value = []
for valid_loss_item in epoch_valid_loss_value:
    new_epoch_valid_loss_value.append(valid_loss_item.detach().numpy().tolist())
#画图
fig = plt.gcf()
fig.set_size_inches(10, 5)

plt.xlabel('Epochs', fontsize=15)
plt.ylabel('Loss', fontsize=15)
plt.plot(epoch_train_loss_value, 'blue', label='Train loss')
plt.plot(new_epoch_valid_loss_value, 'red', label='Valid loss')
plt.legend(loc='best')
plt.title('Training and Validation loss', fontsize=15)
plt.show()

2-1-12 模型预测可视化

#生成预测值
prediction = []
for i in range(TestX_data.shape[0]):
    prediction.append(net(TestX_data[i, :]).item())
#对真实值处理,由Tensor转化为list
new_TestY_data = []
for TestY_data_item in TestY_data:
    new_TestY_data.append(TestY_data_item.detach().numpy().tolist()[0][0][0])
#画图
fig = plt.gcf()
fig.set_size_inches(10, 5)

myfont = FontProperties('SimSun')

plt.title('Prediction and GroundTruth', fontproperties=myfont, fontsize=15)
plt.scatter(np.arange(len(prediction)), prediction, label='Prediction', s=20)
plt.scatter(np.arange(len(prediction)), new_TestY_data, label='GroundTruth', s=20)
plt.xlabel('', fontproperties=myfont, fontsize=15)
plt.ylabel('Power generation', fontproperties=myfont, fontsize=15)
plt.legend()
plt.show()

 

 2-1-13 计算方差得分

from sklearn.metrics import explained_variance_score
score = explained_variance_score(prediction, new_TestY_data)

 2-2  机器学习-xgboost

        XGBoost(eXtreme Gradient Boosting)又叫极度梯度提升树,是boosting算法的一种实现方式。针对分类或回归问题,有非常好的效果。

2-2-1 导入工具库

import xgboost as xgb
from sklearn.metrics import explained_variance_score

 2-2-2 导入数据

train_XY  = np.loadtxt(train_data_path, delimiter=',', skiprows = 1,dtype=np.float32)
test_XY = np.loadtxt(test_data_path, delimiter=',', skiprows = 1,dtype=np.float32)
TrainX_data = torch.from_numpy(train_XY[:, 1:-1])# 除去id后 取前20列 
TrainY_data = torch.from_numpy(train_XY[:, [-1]])# 取最后1列

TestX_data = torch.from_numpy(test_XY[:, 1:-1])# 除去id后 取前20列 
TestY_data = torch.from_numpy(test_XY[:, [-1]])# 取最后1列

2-2-3 构建模型

        参数详解

max_depth=3每一棵树最大深度,默认6;
learning_rate=0.1学习率,每棵树的预测结果都要乘以这个学习率,默认0.3;
 n_estimators=100   使用多少棵树来拟合,也可以理解为多少次迭代。默认100;
objective='reg:linear'此默认参数与 XGBClassifier 不同;
booster='gbtree'有两种模型可以选择gbtree和gblinear。gbtree使用基于树的模型进行提升计算,gblinear使用线性模型进行提升计算。默认为gbtree;
  gamma=0  # 叶节点上进行进一步分裂所需的最小"损失减少"。默认0;
  min_child_weight=1可以理解为叶子节点最小样本数,默认1;
subsample=1    训练集抽样比例,每次拟合一棵树之前,都会进行该抽样步骤。默认1,取值范围(0, 1];
  subsample=1训练集抽样比例,每次拟合一棵树之前,都会进行该抽样步骤。默认1,取值范围(0, 1];
colsample_bytree=1每次拟合一棵树之前,决定使用多少个特征,参数默认1,取值范围(0, 1];
  reg_alpha=0默认为0,控制模型复杂程度的权重值的 L1 正则项参数,参数值越大,模型越不容易过拟合;
  reg_lambda=1    默认为1,控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合;
random_state=0)          随机种子;
model = xgb.XGBRegressor(max_depth=3,          # 每一棵树最大深度,默认6;
                        learning_rate=0.1,      # 学习率,每棵树的预测结果都要乘以这个学习率,默认0.3;
                        n_estimators=100,        # 使用多少棵树来拟合,也可以理解为多少次迭代。默认100;
                        objective='reg:linear',   # 此默认参数与 XGBClassifier 不同
                        booster='gbtree',         # 有两种模型可以选择gbtree和gblinear。gbtree使用基于树的模型进行提升计算,gblinear使用线性模型进行提升计算。默认为gbtree
                        gamma=0,                 # 叶节点上进行进一步分裂所需的最小"损失减少"。默认0;
                        min_child_weight=1,      # 可以理解为叶子节点最小样本数,默认1;
                        subsample=1,              # 训练集抽样比例,每次拟合一棵树之前,都会进行该抽样步骤。默认1,取值范围(0, 1]
                        colsample_bytree=1,       # 每次拟合一棵树之前,决定使用多少个特征,参数默认1,取值范围(0, 1]。
                        reg_alpha=0,             # 默认为0,控制模型复杂程度的权重值的 L1 正则项参数,参数值越大,模型越不容易过拟合。
                        reg_lambda=1,            # 默认为1,控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
                        random_state=0)           # 随机种子model.fit(TrainX_data,TrainY_data)
test_predict=model.predict(TestX_data)
train_predict = model.predict(TrainX_data)

2-2-4  计算方差得分

2-2-5 查看重要特征

from xgboost import plot_importance
plot_importance(model)
plt.show()

 2-2-6 模型预测可视化

new_TestY_data = []
for TestY_data_item in TestY_data:
    new_TestY_data.append(TestY_data_item.detach().numpy().tolist()[0])
#画图
fig = plt.gcf()
fig.set_size_inches(10, 5)

myfont = FontProperties('SimSun')

plt.title('Prediction and GroundTruth', fontproperties=myfont, fontsize=15)
plt.scatter(np.arange(len(new_TestY_data)), test_predict.tolist(), label='Prediction', s=20)
plt.scatter(np.arange(len(new_TestY_data)), new_TestY_data, label='GroundTruth', s=20)
plt.xlabel('', fontproperties=myfont, fontsize=15)
plt.ylabel('Power generation', fontproperties=myfont, fontsize=15)
plt.legend()
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/183589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虹科分享 | 2022年传感器事业部文章精选

2022年 文章精选 精选案例文章 虹科案例 | HK-Micronor光纤传感器应用领域介绍(上) 虹科案例 | HK-Micronor光纤传感器应用领域介绍(下) 虹科案例 | 如何更加准确的表征罐箱内燃油的质量规格? 虹科案例 | 监测各种…

java Vue+Springboot读书学习笔记共享平台

读书笔记共享平台的设计基于现有的网络平台,可以实现用户管理及数据信息管理,方便管理员对后台进行管理有详细的了解及统计分析,随时查看信息状态。 系统功能设计是在系统开发和设计思想的总体任务的基础上完成的。该系统的主要任务是实现读书…

CnOpenData中国保险机构网点全集数据

一、数据简介 改革开放以来,中国保险行业飞速增长,在补偿灾害损失、维护社会安定、支持中国的经济建设等方面发挥了重要作用。整个行业的突飞猛进体现在三个方面: 一是保险机构数量增长迅速。中国保险公司的数量从1980年的1家迅速增加至200多…

【云原生】Prometheus之图形化界面grafana与服务发现部署

内容预知 前言 1. 部署 Grafana 1.1 grafana的下载与安装 (1)安装grafana (2)配置数据源 (3)导入 grafana 监控面板 (4)删除模板操作 4.2 grafana的中文插件安装 2. 部署 Prometheus 服务发现 2.1…

C语言中二维数组的基本使用 定义 赋值读写指定元素的值 作为函数参数传递的注意点

文章目录问题依次解决C语言中二维数组如何定义、如何一次性赋值?如何使用 sizeof() 计算二维数组的行数、列数?【与定义数组的地方,在同一作用域内可用】如何读写指定位置的元素?【不同作用域,有两种方式】不同作用域内…

Git(见资源)

Git的概念【1】Git技术:公司必备,一定要会 【2】Git概念: Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的项目。【3】什么是版本控制? 版本控制是一种记录一个或若干文件内容变化&#…

BGP基础实验(华为)

题目: 思路: 该题分为三个AS区域,并且三个区别间分别使用不同的路由,EBGP,IBGP,OSFP连接等,其中AS1与AS2之间使用的是EBGP连接,这点需要EBGP的命令来进行实现,AS2中使用的OSPF,AS2&a…

不规范使用ThreadLocal导致的bug,说多了都是泪

ThreadLocal一般用于线程间的数据隔离,通过将数据缓存在ThreadLocal中,可以极大的提升性能。但是,如果错误的使用Threadlocal,可能会引起不可预期的bug,以及造成内存泄露。 因为线程重用导致的信息错乱的bug 有时我们…

一起自学SLAM算法:11.2 环境感知

连载文章,长期更新,欢迎关注: 环境感知就是机器人利用传感器获取自身及环境状态信息的过程,自主导航机器人的环境感知主要包括实时定位、环境建模、语义理解等,下面具体讨论。 11.2.1 实时定位 定位其实就是在回答图…

BI技巧丨近两年及当年月份数据汇总

BOSS:白茶,有个需求,不知道你能不能做? 白茶:不能! BOSS:我还没说呢,小伙砸!做了加钱! 白茶:BOSS您吩咐! BOSS:是这样的&a…

C语言开发基于RT-Thread家庭安全环境检测系统源码,RTT设计大赛

基于RT-Thread家庭安全环境检测 简介 基于RT-Thread和中蓝讯科的AB32VG1开发板实现的家庭安全检测功能,主要包含如下功能: 1、基于RT-Thread操作系统的按键组件,音频播放组件等; 2、基于AB32VG1开发板的语音播放功能&#xff1b…

BlackByte勒索软件开始使用新的数据泄露工具ExByte

BlackByte 勒索软件在 2021 年被首次发现,随后不断发现其变种。BlackByte 勒索软件不仅使用双重勒索,还运营着勒索软件即服务(RaaS)。最近,研究人员发现 BlackByte 开始使用名为 ExByte 的数据泄露工具来窃取受害者的数…

什么品牌的蓝牙耳机音质好?四款高音质蓝牙耳机推荐

随着时代的发展,蓝牙耳机的使用频率越来越高,在日常生活中随处可见的戴蓝牙耳机的人。或是听音乐,或是追剧,或是玩游戏等等。在现如今众多的蓝牙耳机品牌当中,什么品牌的蓝牙耳机音质好?下面,我…

基于Yolo实现的交通路况汽车识别 附完整代码(使用Keras框架)

一、问题描述 假设你现在在做自动驾驶的汽车,你想着首先应该做一个汽车检测系统,为了搜集数据,你已经在你的汽车前引擎盖上安装了一个照相机,在你开车的时候它会每隔几秒拍摄一次前方的道路。 您已经将所有这些图像收集到一个文件夹中,并通过在您找到的每辆车周围画边界框…

BlackStone:一款功能强大的渗透测试报告工具

关于BlackStone BlackStone是一款功能强大的渗透测试报告工具,该项目可以帮助广大研究人员自动起草和提交渗透测试或安全研究审计报告。该工具允许我们在数据库中提交和存储渗透测试过程中发现的漏洞,并通过内部和外部审计来对漏洞进行分类。除此之外&a…

界面控件DevExpress WinForm的先进技术——服务器和即时反馈模式

DevExpress WinForm拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任…

vue中如何优雅的实现数字递增特效

需求 前几天项目开发中遇到一个需求,需要在数字更新时,实现其动态递增的效果 并且,在数字大于10000时,将单位进行转换,如数字大于10000时,单位从m变为万m 我们以vue中开发为例,一一实现下这两个…

多目标跟踪(MOT)入门介绍

1. 相关方向 这些是我所了解的多目标跟踪(MOT)的一些相关方向。其中单目标跟踪(VOT/SOT)、目标检测(detection)、行人重识别(Re-ID)都是非常热门的方向。而偏视频的相关方向就比较冷…

java 随机数种子 java设置随机数种子教程 java随机数种子怎么设置

我们常用的随机数生成就是Math.random();java.util.Random类有两种方式构建方式:带种子和不带种子import java.util.Random;不带种子:不带种子将会返回随机的数字,每次运行结果不一样public class RandomTest {public static void…

分享149个ASP源码,总有一款适合您

ASP源码 分享149个ASP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 149个ASP源码下载链接:https://pan.baidu.com/s/173AhCXJgM5AvPqBw-la60w?pwdqk9j 提取码&#x…