python学习:机器学习下的pybrain和多线程编程

最近实习需要用到这几个库,主要是用pybrain里的神经网络来做预测模型,而多线程编程的知识是我自己想学的,对于IO密集型的数据处理和保存来说,多线程的使用是必须的,所以我就把这两者加入了学习计划。先占个坑,慢慢更新


我去。。还没写这个就变成我博客涨访问最快的了。。心理难安啊,本来打算慢慢来的,看来要速度点了,明天(3.13)前就把pybrain的写好!


pybrain的神经网络看的差不多了,总结如下!


一 pybrain


关于pybrain的安装,会git的兄弟们只要使用如下命令:

git clone git://github.com/pybrain/pybrain.git
python setup.py install

就可以安装pybrain了,什么,你不会用git!?那你可以进入上面那个网站,直接下载zip格式再解压文件。

然后pybrain本身有一些关联的包需要下载如:numpy,scipy,我的建议是下载anaconda,这个IDE是专门用来给python做数据分析的,里面把各种关联的库都帮你绑定好了,连scikit-learn都有,我之前自己关联各种库的时候老是会出错,所以建议大家就用这个了,省心省力啊。安装好后可以输入import pybrain验证一下是否成功了。接下来讲pybrain的使用。

anaconda下载地址:

https://www.continuum.io/downloads


pybrain内部集成了一些分类器,有BP神经网络、循环神经网络RNN,还有增强学习RL的东西,这里只介绍下怎么使用BP神经网络,其他的大家要是感兴趣可以去看官方文档:

http://www.pybrain.org/docs/


这次建模通过拟合y=x1^2+x2^2+x3^2这个函数来做示例。总共是三个输入一个输出,步骤如下:


1、导入包

#如下,首先import一些需要的包:
from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.structure import TanhLayer,LinearLayer,SigmoidLayer,SoftmaxLayer 
from pybrain.tools.validation import CrossValidator,Validator
import numpy as np
import pandas as pd

2、创建数据X和Y

x1=[float(x) for x in range(-100,400)]    #换成float型是为了后期可以标准化为0-1
x2=[float(x) for x in range(-200,800,2)]
x3=[float(x) for x in range(-500,1000,3)]
num=len(x1)

y=[]
for i in range(num):
    y.append(x1[i]**2+x2[i]**2+x3[i]**2)
3、使用minmax标准化并转化成array格式

x1=[(x-min(x1))/(max(x1)-min(x1)) for x in x1]
x2=[(x-min(x2))/(max(x2)-min(x2)) for x in x2]
x3=[(x-min(x3))/(max(x3)-min(x3)) for x in x3]
y=[(x-min(y))/(max(y)-min(y)) for x in y]
#将X和Y转化为array格式
x=np.array([x1,x2,x3]).T
y=np.array(y)
xdim=x.shape[1]       #确定输入特征维度
ydim=1                #确定输出的维度


此时x和y的格式如下:

X:500行3列

array([[ 0.        ,  0.        ,  0.        ],
       [ 0.00200401,  0.00200401,  0.00200401],
       [ 0.00400802,  0.00400802,  0.00400802],
       ..., 
       [ 0.99599198,  0.99599198,  0.99599198],
       [ 0.99799599,  0.99799599,  0.99799599],
       [ 1.        ,  1.        ,  1.        ]])

Y:500行1列

array([  1.60899642e-01,   1.58654929e-01,   1.56425984e-01,
         1.54212807e-01,   1.52015399e-01,   1.49833758e-01,
         1.47667886e-01,   1.45517782e-01,   1.43383446e-01,
         ...,
         1.35003784e-01,   1.32948289e-01,   1.30908563e-01])


4、创建神经网络使用的监督数据集

DS=SupervisedDataSet(xdim,ydim)
for i in range(num):
    DS.addSample(x[i],y[i])
    
train,test=DS.splitWithProportion(0.75)  #将数据拆分,0.75为训练数据,0.25为测试数据
#DS['input']                             #输入x的值
#DS['target']                            #输出y的值
#DS.clear()                              #清除数据

5、创建神经网络

#如下,我这次总共创建了4层的神经网络,一层输入,2个隐含层,分别是10个节点和5个节点,一层输出,多少层可以根据自己需求来确定

#隐含层使用的是tanh函数,输出则使用的是y=x线性输出函数
ann=buildNetwork(xdim,10,5,ydim,hiddenclass=TanhLayer,outclass=LinearLayer)

#BP算法训练,参数为学习率和动量
trainer=BackpropTrainer(ann,dataset=train,learningrate=0.1,momentum=0.1,verbose=True)
#trainer.trainEpochs(epochs=20)                         #epochs表示迭代的次数
trainer.trainUntilConvergence(maxEpochs=50)             #以上这两种训练方法都可以,看自己喜欢


6、预测与作图

#预测test情况
output=ann.activateOnDataset(test)
#ann.activate(onedata)可以只对一个数据进行预测
#稍微整理下output输出,为了后期作图
out=[]
for i in output:
    out.append(i[0])
#使用pandas作图
df=pd.DataFrame(out,columns=['predict'])
df['real']=test['target']
df1=df.sort_values(by='real')
df1.index=range(df.shape[0])
df.plot(kind='line')


对test作图情况如下:

其中横座标仅表示第几个数,纵座标表示标准化后的y

若对整个五百组数据拟合的话,情况如下:


只需将代码中的test都改成DS即可。


到了这里操作基本差不多了,其他模块还有一些附加功能,如:

#Validator可以进行一些误差的计算
v=Validator()
v.MSE(output,test['target'])      #计算test的原始值和预测值的均方差和,两者格式必须相等


#使用交叉验证
CrossValidator(trainer, DS, n_folds=5,max_epochs=20)
可以根据自己需要来选取相应的功能。

然后以上的神经网络训练针对的是连续型输出的,当要使用分类的神经网络时,最好设置下神经网络中代表分类的变量,具体可以查阅pybrain的doc



最后总结下这几天学习操作和查的资料对神经网络做个总结。

首先,神经网络这玩意的激活函数的范围基本都在0-1或者-1-1,所以数据必须标准化,不然如下:

sigmoid函数


可以看到,当X>4之后,得到的转化值基本都是1了,这样后期拟合将无法收敛。然后关于隐藏节点和输出节点的激活函数选择,一般是这样的,如果是连续型的输出,我们一般使用输出函数为y=x的线性输出函数,如果是分类的神经网络,二元分类的时候我们使用sigmoid,多元分类的时候则采用softmax。softmax具有将一个较大的值转化为1,其他值转化为0的功能,相当于一个max函数,在多元分类中非常有用,而sigmoid多使用与二元分类,能将数据转化到0-1,通过设置阈值来判断取0还是1。然后关于为什么我选择了tanh作为隐藏节点的激活函数,因为《神经网络43个案例分析》书里提到对各个激活函数的匹配情况作了分析,发现tanh和y=x配套的时候拟合误差是最低的,所以我这里使用了这两函数。如下:


purelin就是y=x.

然后关于参数的设置:

momentun冲量:为了越过局部最小值
learningrate学习率:为了加快学习速度
weightdecay:给损失函数加个惩罚,惩罚过大的权值数,让他能够选取权值和最小的NN,目的是为了防止过拟合,一般为0.1左右

PS:weightdecay设置的不好,可能使得本身可以收敛的网络变得无法收敛,所以要嘛不设,要嘛多尝试几个



















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章