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

政安晨的个人主页政安晨

欢迎 👍点赞✍评论⭐收藏

收录专栏: 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 displayion = 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 layersmodel = 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 pdfrom 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_transformerhotel = 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 valuesStandardScaler(),
)
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和批归一化

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32学习笔记(6_1)- TIM定时器定时功能原理

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。 最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com 现在开…

(ES6)前端八股文修炼Day2

1. let const var 的区别 var: var 是在 ES5 中引入的声明变量的关键字。 具有函数作用域,而不是块作用域,这意味着使用 var 声明的变量在函数内部是可见的。 变量可以被重复声明,而且变量的值可以在声明前使用,这可能…

jmeter链路压测

比如登录后返回token,业务打印上传的操作需要用到token 线程组中添加登录请求,并执行 1、添加登录并执行,查看结果 2、结果树中下拉选择正则表达式,将token参数和值复制粘贴到下方,将token值改为(.*?)&#xff0…

【Nebula笔记】简介及安装

目录 一、简介 (一) 什么是图数据库 二、安装 (一) 原生安装 (二) Docker & Docker compose 1. Docker安装 Linux Window 2. 部署NebulaGraph (三) to MAC 三、Nebula Graph Studio (一) 版本兼容性 (二) 原生安装 (三) Docker compose (四) 连接Nebula Gra…

python—接口编写部分

最近准备整理一下之前学过的前端小程序知识笔记,形成合集。顺便准备学一学接口部分,希望自己能成为一个全栈嘿嘿。建议关注收藏,持续更新技术文档。 目录 前端知识技能树http请求浏览器缓存 后端知识技能树python_api:flaskflask…

Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(四)

概览 从上一篇博文: Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(三)我们学到了 Swift 中完全自己撸码实现 SwiftHook 类似功能的基本思路、提出了两个“难关”,并首先解决了其中第一道难题。 在这一篇中,我们将会继续克服各种“艰难险阻”,…

Spark spark-submit 提交应用程序

Spark spark-submit 提交应用程序 Spark支持三种集群管理方式 Standalone—Spark自带的一种集群管理方式,易于构建集群。Apache Mesos—通用的集群管理,可以在其上运行Hadoop MapReduce和一些服务应用。Hadoop YARN—Hadoop2中的资源管理器。 注意&…

STM32微控制器的中断优先级设置对系统性能有何影响?

STM32微控制器的中断优先级设置对系统性能有着显著的影响。正确配置中断优先级可以确保关键任务得到及时响应,提高系统的实时性和可靠性。相反,如果中断优先级设置不当,可能会导致系统响应延迟,甚至出现死锁等问题。本文将详细探讨…

python第三方库的安装,卸载和更新,以及在cmd下pip install安装的包在pycharm不可用问题的解决

目录 第三方库pip安装,卸载更新 1.安装: 2.卸载 3.更新 一、第三方库pip安装,卸载更新 1.安装 pip install 模块名 加镜像下载:pip install -i 镜像网址模块名 常用的是加清华镜像,如 pip install -i https://pyp…

Web前端—浏览器渲染原理

浏览器渲染原理 浏览器渲染原理渲染时间点渲染流水线1. 解析HTML—Parse HTML2. 样式计算—Recalculate Style3. 布局—Layout4. 分层—Layer5. 绘制—Paint6. 分块—Tiling7. 光栅化—Raster8. 画—Draw完整过程 面试题1. 浏览器是如何渲染页面的?2. 什么是 reflow…

每日一题 --- 两两交换链表中的节点[力扣][Go]

两两交换链表中的节点 题目:24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1&a…

基于Java中的SSM框架实现考研指导平台系统项目【项目源码+论文说明】

基于Java中的SSM框架实现考研指导平台系统演示 摘要 应对考研的学生,为了更好的使校园考研有一个更好的环境好好的学习,建议一个好的校园网站,是非常有必要的。提供学生的学习提供一个交流的空间。帮助同学们在学习高数、学习设计、学习统计…

Python+django+vue开发的家教信息管理系统

一直想做一款管理系统,看了很多优秀的开源项目但是发现没有合适的。 于是利用空闲休息时间开始自己写了一套管理系统。 功能介绍 平台采用B/S结构,后端采用主流的Pythondjango进行开发,前端采用主流的Vue.js进行开发。 整个平台包括前台和…

Arduino智能家居

文章目录 一、接线框图1、下载fritzing 二、Arduino IDE 下载三、实现代码 一、接线框图 1、下载fritzing https://github.com/fritzing/fritzing-app/releases打开的软件界面如下: 二、Arduino IDE 下载 官网地址 P.S. 如果upload代码过程中出现cant open de…

2024年阿里云轻量应用服务器优惠价格_2核2G_2核4G报价

阿里云轻量应用服务器2核2G和2核4G配置优惠价格表,轻量2核2G3M带宽61元一年,轻量2核4G4M带宽165元1年,均不限制月流量,阿里云活动链接 aliyunfuwuqi.com/go/aliyun 活动打开如下图: 阿里云轻量应用服务器价格 61元/年…

力扣刷题之21.合并两个有序链表

仅做学习笔记之用。 题目: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入&#xf…

MySQL数据库基本操作(增删改查)与用户授权

前言 SQL(Structured Query Language,结构化查询语言)是一种用于管理关系数据库系统的语言。SQL的设计目标是提供一种简单、直观的语言,使得用户可以通过编写SQL语句来处理他们想要的数据和操作。 目录 一、结构介绍 1. 查看信…

使用Django实现信号与消息通知系统【第154篇—Django】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Django实现信号与消息通知系统 在Web应用程序中,实现消息通知系统是至关重…

华为数通 HCIP-Datacom H12-831 题库补充

2024年 HCIP-Datacom(H12-831)最新题库,完整题库请扫描上方二维码,持续更新。 缺省情况下,PIM报文的IP协议号是以下哪一项? A:18 B:59 C:103 D:9 答案&a…

从抛硬币试验看概率论的基本内容及统计方法

一般说到概率,就喜欢拿抛硬币做例子。大多数时候,会简单认为硬币正背面的概率各为二分之一,其实事情远没有这么简单。这篇文章会以抛硬币试验为例子并贯穿全文,引出一系列概率论和数理统计的基本内容。这篇文章会涉及的有古典概型…