政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(六)—— 二元分类

政安晨的个人主页政安晨

欢迎 👍点赞✍评论⭐收藏

收录专栏政安晨的机器学习笔记

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!

这篇文章咱们将深度学习应用到另一个常见任务中。


前言

在深度学习中,二元分类是一种常见的任务,旨在将输入数据分为两个类别之一这两个类别可以是任意两个互斥的类别,例如“正面”和“负面”,“真”和“假”,或者任何其他可以用于区分数据的两个标签。

二元分类问题的目标是训练一个模型,使其能够根据输入数据的特征来预测其所属的类别。深度学习通过构建深度神经网络来解决这个问题。通常,一个深度神经网络由多个隐藏层组成,每个隐藏层都包含多个神经元。这些神经元通过学习权重和偏差来逐渐调整模型,以最大限度地减少分类错误。

在深度学习中,常用的二元分类算法包括逻辑回归、支持向量机、决策树和随机森林等。这些算法在处理不同类型的数据和任务时表现不同,所以选择适合特定问题的算法是很重要的。

为了训练一个二元分类模型,需要准备一个标记好的训练数据集,其中包含了输入数据和对应的类别标签。然后,将数据输入到深度神经网络中,通过反向传播算法和梯度下降优化算法来调整模型的参数,以使模型能够更好地预测新的未见过的数据样本的类别。

在实际应用中,二元分类可以应用于很多领域,例如情感分析、垃圾邮件过滤、疾病诊断等。通过深度学习的技术,可以提高模型的准确性和泛化能力,使其在复杂的数据集上取得更好的性能。

到目前为止,我们在本系列的文章中已经学习了神经网络如何解决回归问题。现在我们将把神经网络应用到另一个常见的机器学习问题:分类。我们之前学到的大部分内容仍然适用。主要的区别在于我们使用的损失函数以及我们希望最后一层产生什么样的输出

二元分类 

将数据分为两个类别是一种常见的机器学习问题。你可能想预测一个客户是否有可能购买,一笔信用卡交易是否存在欺诈,深空信号是否显示出一颗新行星的证据,或者一项医学测试是否有疾病的证据。这些都是二元分类问题。

在原始数据中,类别可能由字符串表示,例如 "Yes" 和 "No",或者 "Dog" 和 "Cat"。在使用这些数据之前,我们将为其分配一个类别标签:一个类别将被赋值为 0,另一个类别将被赋值为 1将类别标签分配为数字将使数据能够被神经网络使用。

准确率和交叉熵

准确率是用于衡量分类问题成功程度的众多度量中的一种。准确率是正确预测数与总预测数的比值:准确率 = 正确预测数 / 总预测数。如果一个模型的预测始终正确,其准确率为1.0。其他条件相同的情况下,准确率是一个合理的度量指标,适用于数据集中的类别出现频率相近的情况。

准确率(以及大多数其他分类指标)的问题在于它不能用作损失函数。随机梯度下降(SGD)需要一个变化平滑的损失函数,但准确率作为一个计数比率,变化是“跳跃”的。因此,我们必须选择一个替代物来充当损失函数。这个替代物就是交叉熵函数。

现在,回想一下,损失函数定义了网络在训练过程中的目标。在回归中,我们的目标是最小化预期结果和预测结果之间的距离。我们选择了MAE来衡量这个距离。

对于分类任务,我们所希望的是概率之间的距离,而交叉熵提供了这种距离。交叉熵是一种衡量从一个概率分布到另一个概率分布的距离的方法。

交叉熵对错误的概率预测进行惩罚。

这个想法是我们希望我们的网络能以概率1.0预测出正确的类别。预测概率距离1.0越远,交叉熵损失就越大。

我们使用交叉熵的技术原因有点微妙,但从本节中要记住的主要事情就是:

对于分类损失,请使用交叉熵;

您可能关心的其他指标(如准确性)往往也会随之改善。

使用Sigmoid函数生成概率

交叉熵和准确率函数都需要概率作为输入,也就是0到1之间的数字。为了将密集层产生的实值输出转换为概率,我们需要使用一种新的激活函数,即sigmoid激活函数

Sigmoid函数将实数映射到区间[0,1]中。

为了得到最终的类别预测,我们定义了一个阈值概率。通常情况下,这个阈值概率是0.5,这样四舍五入就可以给出正确的类别预测:小于0.5表示标签为0的类别,大于等于0.5表示标签为1的类别。0.5阈值是Keras在默认情况下使用的准确度指标。

示例 — 二元分类

让我们尝试下面这个例子:

电离层数据集包含从地球大气层的电离层层面上获取的雷达信号特征。任务是确定信号是否显示出某个物体的存在,还是只是空气。

