PyBrain = Python-Based Reinforcement Learning, Artificial Intelligence and Neural Network,是一个基于Python的以神经网络为核心的机器学习包。这里我们用它来实现一个基本的BP神经网络。
PyBrain安装十分简单(只是要提前装好依赖包numpy,scipy,nose等):
由于PyBrain托管在GitHub上,可直接使用git命令来获取最新版本:
git clone git://github.com/pybrain/pybrain.git "指定路径"
进入指定路径,运行安装命令:
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
...
查看完整代码
这里要采用BP神经网络(多层前馈神经网络)来构建IRIS预测模型(分类器),先对数据进行分析。
读取并查看数据:
已安装的sklearn包自带iris数据集,并且已将输出类型从字符串(Iris-setosa,Iris-versicolor,Iris-virginica)转化为离散数(0,1,2),方便计算操作。
数据归一化处理:
数据共有4个输入属性(特征),一个输出类别标签,各属性单位均是cm(连续值、同度量),故不考虑进行归一化处理。
进一步分析:
通过可视化可以对数据进行相关性检验。同时查看数据点及标签分散情况,从而对分类难度和分类器维度有一个初步的感知。
下图所示为采用matplotlib绘制的前两个属性的散点图:
从这些图中可以得出线性不可分等基本认识。
独热编码:
由于输出为离散标称值,考虑采用独热编码(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函数作为输出层的激活函数。
程序示例:
下面是读取数据并进行编码的程序示例(包括训练集测试集的划分):
'''
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()
采用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)
# 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算法下,得出参数收敛曲线如下图所示:
可以看出,累积BP算法的参数收敛良好,预测精度结果比标准BP算法还要好一些。
但是,采用datetime测试程序运行时间,可以看出累积BP算法远远大于标准BP算法。
采用pybrain可以轻松实现一些基本的神经网络模型,方便了神经网络的实现练习。
ps.这个包本身的运行效率貌似也不是特别高。
本文内容主要参考了官方文档: