MLP(多层感知机) 虚战1

使用Keras实现MLP

前两节地址:

CSDNmatplotlib 虚战1-CSDN博客    (数据的获取在这有说明)

数据预处理 虚战1-CSDN博客CSDN

数据预处理的最后一步:将数据集分为 训练数据集测试数据集校验数据集

训练数据集:神经网络将基于此子数据集进行训练。

测试数据集:基于此子数据集对模型进行最终的评估。

验证数据集:提供无偏差数据以帮助我们进行超参数的调节(调节隐藏层的个数)
数据预处理 虚战1-CSDN博客  preprocess的代码在这

import numpy as np
np.random.seed(16)
import matplotlib
matplotlib.use("TkAgg")
from utils import preprocess
import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np
np.random.seed(16)df = pd.read_csv('diabetes.csv')# Perform preprocessing and feature engineering
df = preprocess(df)# Split the data into a training and testing set
X = df.loc[:, df.columns != 'Outcome']
y = df.loc[:, 'Outcome']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

这里只把数据简单分为训练数据集和测试数据集

X = df.loc[:, df.columns != 'Outcome']  # 获取全部的行,除了Outcome列的所有列。

y = df.loc[:, 'Outcome']  # 获取全部的行,只要Outcome列。

记住Outcome是目标结果,有糖尿病或者没有糖尿病,即1或者0。

train_test_split()  函数完成这个分割过程,80%作为训练数据集、 20%作为测试数据集。

 模型结构

MLP是一种前馈神经网络,至少有一个隐藏层,且每层均通过一个非线性激活函数。这种多层神经网络结构和非线性激活函数使得MLP可以生成非线性的决策边界。

输入层:输入层的每个节点表示一个特征。

隐藏层:对应一个激活函数,该层最终输出结果由激活函数、权重和偏差决定。

激活函数:需要为每一层选择一个激活函数

这里使用,修正线性单元(Rectified Linear Unit,ReLU)和 sigmoid 激活函数作为激活函数。

ReLU常常作为中间层的激活函数(非输出层),是深度神经网络的默认的激活函数。

ReLU函数仅仅考虑原始X中非负的部分,并将负数部分替换为0。

sigmoid激活函数将输出值的范围压缩至0到1之间。sigmoid激活函数接收一个输入值并输出一个二元的分类结果(1或0)。

建模

使用Keras构建模型

通过将层堆叠起来的方法在Keras中创建一个神经网络:

activation='relu'

1.先创建一个Sequential()类

model = Sequential()

2.然后创建第一个隐藏层,该隐藏层包含32个节点,输入的维度input_dim是8,因为该数据集有8个特征。只有第一个隐藏层需要指明输入维度,后面的隐藏层会自动处理。

第一个隐藏层中节点的个数,比如这里设置的32,是一个超参数(需要调试才得出来的数),这里人为的选择32作为节点个数,该数据集较简单,该变量产生的影响并不大。

 activation='relu'   选择ReLU作为激活函数

3.添加第二个隐藏层

4.添加输出层,输出层只有一个节点,因为处理的是二元分类问题,激活函数使用的是sigmoid函数,它将输出结果压缩至0~1(二元输出)。

模型编译
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

训练模型之前,先定义训练过程的参数,通过compile()方法完成。

训练过程中的3个参数:

优化器:这里使用adam优化器

损失函数:使用二元交叉熵(binary_crossentropy)作为损失函数,因为这是一个二元分类问题

评估标准:使用准确率(即正确分类的样本比例)作为模型性能的评估标准。

模型训练

model.fit(X_train, y_train, epochs=200)

调用fit函数训练我们之前训练的模型,进行200轮,可以看到每一轮训练的情况,损失减少,准确度提高。这是学习算法根据训练数据在持续不断更新MLP的权重和偏差。这里的准确率指的是基于训练数据集的准确率。

结果分析

 MLP模型已经完成训练,可通过基于测试准确率混淆矩阵(confusion matrix)受试者操作特征曲线(Receiver Operating Characteristic,ROC)评估模型的性能

# Results - Accuracy
scores = model.evaluate(X_train, y_train, verbose=False)
print("Training Accuracy: %.2f%%\n" % (scores[1]*100))
scores = model.evaluate(X_test, y_test, verbose=False)
print("Testing Accuracy: %.2f%%\n" % (scores[1]*100))

训练数据集测试数据集上的模型准确率。

可以看到训练数据集的准确率是会比测试数据集的准确率高很多的,因为本来就是在训练数据集上训练出来的。基于测试数据计算出的准确率是我们评估模型在真实环境中应用准确率的标准,这是数据是模型未曾训练过的。

混淆矩阵是一个很有用的可视化工具。

真阴性:实际分类为阴性(没有糖尿病)而模型预测结果也是阴性(未患糖尿病)

假阴性:实际分类为阳性(有糖尿病) 而模型预测结果是阴性(未患糖尿病)

真阳性:实际分类为阳性(患糖尿病)而模型预测结果为阳性(患糖尿病)

