您的位置:首页 > 理论基础 > 计算机网络

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

2017-04-14 11:41 447 查看

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

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
...


模型学习 - 基于PyBrain

查看完整代码

数据预处理

这里要采用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()


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算法下,得出参数收敛曲线如下图所示:



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

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

总结

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

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

参考

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

PyBrain官方文档主页
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息