import pandas as pd
from IPython.display import display

ion = pd.read_csv('../input/dl-course-data/ion.csv', index_col=0)
display(ion.head())

df = ion.copy()
df['Class'] = df['Class'].map({'good': 0, 'bad': 1})

df_train = df.sample(frac=0.7, random_state=0)
df_valid = df.drop(df_train.index)

max_ = df_train.max(axis=0)
min_ = df_train.min(axis=0)

df_train = (df_train - min_) / (max_ - min_)
df_valid = (df_valid - min_) / (max_ - min_)
df_train.dropna(axis=1, inplace=True) # drop the empty feature in column 2
df_valid.dropna(axis=1, inplace=True)

X_train = df_train.drop('Class', axis=1)
X_valid = df_valid.drop('Class', axis=1)
y_train = df_train['Class']
y_valid = df_valid['Class']
V1V2V3V4V5V6V7V8V9V10...V26V27V28V29V30V31V32V33V34Class
1100.99539-0.058890.852430.023060.83398-0.377081.000000.03760...-0.511710.41078-0.461680.21266-0.340900.42267-0.544870.18641-0.45300good
2101.00000-0.188290.93035-0.36156-0.10868-0.935971.00000-0.04549...-0.26569-0.20468-0.18401-0.19040-0.11593-0.16626-0.06288-0.13738-0.02447bad
3101.00000-0.033651.000000.004851.00000-0.120620.889650.01198...-0.402200.58984-0.221450.43100-0.173650.60436-0.241800.56045-0.38238good
4101.00000-0.451611.000001.000000.71216-1.000000.000000.00000...0.906950.516131.000001.00000-0.200990.256821.00000-0.323821.00000bad
5101.00000-0.024010.941400.065310.92106-0.232550.77152-0.16399...-0.651580.13290-0.532060.02431-0.62197-0.05707-0.59573-0.04608-0.65697good

我们将和回归任务一样定义我们的模型,只有一个例外。在最后一层中包括一个'sigmoid'激活函数,以便模型能够产生类别概率。

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Dense(4, activation='relu', input_shape=[33]),
    layers.Dense(4, activation='relu'),    
    layers.Dense(1, activation='sigmoid'),
])

将交叉熵损失和准确度度量指标添加到模型中,并使用compile方法。

对于两类问题,请确保使用“binary”版本。(对于更多类别的问题会稍有不同。)Adam优化器在分类问题上效果很好,因此我们将继续使用它。

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['binary_accuracy'],
)

在这个特定问题中,模型可能需要很多个时期来完成训练,因此我们将包含一个提前停止的回调函数以方便操作。

early_stopping = keras.callbacks.EarlyStopping(
    patience=10,
    min_delta=0.001,
    restore_best_weights=True,
)

history = model.fit(
    X_train, y_train,
    validation_data=(X_valid, y_valid),
    batch_size=512,
    epochs=1000,
    callbacks=[early_stopping],
    verbose=0, # hide the output because we have so many epochs
)

我们将像往常一样查看学习曲线,还会检查在验证集上获得的损失和准确率的最佳值。(请记住,提前停止训练会恢复权重到获得这些值的状态。)

history_df = pd.DataFrame(history.history)
# Start the plot at epoch 5
history_df.loc[5:, ['loss', 'val_loss']].plot()
history_df.loc[5:, ['binary_accuracy', 'val_binary_accuracy']].plot()

print(("Best Validation Loss: {:0.4f}" +\
      "\nBest Validation Accuracy: {:0.4f}")\
      .format(history_df['val_loss'].min(), 
              history_df['val_binary_accuracy'].max()))

做个练习:二元分类

介绍

在这个练习中,你将使用一个二元分类器来预测酒店取消预订。

# Setup plotting
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
# Set Matplotlib defaults
plt.rc('figure', autolayout=True)
plt.rc('axes', labelweight='bold', labelsize='large',
       titleweight='bold', titlesize=18, titlepad=10)
plt.rc('animation', html='html5')

# Setup feedback system
from learntools.core import binder
binder.bind(globals())
from learntools.deep_learning_intro.ex6 import *

首先,加载“酒店取消”数据集。

import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer

hotel = pd.read_csv('../input/dl-course-data/hotel.csv')

X = hotel.copy()
y = X.pop('is_canceled')

X['arrival_date_month'] = \
    X['arrival_date_month'].map(
        {'January':1, 'February': 2, 'March':3,
         'April':4, 'May':5, 'June':6, 'July':7,
         'August':8, 'September':9, 'October':10,
         'November':11, 'December':12}
    )

