scikit-learn初探:多种回归方法建立预测电力输出模型(一)

来源:互联网 发布:博罗县政府网络问政 编辑:程序博客网 时间:2024/05/02 04:36

一年前听说scikit-learn这个机器学习库,当时正在考研,一直没有机会用一下,正好这次要写《数据挖掘》的课程论文,需要使用机器学习算法,自己写一个算法,时间根本来不及,所以就想起这个库啦。下面的内容是我整理过后的,并不是严格按照论文的思维模式写的。

1 简介

本篇文章尝试并比较了一些机器学习回归算法拟合出一个预测模型,希望这个模型能够预测出每小时的满载电力。电厂的基本负荷运行受四个主要参数的影响,环境温度、气压、相对湿度和排汽压力。这些变量影响了电力的输出,这里电力的输出作为目标变量。这篇文章的数据来自于是一家电厂过去六年的数据,包括输入变量(影响结果的参数)和目标变量。首先,在本文中首先在所给数据中找出最优的子集,即主要的特征。接下来,找出性能最优的回归方法,通过这种回归方法能够最好的预测出满负荷电力的输出。
整个过程如下:

Created with Raphaël 2.1.0原始数据集数据预处理原始特征集选择最优子集选择最优回归函数

2、预处理

1.1数据

  数据我是从著名的UCI(http://archive.ics.uci.edu/ml/)上面下载的。使用的是来自一家不知名的复合式发电站的六年的数据,复合式循环发电站由燃气发电机蒸汽涡轮发电机热力循环系统组成。在这样一个发电站中,电能是由燃气和蒸汽发电机产生的,将这两台发电机组合在一个循环中,即将两台发电机连接在一起。复合式循环发电系统中的燃气发电机不仅仅能够产生电能,也能产生大量的热能。而这些热能可以通过水冷系统供给蒸汽涡轮发电机,由此可以生产出电力。这样燃气发电机既可以生产大量的电能,产生的热能也可以供给给蒸汽发电机,产生额外的电力。这种复合式循环发电系统意见在全球大量的应用了。热力学系统如下图:
这里写图片描述

数据的百度网盘地址为:http://pan.baidu.com/s/1mg6KokC。数据中给的变量有五个,如下:
  (1)环境温度(AT):单位:摄氏度; 变化范围:1.81℃-37.11℃
  (2)大气压(AP):单位:毫巴; 变化范围:992.89-1033.30 mbar
  (3)湿度(RH):单位:百分比; 变化范围:25.56%-100.16%
  (4)蒸汽压力(V):单位:cm Hg; 变化范围:25.36-81.56 cm Hg
  (5)全负载电力输出(PE):单位:兆瓦特 变化范围:420.26-495.76 MW
其中(1)-(4)是输入变量,(5)为需要预测的变量

1.2预处理

  数据预处理是在数据分析和挖掘中的一个必要的步骤,预处理的好坏甚至关系到最终建模的好坏。包括数据清洗,数据整合,数据转换,数据降维。这些操作在机器学习中提高模型的准确度。数据集可能有成百上千维,这些特征有的是不相关。特征子集的选择是减少数据集唯独的一种方式,通过从原始数据集中清除不相关的数据。减少原始数据集中的特征可以让机器学习算法跑的更快更有效。因而,数据预处理能够增加机器学习算法的准确度,提高模型的综合性能。
  这里使用的数据并不是一手的数据,而是已经被处理过的数据。据资料显示,原始数据包括了674个sheet表中,每一张表中的数据为一天的数据。这些数据含有噪声和不完整的数据。将这些含有不完整和不正确数据集的数据过滤掉,即输出电力低于420.26MW,和一些噪声数据。将这些数据经过随机排列,放到五张sheet表中。每张sheet表中包含9568条数据,每条数据有5个属性。

1.3数据读取

  我们已经有数据了,而且也已经对数据有所了解了,接下来就是将这些数据出来。代码如下:

def getData():    #@1    data = xlrd.open_workbook('/home/wq/code/datamining/CCPP/ccpp.xls')#使用xlrd库读取excel文件    #@2    #读取数据,将xls中的数据读取出来    sheet1 = data.sheet_by_name('Sheet1')    sheet2 = data.sheet_by_name('Sheet2')    sheet3 = data.sheet_by_name('Sheet3')    sheet4 = data.sheet_by_name('Sheet4')    sheet5 = data.sheet_by_name('Sheet5')    #@3    #训练集    AT_tran = sheet1.col_values(0) + sheet2.col_values(0) + sheet3.col_values(0)      V_tran = sheet1.col_values(1) + sheet2.col_values(1) + sheet3.col_values(1)     AP_tran = sheet1.col_values(2) + sheet2.col_values(2) + sheet3.col_values(2)     RH_tran = sheet1.col_values(3) + sheet2.col_values(3) + sheet3.col_values(3)      PE_tran = sheet1.col_values(4) + sheet2.col_values(4) + sheet3.col_values(4)     #@4    #测试集    AT_test = sheet4.col_values(0) + sheet5.col_values(0)    V_test = sheet4.col_values(1) + sheet5.col_values(1)    AP_test =  sheet4.col_values(2) + sheet5.col_values(2)    RH_test = sheet4.col_values(3) + sheet5.col_values(3)    PE_test = sheet4.col_values(4) +  sheet5.col_values(4)    #@5    tran = {'AT':AT_tran,'V':V_tran,'AP':AP_tran,'RH':RH_tran,'PE':PE_tran}    test = {'AT':AT_test,'V':V_test,'AP':AP_test,'RH':RH_test,'PE':PE_test}    return tran, test

  这段代码#@1部分使用xlrd库读取xls数据集,xlrd.open_workbook这个函数的参数是数据的地址。关于xlrd库的安装,可以使用easy_install、pip安装都可以,至于具体安装步骤,可以问一下度娘。
  这张excel表格由5个sheet表组成,#@2部分代码是将每个sheet表格的数据读取出来。
  #@3处代码每张sheet1,sheet2,sheet3表中的第0、1、2 、3 、4列数据分别赋值给AT_tran、V_tran、AP_tran、RH_tran、PE_tran,这些数据做训练集,每一列数据都对应这些属性。
  #@4处代码是将这些数据读取为测试集。
  #@5处代码将训练集、测试集组成字典,并将这些数据返回。
  
注:五张sheet表可以做交叉验证使用的,而这里我为了快点将模型建立起来,就没有使用交叉验证了。我测试三次,选用不同的sheet表作为训练集、测试集,误差相差的并不是很大。

0 0
原创粉丝点击