本文作者:bang

用Tensorflow2 搭建神经网络解决二分类问题

bang 2021-07-11 144
用Tensorflow2 搭建神经网络解决二分类问题摘要: 在神经网络的工作原理 中详细介绍了神经网络的知识点,为加深理解,通过一个实例:Tensorflow(Ver2.2)搭建一个神经网络解决逻辑回归二分类的问题 来展示神经网络的工作过程...

在神经网络的工作原理 中详细介绍了神经网络的知识点,为加深理解,通过一个实例:Tensorflow(Ver2.2)搭建一个神经网络解决逻辑回归二分类的问题 来展示神经网络的工作过程。

二分类 属于逻辑回归的问题,先简单回顾一下逻辑回归相关的知识点,

什么是逻辑回归

线性回归预测的是一个连续值;逻辑回归给出的”是”和“否”的回答,解决的是分类的问题

Sigmoid函数

Sigmoid函数是一个概率分布函数,给定某个输入,它将输出为一个概率值,取值范围在(0,1),设定阈值0.5(或其他),预测概率低于设定阈值0.5判定为一个类别,高于阈值0.5是判定为另外一个类别。

用Tensorflow2 搭建神经网络解决二分类问题

Sigmoid函数

逻辑回归损失函数

平方差所惩罚的是与损失为同一数量级的情形;对于分类问题,我们最好的使用交叉熵损失函数会更有效,交叉熵会输出一个更大的“损失”。

交叉熵损失函数

交叉熵刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。假设概率分布p为期望输出,概率分布q为实际输出,H(p,q)为交叉熵,则:

用Tensorflow2 搭建神经网络解决二分类问题

交叉熵数学公式

keras交叉熵

keras里,我们使用binary_crossentropy来计算二元交叉熵。

实例:通过一个信用卡欺诈数据判断申请人是否符合放卡要求

样本数据说明:

用Tensorflow2 搭建神经网络解决二分类问题

样本数据

最后1列是标签(-1和1 两类),前15列 是特征

数据准备就绪了,接下来用Tensoflow2.0搭建一个神经网络来构造模型并实现训练和预测功能。

step1 添加引用

# -*- coding: utf-8 -*-import osimport tensorflow as tfimport pandas as pdimport numpy as npimport matplotlib.pyplot as plt

step2 加载数据

######################################是否 信用卡欺诈#######header=None 表示不显示headerdata = pd.read_csv("../dataset/credit-a.csv",header=None)#默认显示前5行print(data.head())# 查看最后一列使用value_counts()方法查看该目标是一个二分类数据#1 总数 和 -1 的总数print('目标值',data.iloc[:,-1].value_counts())#目标值#1 357#-1 296

step3 拆分训练集和测试集

特征

# 特征值 取第1列到倒数第二列x = data.iloc[:,:-1]

标签

# 目标值 最后一列 (我们把-1替换成0 )y = data.iloc[:,-1].replace(-1,0)#print(x,y)

step4 用Tensorflow 构建神经网络模型

#建立模型(顺序模型)module = tf.keras.Sequential()# 添加2个隐藏层,第一个隐藏层4个神经元,第二个神经元也是4个神经元#第一个隐藏层需要输入 输入层样本特征的维度(特征个数)和激活函数module.add(tf.keras.layers.Dense(4,input_shape=(15,),activation="relu")) #第一个隐藏层,神经元个数(自定),样本特征维度,激活函数#再添加一个隐藏层,上一层的输出作为下一层的输入module.add(tf.keras.layers.Dense(4,activation="relu")) # 第二个隐藏层,指定本层神经元的个数 上一层的输出作为下一层的输入,因此不需要告知shape,激活函数# 添加输出层 输出标签的维度是1module.add(tf.keras.layers.Dense(1,activation="sigmoid"))#逻辑回归 使用sigmoid 映射到(0,1)的一个概率值

step5 分析模型

#打印模型架构,print(module.summary())
用Tensorflow2 搭建神经网络解决二分类问题

模型架构

说明

  • 1)构建的模式 是全连接 模型 sequential
  • 2)神经网络的第1个隐藏层,输入是样本数据,共15个特征,全连接时这一层的参数个数是4*(15+1)=64;指定了4个神经元,因此输出维度为4;
  • 3)神经网络的第2个隐藏层,输入是上一层的输出,共4个特征,全连接时这一层的参数个数是4*(4+1)=20;指定了4个神经元,因此输出维度为4;
  • 4)最后一层是输出层,输入是上一层的输出,共4个特征,全连接时这一层的参数个数是1*(4+1)=5;指定了1个神经元,因此输出维度为1;

step6 编译模型

模型构建完成后只是一个空架子,需要给模型设置一些属性。

module.compile(optimizer="adam",#优化器loss="binary_crossentropy",#逻辑回归的损失函数选择 二元交叉熵metrics=["acc"])#训练过程中输出一些度量信息

metrics 是一个list 数据类型,每个epoch会自动计算的一些度量值,如正确率,损失值等,具体情况可以参考API的定义

用Tensorflow2 搭建神经网络解决二分类问题

metrics含义I

step7 训练模型

#给上述模型添加训练数据,启动训练history = module.fit(x,y,epochs=100)

训练结果

用Tensorflow2 搭建神经网络解决二分类问题

当前预测概率只有0.54,并不理想,这个先了解原理,调优可以放在后面再做。

step8 模型训练结果分析

模型的训练结果存放在history 中,可以查看它的类别

print(type(history.history))#<class 'dict'>print(history.history.keys())#dict_keys(['loss', 'acc'])

有了精度和损失 这两个值,可以将不同的epoch的精度和损失绘制出来,

plt.title("loss")plt.plot(history.epoch,history.history.get("loss"))# 对损失值进行绘图plt.show()

epoch和损失值关系如下图所示,

用Tensorflow2 搭建神经网络解决二分类问题

epoch和损失值关系

plt.title("acc")plt.plot(history.epoch,history.history.get("acc"))# 对准确率进行绘图plt.show()

epoch和精度关系如下图所示,

用Tensorflow2 搭建神经网络解决二分类问题

epoch和精度关系

step9 预测

result = module.predict(x)print('result:',result)
用Tensorflow2 搭建神经网络解决二分类问题

e-01 表示10的-1次方

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享