features_num = [
    "lead_time", "arrival_date_week_number",
    "arrival_date_day_of_month", "stays_in_weekend_nights",
    "stays_in_week_nights", "adults", "children", "babies",
    "is_repeated_guest", "previous_cancellations",
    "previous_bookings_not_canceled", "required_car_parking_spaces",
    "total_of_special_requests", "adr",
]
features_cat = [
    "hotel", "arrival_date_month", "meal",
    "market_segment", "distribution_channel",
    "reserved_room_type", "deposit_type", "customer_type",
]

transformer_num = make_pipeline(
    SimpleImputer(strategy="constant"), # there are a few missing values
    StandardScaler(),
)
transformer_cat = make_pipeline(
    SimpleImputer(strategy="constant", fill_value="NA"),
    OneHotEncoder(handle_unknown='ignore'),
)

preprocessor = make_column_transformer(
    (transformer_num, features_num),
    (transformer_cat, features_cat),
)

# stratify - make sure classes are evenlly represented across splits
X_train, X_valid, y_train, y_valid = \
    train_test_split(X, y, stratify=y, train_size=0.75)

X_train = preprocessor.fit_transform(X_train)
X_valid = preprocessor.transform(X_valid)

input_shape = [X_train.shape[1]]

1. 定义模型

这次我们将使用的模型将包含批量归一化(batch normalization)和丢弃层(dropout)。

为了方便阅读,我们已将图表分成了几个块,但你可以按照通常的方式逐层定义它。

定义一个模型,其架构由以下图表给出:

二分类器的图示。

from tensorflow import keras
from tensorflow.keras import layers

# YOUR CODE HERE: define the model given in the diagram
model = ____

# Check your answer
q_1.check()

2. 添加优化器、损失函数和评估指标

现在使用Adam优化器和交叉熵损失函数和准确度指标的二进制版本来编译模型。

# YOUR CODE HERE
____

# Check your answer
q_2.check()
# Lines below will give you a hint or solution code
#q_2.hint()
#q_2.solution()

最后,运行这个单元格来训练模型并查看学习曲线。这可能需要大约60到70个epochs,可能需要一到两分钟。

early_stopping = keras.callbacks.EarlyStopping(
    patience=5,
    min_delta=0.001,
    restore_best_weights=True,
)
history = model.fit(
    X_train, y_train,
    validation_data=(X_valid, y_valid),
    batch_size=512,
    epochs=200,
    callbacks=[early_stopping],
)

history_df = pd.DataFrame(history.history)
history_df.loc[:, ['loss', 'val_loss']].plot(title="Cross-entropy")
history_df.loc[:, ['binary_accuracy', 'val_binary_accuracy']].plot(title="Accuracy")

3. 训练和评估

你对学习曲线有什么看法?模型是否欠拟合或过拟合?交叉熵损失是否是准确度的一个很好的替代指标?

结论

恭喜您,这是咱们这个系列的最后一篇文章,如果您都看完了,凭借您的新技能,您可以开始进行更高级的应用了,如计算机视觉和情感分类。您想下一步做什么呢?(呵呵)


本系列总共六篇文章,前五篇分别是:

【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(一)—— 单个神经元

【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(二)—— 深度神经网络

【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(三)—— 随机梯度下降

【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(四)—— 过拟合和欠拟合

【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(五)—— Dropout和批归一化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/480735.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

说说webpack的构建流程?

文章目录 一、运行流程初始化流程编译构建流程compile 编译make 编译模块build module 完成模块编译 输出流程seal 输出资源emit 输出完成 二、小结参考文献 一、运行流程 webpack 的运行流程是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会…

selenium自动化登录模块HTMLTestRunner测试报告

1.下载HTMLTestRunner.py放到python的Lib目录下,python3之后的,文件要修改以下内容: 第94行,将import StringIO修改成import io 第539行,将self.outputBuffer StringIO.StringIO()修改成self.outputBuffer io.Strin…

eth 交易案例分析9

交易hash: 先用0.26eth买入了多个GPT,然后用这多个GPT 在uniswap3 兑换了1.69 个eth, 疑问点:买入的 DLP 什么意思?

C++一维数组练习oj

思路分析:这题它说n是小于等于1000的,那么我们现在就需要找出1--1000的幸运数 4,7,44,47,74,77,444,447,474,477,774,747&…

OCR研究背景及相关论文分享

光学字符识别(Optical Character Recognition,OCR)是指使用光学方法将图像中的文字转换为机器可编辑的文本的技术。OCR技术的研究和应用已有数十年的历史,其背景和发展受到多方面因素的影响。 技术需求背景 1.自动化文档处理&am…

从原理到实践:深入探索Linux安全机制(一)

