电动汽车动力电池充电能量预测

时间:2019-08-12 08:00:01 来源:渭南之窗 当前位置:美美的故事了也 > 文化 > 手机阅读

这是2018全国高新新能源汽车大数据创新创业大赛的一道题,从本质上来说,没有什么实际意义,权当练手。

本文分为两部分,一部分是主办方给的竞赛题目介绍,一部分是解题思路。

通常来说这类题目适合用回归算法,但是本文尝试用分类算法解决问题。

1. 竞赛题目介绍
1.1. 竞赛题目(Competition Topic)

电动汽车动力电池充电能量预测。

1.2. 背景介绍(Background)

动力电池充电能量预测为动力电池衰退评估的核心问题,正确预测动力电池充电能量,对动力电池残值评估、故障检测、充电规划等有重要意义。个人观点应该是电池的实际容量/余能才和上面提到的问题相关。

1.3. 问题描述(Question description)

动力电池充电能量受累计行驶里程、温度等多因素耦合影响。参赛者须设计动力电池能量预测模型,对动力电池充电能量进行预测。本题给出待预测充电过程的前n个充电过程的充电状态及充电能量,参赛者须预测第n+1个充电过程的充电能量。实际测试样本不是连续的充电过程。

1.4. 数据说明(Data description)

训练样本的数据格式及说明如下表所示,数据可能存在异常,需参赛者自行识别。

测试样本的数据格式及说明如下表所示,数据可能存在异常,需参赛者自行识别。

提交内容的数据格式及说明如下表所示,参赛者须对充电能量进行补充,间隔符为英文逗号。

1.5. 评分规则(Evaluation)评分公式如下

公式中,e为评价参数,其数值越小代表与实际答案越接近;r为计算能量,a为实际能量。

2. 解题思路
2.1. 数据字段分析

a)“GBT 32960.3-2016 电动汽车远程服务与管理系统技术规范 第3部分:通讯协议及数据格式”中并没有charge_energy这个字段,因此推测是竞赛组织者通过充电段积分得到的安时容量或者瓦时容量。

b)由于每辆车的电压范围都不一样,因此不同vehicle_id对应不同的模型。

c)由于charge_start_time、charge_end_time只精确到月份,对预测充电能量没有帮助,舍弃。

d)由于测试数据是从数据集中抽取的不连续数据,因此无法通过mileage计算得到的里程差预测充电能量,舍弃。

e)charge_start_soc和charge_end_soc计算得到delta_SOC与充电容量强相关。

f)charge_start_U和charge_end_U计算得到的delta_U与充电容量强相关。

g)charge_start_I和charge_end_I与充电容量有一定关系,计算时只取charge_end_I。

h)charge_max_temp和charge_min_temp计算得到的平均温度temp_ave与充电容量有一定关系。

i)综上所述,输入特征为delta_SOC、delta_U、charge_end_I、temp_ave,标签为charge_energy。

2.2. 建模

由于没有测试样本的charge_energy数据,因此从训练样本中分出5%作为测试样本。特别说明,本解决方法采用基于多层感知器的softmax多分类方法实现充电能量预测。

2.2.1 代码

#导入库
import numpy as np
import pandas as pd from sklearn import preprocessing from sklearn.model_selection import train_test_split
import keras from keras.models import Sequential from keras.layers import Dense
import matplotlib.pyplot as plt
import seaborn as sns
#定义数据处理函数
def data_processing(df):        vid = df['vehicle_id'].unique().tolist()    vid.sort()    
   data_process = []    for i in vid:        #取出vid=i的数据,并进行SOC筛选        df1 = df[df.vehicle_id==i].dropna(subset=['charge_start_soc', 'charge_end_soc', 'charge_energy'])        
       df1 = df1[df1.charge_start_soc>0]        
       df1 = df1[df1.charge_end_soc>0]        
       #增加delta_SOCdelta_Utemp_ave        df1['delta_SOC'] = df1.charge_end_soc-df1.charge_start_soc      #充电截止SOC-充电起始SOC        df1['delta_U'] = df1.charge_end_U-df1.charge_start_U        #充电截止总电压-充电起始总电压        df1['temp_ave'] = (df1.charge_max_temp+df1.charge_min_temp)/2   #充电平均温度        #将数据添加至data_process        data_process.append(df1)    return data_process
