使用keras进行多分类建模

项目地址:https://github.com/imgoodman/tensorflow-in-action/tree/master/iris-multi-class
keras是用于深度学习的python库,它包含了高效的数值库,以Theano或Tensorflow为后端。
这里,使用keras开发和评估应用于多分类问题的神经网络模型。
经过如下描述,将可以知道:
  •     如何从CSV中加载数据,并对于keras可用
  •     如何准备用于神经网络建模的多分类数据
  •     如何使用scikit-learn评估keras神经网络模型

1. 问题描述
这里,使用标准机器学习问题,iris flower。
由于所有的四个输入变量都是数值型,并且具有相同的尺度,该数据集研究较多,是应用于神经网络的好例子。
每一个实例描述一个观察到的花朵测量的属性,输出变量是特定iris种类。
这是一个多分类问题,意思是,需要预测多于两个分类。实际上,该数据集有三个花种类。这是一种重要的问题,在使用神经网络练习时候,三个分类值需要特殊处理。
iris花朵数据集是一个研究很成熟的问题,现在的模型准确率在95%到97%。当我们开发新的模型时候,这为我们提供了很好的目标。
iris数据集的地址:http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data

2.导入类
导入需要的类。这里包含keras的功能,以及pandas读取csv数据,以及scikit-learn的模型评估。
  •     利用pandas读取数据
  •     利用sklearn进行类标签数据处理(字符串转化为数字)
  •     利用keras,将数字化的类标签,转化为binary matrix representation
  •     利用sklearn,对数据进行kfold
  •     利用keras,进行建模
  •     利用sklearn,交叉验证模型


3. 初始化随机数生成器
为了使得本模型的结果可以重复,这里暂将随机数生成器种子确定为7.
确保训练神经网络模型的随机过程能够重现。
 
4.加载数据

使用pandas加载数据,并提取其中的特征空间X和类标签y。


5.对输出变量编码
输出变量包含三个不同字符串值。

当使用神经网络对多分类问题进行建模的时候,比较好的实践方式是:

  •     检查类标签总共有多少个不同的值(字符串值),例如:A,B,C
  •     对字符串值进行数值编码,将字符串转化为数值,例如:A=1,B=2,C=3
  •     将数值进行热编码,即每个数字用向量来表示,例如:A=[1,0,0],B=[0,1,0],C=[0,0,1]
  •     这样,目标标签列向量,就转化为binary matrix representation

实现过程如下:


  •     LabelEncoder是sklearn提供的。
  •     np_utils是keras提供的。

6.定义神经网络模型
keras库中提供了相应的包装类(KerasClassifier类),它使得使用keras开发的神经网络模型可以在sklearn中运行。
KerasClassifier类可以做为sklearn中的估计器Estimator(sklearn库中模型的基本类型)。
KerasClassifier接收函数名作为参数,该函数必须返回构建好的神经网络模型。

如下是创建针对iris分类问题的基本神经网络。它的结构很简单:

  •     只有一个隐含层,该隐含层具有8个神经元,使用relu激活函数。
  •     输出是3个神经元,使用softmax激活函数,表示在三个分类上的概率分布。
  •     模型使用交叉熵作为损失函数,adam梯度下降优化算法,测试指标是准确率。

输出值中,取值最大的表示模型预测的分类标签。

7.使用KFold交叉验证评估模型
在训练数据上评估神经网络模型。sklearn提供了丰富的套件来评估模型。评估机器学习模型的黄金标准是:k-fold交叉验证。

  •     定义10折,在对数据进行划分之前,对数据进行随机混洗。
  •     在数据集上,使用k fold交叉验证,对估计器estimator进行评估。
  •     返回的结果,是10次数据集划分后,每次的评估结果。评估结果包括平均准确率和标准差。



猜你喜欢

转载自blog.csdn.net/levy_cui/article/details/81003618