您的位置:首页 > 其它

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

2015-11-23 12:15 423 查看
一年前听说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表作为训练集、测试集,误差相差的并不是很大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: