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設置的不好,可能使得本身可以收斂的網絡變得無法收斂,所以要嘛不設,要嘛多嘗試幾個



















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