假阳性:实际分类为阴性(未患糖尿病)而模型预测结果为阳性(患糖尿病)

真阳性和真阴性的数量越多就好,而假阳性和假阴性的数量越少越好。

# Results - Confusion Matrix
y_test_pred = model.predict_classes(X_test)
c_matrix = confusion_matrix(y_test, y_test_pred)
ax = sns.heatmap(c_matrix, annot=True, xticklabels=['No Diabetes', 'Diabetes'], yticklabels=['No Diabetes', 'Diabetes'], cbar=False, cmap='Blues')
ax.set_xlabel("Prediction")
ax.set_ylabel("Actual")
plt.show()
plt.clf()

sns.heatmap()绘制热度图              

c_matrix  :数据

cmap:定义热度图的配色板

annot:是否显示数值注释

cbar:删除seaborn中默认的条带,设置cbar=False。

xticklabels、yticklabels  刻度标签 

ROC曲线

将真阳性率(TPR)作为y轴,假阳性率(FPR)作为x轴。

 在分析ROC曲线时,通过曲线下方面积(Area Under the Curve,AUC)可以对该曲线的模型进行性能评估。

AUC大,表示模型能够更准确地区分不同分类

AUC小,表示模型做出的预测准确率不高,预测结果常有错

落在对角线上的ROC表示模型预测准确率并不高于随机预测的。

scikit-learn 提供了roc_curve类来帮我们绘制ROC曲线。

