神经网络基础 - PyBrain机器学习包的使用

神经网络基础 - PyBrain机器学习包的使用


PyBrain = Python-Based Reinforcement Learning, Artificial Intelligence and Neural Network,是一个基于Python的以神经网络为核心的机器学习包。这里我们用它来实现一个基本的BP神经网络

安装准备

PyBrain安装十分简单(只是要提前装好依赖包numpy,scipy,nose等):

  1. 由于PyBrain托管在GitHub上,可直接使用git命令来获取最新版本:

    git clone git://github.com/pybrain/pybrain.git "指定路径"
    
  2. 进入指定路径,运行安装命令:

    python setup.py install
    

    安装可能需要权限。

更多安装信息可参考官方主页-Installation.

数据准备

这里我们采用UCI著名数据集Iris Data Set.

其数据集的简述如下:

输入:鸢尾花的四个属性(连续值)
    1. sepal length in cm
    2. sepal width in cm
    3. petal length in cm
    4. petal width in cm

输出:鸢尾花的品种(分类值)
    -- Iris Setosa
    -- Iris Versicolour
    -- Iris Virginica

过程:由输入预测输出

其他:
    样本量:150,每类样本量平均。
    缺失值:无

下面是一些数据示例:

5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
...
7.0,3.2,4.7,1.4,Iris-versicolor
6.4,3.2,4.5,1.5,Iris-versicolor
...
6.3,3.3,6.0,2.5,Iris-virginica
5.8,2.7,5.1,1.9,Iris-virginica
...

模型学习 - 基于PyBrain

查看完整代码

数据预处理

这里要采用BP神经网络(多层前馈神经网络)来构建IRIS预测模型(分类器),先对数据进行分析。

  1. 读取并查看数据:

    已安装的sklearn包自带iris数据集,并且已将输出类型从字符串(Iris-setosa,Iris-versicolor,Iris-virginica)转化为离散数(0,1,2),方便计算操作。

  2. 数据归一化处理:

    数据共有4个输入属性(特征),一个输出类别标签,各属性单位均是cm(连续值、同度量),故不考虑进行归一化处理

  3. 进一步分析:

    通过可视化可以对数据进行相关性检验。同时查看数据点及标签分散情况,从而对分类难度和分类器维度有一个初步的感知。

    下图所示为采用matplotlib绘制的前两个属性的散点图:

    神经网络基础 - PyBrain机器学习包的使用_第1张图片

    从这些图中可以得出线性不可分等基本认识。

  4. 独热编码:

    由于输出为离散标称值,考虑采用独热编码(one hot encoding)将其转换为数值变量。pybrain自带独热编码函数datasets.ClassificationDataSet_convertToOneOfMany()。编码前后输出变量示意如下:

    编码前:

    [[1],
     [2],
     [1],
     [0]]
    

    编码后:

    [[0, 1, 0],
     [0, 0, 1],
     [0, 1, 0],
     [1, 0, 0]]
    

    可以看到编码后,神经网络的输出从1维变到3维,所以输出节点数设为3,为了让输出映射类别标签,可采用softmax函数作为输出层的激活函数。

  5. 程序示例:

    下面是读取数据并进行编码的程序示例(包括训练集测试集的划分):

'''
preparation of data
'''
from sklearn import datasets  
iris_ds = datasets.load_iris()
X, y = iris_ds.data, iris_ds.target
label = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']

from pybrain.datasets import ClassificationDataSet
# 4 input attributes, 1 output with 3 class labels
ds = ClassificationDataSet(4, 1, nb_classes=3, class_labels=label)  
for i in range(len(y)): 
    ds.appendLinked(X[i], y[i])
ds.calculateStatistics()

# split training, testing, validation data set (proportion 4:1)
tstdata_temp, trndata_temp = ds.splitWithProportion(0.25)  
tstdata = ClassificationDataSet(4, 1, nb_classes=3, class_labels=label)
for n in range(0, tstdata_temp.getLength()):
    tstdata.appendLinked( tstdata_temp.getSample(n)[0], tstdata_temp.getSample(n)[1] )

trndata = ClassificationDataSet(4, 1, nb_classes=3, class_labels=label)
for n in range(0, trndata_temp.getLength()):
    trndata.appendLinked( trndata_temp.getSample(n)[0], trndata_temp.getSample(n)[1] )

# one hot encoding
trndata._convertToOneOfMany()
tstdata._convertToOneOfMany()

BP网络训练

采用pybrain包训练BP神经网络模型的基本步骤如下:

  • 初始化网络(设置层数、每层节点数、每层激活函数等),示例代码如下:
from pybrain.tools.shortcuts import buildNetwork
# 4 input nodes, 3 output node each represent one class
# here we set 5 hidden layer nodes.
# SoftmaxLayer(0/1) for multi-label output activation function
n_h = 5
net = buildNetwork(4, n_h, 3, outclass = SoftmaxLayer)  
  • 初始化训练子(如训练模型对象,训练集等),进行训练(设置迭代次数(epoch参数),批处理或流处理(batchlearning参数)),示例代码如下:
# standard(incremental) BP algorithm: 
trainer = BackpropTrainer(net, trndata)
trainer.trainEpochs(1)
上述代码是采用一次数据集遍历的**标准BP算法**,若采用多次迭代直至收敛的**累积BP算法**,示例代码如下(50次迭代,标准梯度下降):
# accumulative BP algorithm: 
trainer = BackpropTrainer(net, trndata, batchlearning=True)
err_train, err_valid = trainer.trainUntilConvergence(maxEpochs=500)

模型验证

直接在测试集上进行预测,计算输出精度(累积BP算法下可查看收敛曲线):

'''
test of model
'''
# convergence curve 
import matplotlib.pyplot as plt
plt.plot(err_train,'b',err_valid,'r')
plt.show()

# model testing
from pybrain.utilities import percentError
tstresult = percentError( trainer.testOnClassData(), tstdata['target'] )
print("epoch: %4d" % trainer.totalepochs, " test error: %5.2f%%" % tstresult)   

标准BP算法在IRIS测试集上的精度结果如下所示:

epoch:    1  test error:  0.88%

可以看出,错误率<1%,说明该模型精度表现良好(和数据集本身高维可分也有很大的关系)。

累积BP算法下,得出参数收敛曲线如下图所示:

神经网络基础 - PyBrain机器学习包的使用_第2张图片

可以看出,累积BP算法的参数收敛良好,预测精度结果比标准BP算法还要好一些。

但是,采用datetime测试程序运行时间,可以看出累积BP算法远远大于标准BP算法。

总结

采用pybrain可以轻松实现一些基本的神经网络模型,方便了神经网络的实现练习。

ps.这个包本身的运行效率貌似也不是特别高。

参考

本文内容主要参考了官方文档:

  • PyBrain官方文档主页

你可能感兴趣的:(机器学习)