前言 本文将从用户和权限管理、文件系统权限、SELinux、防火墙、加密和安全传输、漏洞管理和更新等几个Linux安全机制中的重要方面,深入探索其工作原理和使用方法。在当今数字化时代,网络安全问题备受关注,Linux作为广泛应用的操作系统之一&…

Github 2024-03-23 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-23统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero General Public Li…

Mora: Enabling Generalist Video Generation via A Multi-Agent Framework

Mora: Enabling Generalist Video Generation via A Multi-Agent Framework PDF: https://arxiv.org/html/2403.13248v1 1 概述 为弥补Sora不开源的缺陷,本文提出多代理框架Mora,整合先进视觉AI代理,复制Sora的全能视频生成能力。Mora能利用…

Springboot+vue的作业管理系统+数据库+报告+免费远程调试

项目介绍: Springbootvue的作业管理系统,Javaee项目,springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的作业管理系统,采用M(model)V(view)C(controller&…

docker将本地镜像推送到阿里云服务器上

目录 一、制作一个简单的Ubuntu中安装vim的镜像 二、在阿里云上面创建镜像仓库 三、从阿里云仓库中上传和拉取镜像 一、制作一个简单的Ubuntu中安装vim的镜像 docker pull ubuntu docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu …

spring boot商城、商城源码 欢迎交流

一个基于spring boot、spring oauth2.0、mybatis、redis的轻量级、前后端分离、防范xss攻击、拥有分布式锁,为生产环境多实例完全准备,数据库为b2b2c设计,拥有完整sku和下单流程的商城 联系: V-Tavendor

C语言——利用冒泡排序模拟实现qsort函数

一.冒泡排序 冒泡排序是C语言中众多排序中的一种。它的排序逻辑为(升序):从第一个元素开始和相邻的比较,如果第一个元素大于第二个元素,则交换,反之不交换;第二个再与第三个元素比较&#xff0…

SAP BAS中Fiori开发的高阶功能(storyboard, navigation, guided development, variant)

1. 前言 在之前的几篇文章中,我介绍了SAP BAS的一些基本功能,包括账户申请,创建工作区,git的使用以及如何step-by-step去创建出你的第一个Fiori项目等等。在本篇中,我将进一步介绍一些在开发Fiori应用程序时会用到的高…

唯众物联网安装调试员实训平台物联网一体化教学实训室项目交付山东技师学院

近日,山东技师学院物联网安装调试员实训平台及物联网一体化教学实训室采购项目已顺利完成交付并投入使用,标志着学院在物联网技术教学与实践应用方面迈出了坚实的一步。 山东技师学院作为国内知名的技师培养摇篮,一直以来致力于为社会培养高…

如何在linux环境上部署单机ES(以8.12.2版本为例)

ES安装(以8.12.2版本为例) 首先创建好对应的文件夹然后在对应的文件夹下执行依次这些命令 1.wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.12.2-linux-x86_64.tar.gz 2.wget https://artifacts.elastic.co/downloads/…

Android iOS客户端自动化UI自动化airtest从0到1搭建macos

一、基础环境 1. 安装jdk 选择jdk8 如果下载高版本 可能不匹配会失败 下载.dmg文件 苹果电脑 | macOS | jdk1.8 | 环境变量配置_jdk1.8 mac-CSDN博客 Java Downloads | Oracle jdk环境变量配置 找到java home qamac ~ % cd /Library/J…

跳过mysql权限验证来修改密码-GPT纯享版

建议重新配置一遍,弄成功好多次了,每次都出bug,又要重新弄,不是过期就是又登不进去了,我服了 电脑配置MySQL环境(详细)这个哥们的10min配完,轻轻松松, 旧方法&#xff…

Skywalking的Helm Chart方式部署

背景 之前介绍了AWS云上面的EKS的集中日志方案。这次主要介绍调用链监控了,这里我们用的是Skywalking。监控三王者(EFKPrometheusSkywalking)之一。之前AWS云上面使用fluent bit替代EFK方案,其实,AWS云在调用链方面&a…

谈谈曲线的阶次

曲线的阶次(Degree)是数学和几何学中一个重要的概念,它通常与曲线的方程和性质有关。在几何学中,曲线的阶次可以理解为曲线方程的指数或次数。例如,直线的方程是YKxb,它是一次方程,因此直线被认…

PMSM 永磁同步电机滑膜控制 SVPWM矢量控制 matlab simulink 仿真

仿真搭建平台: (1)该模型采用matlab/simulink 2016b版本搭建,使用matlab 2016b及以上版本打开最佳; (2)该模型已经提前转换了各个常用版本(最低为matlab2012b),防止出现提示版本过高的情况。 模型截图: 算…