# Results - ROC Curve
y_test_pred_probs = model.predict(X_test)
FPR, TPR, _ = roc_curve(y_test, y_test_pred_probs)
plt.plot(FPR, TPR)
plt.plot([0,1],[0,1],'--', color='black') #diagonal line  对角线
plt.title('ROC Curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.show()
plt.clf()

结果:

可以看出,该模型预测效果不错。 

全部代码:
 

import matplotlib
matplotlib.use("TkAgg")
from utils import preprocess
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.metrics import roc_curve
from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(16)df = pd.read_csv('diabetes.csv')# Perform preprocessing and feature engineering
df = preprocess(df)# Split the data into a training and testing set
X = df.loc[:, df.columns != 'Outcome']
y = df.loc[:, 'Outcome']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)# Build neural network in Keras
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=8))
model.add(Dense(16, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=200, verbose=False)# Results - Accuracy
scores = model.evaluate(X_train, y_train, verbose=False)
print("Training Accuracy: %.2f%%\n" % (scores[1]*100))
scores = model.evaluate(X_test, y_test, verbose=False)
print("Testing Accuracy: %.2f%%\n" % (scores[1]*100))# Results - Confusion Matrix
y_test_pred = model.predict_classes(X_test)
c_matrix = confusion_matrix(y_test, y_test_pred)
ax = sns.heatmap(c_matrix, annot=True, xticklabels=['No Diabetes', 'Diabetes'], yticklabels=['No Diabetes', 'Diabetes'], cbar=False, cmap='Blues')
ax.set_xlabel("Prediction")
ax.set_ylabel("Actual")
plt.show()
plt.clf()# Results - ROC Curve
y_test_pred_probs = model.predict(X_test)
FPR, TPR, _ = roc_curve(y_test, y_test_pred_probs)
plt.plot(FPR, TPR)
plt.plot([0,1],[0,1],'--', color='black') #diagonal line
plt.title('ROC Curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.show()
plt.clf()

参考:

python使用seaborn画热力图中设置colorbar图例刻度字体大小_seaborn 设置colorbar刻度-CSDN博客

Python可视化 | Seaborn5分钟入门(六)——heatmap热力图 - 知乎 (zhihu.com) 

python 神经网络项目实战 

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

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

相关文章

leetcode10-困于环中的机器人

题目链接: https://leetcode.cn/problems/robot-bounded-in-circle/description/?envTypestudy-plan-v2&envIdprogramming-skills 思路: 首先,题目要寻找的是成环的情况。 1.如果经历一次指令后的方向仍为北方,要使得机器人循…

vue中key的用法

加key是提升vue渲染效率,减少DOM操作。 vue列表元素的更新机制: 当列表元素没有设置key的时候,vue判断是否操作这个DOM元素,是根据新旧两次数据的元素顺序进行对比,看一下元素内容是否发生变化。发生变化vue就操作这个…

安卓开发--proj4j坐标转换快速上手

本节专门讲解proj4j的使用,关于坐标转换原理,等我后面有时间了再讲解下。 现在最新版本的1.3.0版本使用起来很方面,不需要你手动导包,只要配置下gradle就行了。 目录 1.gradle配置 2.Activity使用 2.1方式1:Obtaining CRSs by name【通过epsg名字获取】 2.2方式2:Obta…

优先队列的使用c++,哈夫曼树带权路径长度

在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。达达决定把所有的果子合成一堆。 每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子…

TS 36.211 V12.0.0-通用功能

本文的内容主要涉及TS 36.211,版本是C00,也就是V12.0.0。

【Flutter 开发实战】Dart 基础篇:最基本的语法内容

在深入了解 Dart 这门编程语言之前,我们需要了解一些关于 Dart 的最基本的知识,像是常量、变量、函数等等,这样才能够让我们的开发效率更上一层楼。在本节,我们将探讨一些基础语法,包括入口方法 main、变量、常量以及命…

【数位dp】【动态规划】C++算法:233.数字 1 的个数

作者推荐 【动态规划】C算法312 戳气球 本文涉及的基础知识点 动态规划 数位dp LeetCode:233数字 1 的个数 给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。 示例 1: 输入:n 13 输出:6 示例 2&#xff…

MySQL 8.0中新增的功能(七)

EXPLAIN ANALYZE 语句 在MySQL 8.0.18中引入了一种新形式的EXPLAIN语句,即EXPLAIN ANALYZE,它提供了关于SELECT语句执行的扩展信息,以TREE格式显示查询过程中每个迭代器的执行计划,并可以比较查询的预计成本与实际成本。这些信息…

类和对象的定义以及使用

文章目录 1. 类和对象的基本概念1.1 JAVA是面向对象语言1.2 类和对象的描述 2. 类与对象的定义与使用2.1 类的定义格式2.2 类的实例化(对象的创建)2.3 举个例子 3. 对象的构造及初始化3.1构造方法3.1.1构造方法的定义3.1.2 构造方法的特性 4.2 默认初始化5.4 就地初始化 4.this…

微信群机器人:科技与社交的完美结合

在当今这个数字化时代,微信已经成为人们生活中不可或缺的社交工具。而在微信群组中,机器人作为一种新型的互动方式,正逐渐受到人们的青睐。微信群机器人不仅为群组带来了便利,还为群组成员之间的交流增添了趣味性。本文将探讨微信…

C语言实现特殊数列前n项之和

在本篇博客中,我们将深入剖析一段C语言程序,该程序用于计算一个特定结构数列的前n项之和。这个数列的每一项都由同一数字a重复拼接而成,随着项数的增加,该数字会按照十进制位向左延展。例如,如果给定数字a 2&#xff…

二叉树题目:好叶子结点对的数量

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:好叶子结点对的数量 出处:1530. 好叶子结点对的数量 难度 6 级 题目描述 要求 给定二叉树的根结点 root \texttt{root} root 和整数 …

【Python学习】Python学习5-条件语句

目录 【Python学习】Python学习5-条件语句 前言if语句if语句判断条件简单的语句组参考 文章所属专区 Python学习 前言 本章节主要说明Python的条件语句,Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 …

记一个集群环境部署不完整导致的BUG

一 背景 产品有三个环境:开发测试环境、验收环境、生产环境。 开发测试环境,保持最新的更新; 验收环境,阶段待发布内容; 生产环境,部署稳定内容。 产品为BS架构,后端采用微服务&#xf…

我们找项目外包要注意些什么?

当我们要做一个项目的时候,往往采用外包或自研的方式。外包,就是把项目交出去给外面的人去做。一般分为项目外包和人力外包。人力外包很简单,就是个人充当类似员工的角色,为你开展服务,这种模式一般按时间或者项目付费…

如何查看崩溃日志

目录 描述 思路 查看ipa包崩溃日志 简单查看手机崩溃信息几种方式 方式1:手机设置查看崩溃日志 方式2: Xocde工具 方式3: 第三方软件克魔助手 环境配置 实时日志 奔溃日志分析 方式四:控制台资源库 线上崩溃日志 线上监听crash的几种方式 方式1: 三方平…

[pkg-config] 第三方软件包/库管理工具 pkg-config

参考: 【Linux 库管理工具】深入解析pkg-config与CMake的集成与应用 - 知乎 正文: 构建工程时,多会依赖于第三方库,这些库在安装到系统中后都会创建一个 .pc 后缀的说明文件,里面包含了库的基本信息,比如…

如何启用Windows电脑的内置Administrator账户

前言 不知道从什么时候开始,新电脑或者新系统开机之后都会出现一个界面让你创建一个账户,但这个账户有可能是本地账户(Windows10)还有强制你登录微软账户的(Windows11)。 好像曾经熟悉的电脑Administrator…

Taro +vue3 中 实现 选择城市页面 主要逻辑市 选择了某个城市返回之前的页面

1.需求 当我选中了某个城市 这个页面肯定 从某个页面跳转过来的 此时我先选择了城市 再跳转回去 所以有一个问题就是如何写这个逻辑 2.实现 //当前城市页面 onMounted(() > {const instance: any Taro.getCurrentInstance();if (instance.router.params.url) {sourceUr…

Uncaught (in promise) ReferenceError: require is not defined

在 Vue3 中加载项目路径下的资源图片,起初按照之前 vue 的写法 require 但浏览器却抛出了异常 Uncaught (in promise) ReferenceError: require is not defined 因为 require 采用的 webpack 加载方式,而 vue3 中通过 vite 的方式,两者存在差异,所以才产生了刚开始的一目; vu…