B站吴恩达深度学习视频笔记(14)——实战2:解决二分类问题

声纳数据集神经网络实战
本文详述了使用Keras框架对声纳数据集进行神经网络建模的过程,包括数据加载、基线模型创建、K-fold交叉验证、数据标准化、网络拓扑优化等关键步骤,展示了如何通过调整网络结构显著提升模型性能。

前言

相比上一篇实战,在这一篇笔记里,你可以学到更多有关检验和模型优化的经验,对于初学者来说,这样的经验尤为宝贵。同样的,我们还是使用Keras框架。这次是数据集,我们选用声纳数据集。

教程概述

在看完本教程之后你将学会:

  1. 如何加载和准备数据
  2. 如何创建一个基线神经网络模型
  3. 如何使用scikit-learn 和 k-fold 交叉验证评估Keras模型
  4. 数据准备如何提升你的模型的性能
  5. 如何调整网络拓扑结构可以提高模型的性能实验

数据集描述

本教程中我们将使用的数据集是声纳数据集。

这是一个从多个服务收集回来描述声纳返回反射的数据集。60个输入变量描述了在不同角度的反射强度。这是一个二元分类问题,需要一个模型来区分岩石和金属圆筒。
你可以了解更多关于这个在UCI机器学习数据集库。你可以免费下载数据集,并将其重命名为sonar.csv放在您的工作目录。
这是一个很好理解的数据集。所有的变量是连续的,一般在0到1的范围。输出变量是一个字符串“M”和“R”我岩石,它将需要转化为整数 1 和 0 。
使用这个数据集的一个好处是,它是一个标准的基准问题。这意味着我们有一个好的模型的预期能力的想法。使用交叉验证,神经网络能够实现性能大约84%的上限为自定义模型精度在88%左右。

基准神经网络模型的表现

让我们来建立这个问题的基准模型和预测结果。
我们将从导入所有我们需要的类和函数开始:

import time
import numpy
import pandas
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

接下来,我们可以初始化随机数生成器,以确保执行这段代码时,我们总是得到相同的随机数序列。这有助于我们调试。

seed = 7
numpy.random.seed(seed)

现在我们可以使用 pandas 库来加载数据集。将列向量分割成60输入变量(X)和1个输出变量(Y)。我们使用 pandas 加载数据是因为它很容易处理字符串(输出变量),而试图使用 NumPy 加载数据会更困难。

dataframe = pandas.read_csv("data/sonar.csv", header=None) # 加载数据集
dataset = dataframe.values
X = dataset[:, 0:60].astype(float) # 分割为60个输入变量
Y = dataset[:, 60] # 1个输出变量

输出变量是字符串类型,我们必须将其转换为整数值 0 和 1。
我们可以使用从scikit-learn LabelEncoder类。这个类通过 fit() 函数获取整个数据集模型所需的编码,然后使用transform()函数应用编码来创建一个新的输出变量。

encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)

现在我们已经准备好使用Keras创建我们的神经网络模型。
我们将使用scikit-learn的k-fold交叉评估模型验证。这是一个重采样进行模型性能评估的技术。它通过把数据分成k个部分,训练模型在所有k部分中分出一个作为测试集对模型的性能进行评估。这个过程重复 k 次的平均分数作为所有构造模型稳健的性能评估。它是分层的,这意味着它将关注输出值并试图平衡K份数据中每个类别的势利数量。
在 scikit-learn 中使用 Keras 的模型,我们必须使用 KerasClassifier 进行包装。这个类起到创建并返回我们的神经网络模型的作用。它需要传入调用 fit()所需要的参数,比如迭代次数和批处理大小。
让我们开始定义一个函数用于创建我们的基准模型。我们的模型会有一个与输入层神经元相同数量(60个)的全连接隐藏层。这是一个建立神经网络时很好的默认起点。
权值初始化使用一个小的高斯随机数,激活函数使用 ReLU 函数。输出层包含单个神经元以作出预测。使用 sigmoid 激活函数是为了产生一个0到1的范围的概率,这可以很容易地和自动地转换为离散类型的值。
最后,我们使用对数损失函数(binary_crossentropy)训练,这是二元分类问题会优先使用的损失函数。模型还使用高效的 Adam 优化器来做梯度下降,精度指标将模在型训练时收集。

# 基准模型
def create_baseline():
    # create model
    model = Sequential()
    model.add(Dense(60, input_dim=60, init='normal', activation='
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nine_mink

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值