#读取数据
with open('D:/energy_predict_data/predict_data_e_train.csv', "r") as f:    
   data = pd.read_csv(f)   #数据处理
neurons = int(round(data.charge_energy.max()))
data_process = data_processing(data)
#计算实际能量和预测能量
a = []
r = [] for i in data_process:    #数据准备    X = i.loc[:, ['delta_SOC', 'delta_U', 'temp_ave', 'charge_end_I']]  #4个输入节点    y = i.loc[:, 'charge_energy']    scaler = preprocessing.StandardScaler()             #z-score标准化函数    X1 = scaler.fit_transform(X)    X1_train, X1_test, y_train, y_test = train_test_split(X1, y, test_size=0.05, random_state=0)  #训练集、测试集划分    y1_train = keras.utils.to_categorical(np.array(round(y_train)), num_classes=neurons)    #取整,独热编码    #creat model    model = Sequential()    model.add(Dense(neurons, input_dim=4, activation='tanh'))    model.add(Dense(neurons, input_dim=4, activation='tanh'))    model.add(Dense(neurons, activation='softmax'))    #compile model    model.compile(loss='categorical_crossentropy', optimizer='Adadelta', metrics=['accuracy'])    #model fit及过程可视化    earlyStopping = keras.callbacks.EarlyStopping(monitor='acc', min_delta=0.001, patience=200, verbose=0, mode='auto')  #早停获取最佳模型    hist = model.fit(X1_train, y1_train, epochs=2000, callbacks=[earlyStopping])    fig, ax = plt.subplots()    ax.plot(hist.history['acc'])    ax.set(xlabel='epochs', ylabel='acc')    ax.set_title('vehicle_id_%d' %i.vehicle_id.unique())        #model predict    y_test_predict = model.predict_classes(X1_test)    
   #追加实际能量和预测能量    a.extend(y_test)    r.extend(y_test_predict)    
#结果评估
a1 = pd.DataFrame(a, columns=['a1'])
r1 = pd.DataFrame(r, columns=['r1'])
dataset = pd.concat([a1, r1], axis=1)           #将实际值a1和预测值r1拼接
dataset = dataset[dataset>20].dropna().reset_index(drop=True)      #舍弃充电能量小于20的数据
e = ((np.sum(((dataset['r1']-dataset['a1'])/dataset['a1'])**2))**0.5)     #计算评价参数
#可视化
fig, ax1 = plt.subplots() ax1.scatter(dataset.index, dataset.a1, color='r', label='charge_energy')
ax1.scatter(dataset.index, dataset.r1, color='b', label='charge_energy_predict')
ax1.set(xlabel='charge_num', ylabel='charge_energy')ax1.legend(loc = 'upper left')
ax2 = ax1.twinx() ax2.scatter(dataset.index, dataset.r1-dataset.a1, color='y', label='error')
ax2.set(ylabel='charge_energy_error')ax2.legend(loc = 'upper right') fig, ax1 = plt.subplots() sns.distplot(dataset.r1-dataset.a1) ax1.set(xlabel='charge_energy_error')
2.2.2 训练过程acc

五辆车训练过程的acc(准确率)均接近1。

2.2.3评估结果

e = 0.4418,与大赛公布的排行榜有一定差距,可能是测试样本不一样造成,也可能是模型预测准确度不够造成,或者是基于多层感知器的softmax多分类模型精度低于回归方法,后续可以尝试使用回归方法进行预测,并进行模型的超参数调节以提高精度。

2.2.4 评估结果可视化

充电能量预测误差主要分布在-2.5~+2.5之间,误差较大的主要集中在第四和第五辆车。



上一篇2018年,国内汽车行业大事件全面盘点

下一篇灭庄10吗

相关文章:

文化本月排行

文化精选