深度学习入门系列5项目实战:用深度学习识别鸢尾花种类

大家好,我技术人Howzit,这是深度学习入门系列第五篇,欢迎大家一起交流!

深度学习入门系列1:多层感知器概述
深度学习入门系列2:用TensorFlow构建你的第一个神经网络
深度学习入门系列3:深度学习模型的性能评价方法
深度学习入门系列4:用scikit-learn找到最好的模型
深度学习入门系列5项目实战:用深度学习识别鸢尾花种类
深度学习入门系列6项目实战:声纳回声识别
深度学习入门系列7项目实战:波士顿房屋价格回归
深度学习入门系列8:用序列化保存模型便于继续训练
深度学习入门系列9:用检查点保存训练期间最好的模型
深度学习入门系列10:从绘制记录中理解训练期间的模型行为
深度学习入门系列11:用Dropout正则减少过拟合
深度学习入门系列12:使用学习规划来提升性能
深度学习入门系列13:卷积神经网络概述
深度学习入门系列14:项目实战:基于CNN的手写数字识别
深度学习入门系列15:用图像增强改善模型性能
深度学习入门系列16:项目实战:图像中目标识别
深度学习入门系列17:项目实战:从电影评论预测情感
深度学习入门系列18:递归神经网络概述
深度学习入门系列19:基于窗口(window)的多层感知器解决时序问题
深度学习入门系列20:LSTM循环神经网络解决国际航空乘客预测问题
深度学习入门系列21:项目:用LSTM+CNN对电影评论分类
深度学习入门系列22:从猜字母游戏中理解有状态的LSTM递归神经网络
深度学习入门系列23:项目:用爱丽丝梦游仙境生成文本

文章目录

    • 4.1鸢尾花分类数据集
    • 4.2 导入类和函数
    • 14.3 初始化随机生成器
    • 4.4 加载数据
    • 4.5 对输出变量进行编码
    • 4.6 定义神经网络模型
    • 4.7 用K-折交叉验证评价模型
    • 4.8 总结
      • 4.8.1 接下来


在这个项目教程中,你将学习如何在多分类问题上使用Keras构建和评估神经网络模型。一步步完成教程后,你将了解:
  • 如何从CSV中加载数据并在Keras中使用。
  • 如何为建模神经网络准备多分类数据。
  • 如何用scikit-learn评价Keras 神经网络模型。

让我们开始。

4.1鸢尾花分类数据集

在这个教程中,我们将使用标准机器学习案例,叫做鸢尾花数据集。对于练习神经网络,这个数据集值得很好的研的案例,因为四个输入变量都是数字而且有同样的单位厘米。每个实例为描述观察到的花测量的属性,输出变量是特定的鸢尾花种类。这个数据集的属性总结如下:

1.萼片长度,以厘米为单位
2.萼片宽度,以厘米为单位
3.花瓣长度,以厘米为单位
4.花瓣宽度,以厘米为单位
5.类别

这是一个多分类问题,意味着不止一个类要预测,实际上有三种花。这个很典型的分类问题,可以在这上面练习神经网络,因为三种类型的值需要特定的处理。下面是150个样本中前5个:

5.1,3.5,1.4,0.2,Iris-setosa 
4.9,3.0,1.4,0.2,Iris-setosa 
4.7,3.2,1.3,0.2,Iris-setosa 
4.6,3.1,1.5,0.2,Iris-setosa 
5.0,3.6,1.4,0.2,Iris-setosa

鸢尾花数据集是很好的研究案例,而且我们期望获取模型精度在95%-97%之间。当我门开发我们的模型,它提供了一个很好的目标。本书提供的样本代码中提供了数据集。你也可以从UCI机器学习仓库中下载鸢尾花数据集,并把以iris.csv名字放入你当前的工作目录中。你可以从UCI机器学习仓库首页中了解更多关于鸢尾花分类数据集。

4.2 导入类和函数

我们从导入本节课所需要的类和函数开始,包括我们需要的Keras功能,但是从Pandas数据加载并准备数据和scikit-learn中的模型评估。

import numpy  
from pandas import read_csv  
from keras.models import Sequential  
from keras.layers import Dense  
from keras.wrappers.scikit_learn import KerasClassifier from keras.utils import np_utils  
from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold  
from sklearn.preprocessing import LabelEncoder  
from sklearn.pipeline import Pipeline

14.3 初始化随机生成器

接下来我们需要初始化随机生成器为常数,这对于再次准确地获取模型的结果是很重要的。她也确保训练网络模型的随机过程具有可复制性。

# fix random seed for reproducibility 
seed = 7 numpy.random.seed(seed)

4.4 加载数据

数据集直接加载,因为输出变量包含字符,所以通过pandas加载数据是最容易。我们能把属性(列)划分为输入变量(X)和输出变量(Y)

# load dataset 

dataframe = read_csv("iris.csv", header=None) dataset = dataframe.values  
X = dataset[:,0:4].astype(float)  
Y = dataset[:,4]

4.5 对输出变量进行编码

输出变量包含三个不同字符类型的值。当使用神经网络对多分类问题建模时,重新把输出属性从每种类别中包含字符串转成每类为布尔型的矩阵是一种很好的做法,给定实例是否有该类值。这操作叫做one-hot 编码或者从分类变量中创建虚拟变量。例如,在这个问题上,三类值分别为Iris-setosa,Iris-versicolor 和 Iris-virginica。如果我们有三观察值:

Iris-setosa 
Iris-versicolor 
Iris-virginica

我们把每个数据实例转成一个像下面的one-hot 二维矩阵。

Iris-setosa, Iris-versicolor, Iris-virginica 
1,				0, 					0  
0, 				1, 					0  
0, 				0, 					1

我们首先使用scikit-learn类中LabelEncoder将字符转为整型。使用Keras中to_categorical()函数把整型向量转成one-hot编码。

# encode class values as integers 

encoder = LabelEncoder()  
encoder.fit(Y)  
encoded_Y = encoder.transform(Y)  
# convert integers to dummy variables (i.e. one hot encoded) dummy_y = np_utils.to_categorical(encoded_Y)

4.6 定义神经网络模型

正如前面课前学到的,Keras 库提供了封装类,允许你在scikit-learn中使用Keras构建的深度学习模型。在Keras中有个KerasClassifier类,在scikit-learn中它被用于的估计器,在库中也是基本模型类型。KerasClassifier把函数名作为参数,这个函数必须返回结构化的神经网络,准备开始训练。

下面函数将这对鸢尾花分类问题建立一个基准的神经网络模型,创建了一个简单全连接神经网络,有四个神经元的隐藏层和输入层(可以有任意个数神经元)。隐藏层使用整流器(rectifier)激活函数,有着很好的表现。对于鸢尾花数据集我们采用one-hot编码,输出层必须创建三个输出值,每个类一个。输出值最大的那个就是预测类别。这个简单一层神经网络拓扑结构总结如下:

4 inputs -> [8 hidden nodes] -> 3 outputs

值得注意我们在输出端使用sigmoid激活函数。这确保了输出值在0-1之间,被用作预测的概率。最后网络使用的高效的ADAm梯度下降优化算法和对数损失函数,我们在Keras中称之为categorical_crossentropy。

# define baseline model 

def baseline_model():  
# create model  
	model = Sequential()  
	model.add(Dense(8, input_dim=4, activation='relu')) 
	model.add(Dense(3, activation='softmax'))

 	# Compile model 
	model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])return model

我们现在创建KerasClassifier并在scikit-learn中使用。我们在KerasClassifier结构中传入的参数也将传入到fit() 中,用于内部训练神经网络。当我们训练网络时,传入nb_epoch为200,batch_size 为5 。当我们训练时设置verbose为0,关闭了调试模式。

estimator = KerasClassifier(build_fn=baseline_model, epochs=200, batch_size=5, verbose=0)

4.7 用K-折交叉验证评价模型

现在我们可以在训练集上评价神经网络模型。scikit-learn库使用一套技术来评价模型,有着出色的表现。评价机器学习模型的黄金标准是K-折交叉验证。首先我们定义评估流程。在这,我们设置折数为10(一个优秀的默认值)并在划分之前随机打乱数据。

kfold = KFold(n_splits=10, shuffle=True, random_state=seed)

现在我们能在数据集(X和dummy_Y)上使用10-fold交叉验证(kfold)程序评价我们的模型(estimator)。评价模型仅需要10秒并返回一个对象,该对象描述了对每种数据划分的10种有结构模型的评估。

results = cross_val_score(estimator, X, dummy_y, cv=kfold)  
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

为了完整,下面列出了所有代码:

# Multiclass Classification with the Iris Flowers Dataset 

import numpy  
from pandas import read_csv  
from keras.models import Sequential  
from keras.layers import Dense  
from keras.wrappers.scikit_learn import KerasClassifier  
from keras.utils import np_utils  
from sklearn.model_selection import cross_val_score  
from sklearn.model_selection import KFold  
from sklearn.preprocessing import LabelEncoder  
# fix random seed for reproducibility  
seed = 7  
numpy.random.seed(seed)  
# load dataset  
dataframe = read_csv("iris.csv", header=None)  
dataset = dataframe.values  
X = dataset[:,0:4].astype(float)  
Y = dataset[:,4]  
# encode class values as integers  
encoder = LabelEncoder()  
encoder.fit(Y)  
encoded_Y = encoder.transform(Y)  
# convert integers to dummy variables (i.e. one hot encoded) dummy_y = np_utils.to_categorical(encoded_Y)  
# define baseline model  
def baseline_model():
	# create model 

	model = Sequential()  
	model.add(Dense(8, input_dim=4, activation='relu'))  
	model.add(Dense(3, activation='softmax'))  
	# Compile model  
	model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
	return model

estimator = KerasClassifier(build_fn=baseline_model, epochs=200, batch_size=5, verbose=0) kfold = KFold(n_splits=10, shuffle=True, random_state=seed)  
results = cross_val_score(estimator, X, dummy_y, cv=kfold)  
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

结果归纳为在数据集上的均值和在模型准确率的标准差。在未知数据上,模型性能的估计是合理的。对于这个问题也是我们所知道最好的结果。

 Accuracy: 97.33% (4.42%)

4.8 总结

在这节课,你已经学习了如何通过Keras Python库构建和评估神经网络。完成这个教程后,你已经学到:

  • 如何加载数据并在Keras可用。
  • 如何使用one-hot编码为多类分类数据建模做准备。
  • 如何使用Keras神经网络模型和scikit-learn。
  • 针对多分类问题,如何使用Keras定义一个神经网络。
  • 如何使用scikit-learn和K-折交叉验证来评价Keras神经网络模型。

4.8.1 接下来

这是你的第一个在单独的数据集上使用Keras的端到端项目。在接下来的课程,你将针对二分类问题构建神经网络模型并调节它们来提高模型性能。

鸢尾花数据集

你可能感兴趣的:(深度学习入门,深度学习,神经网络,机器学习,人工智能)