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 神经网络项目实战 

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

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

相关文章

C++学习笔记——友元及重载运算符

目录 一、友元 1.1声明友元函数 1.2声明友元类 二、运算符重载 2.1重载加号运算符 2.2重载流插入运算符 三、一个简单的银行管理系统 四、 详细的介绍 一、友元 在 C 中,友元是一个函数或类,它可以访问另一个类的私有成员或保护成员。通常情况下…

RT-Thread 线程管理

线程管理 在日常生活中,我们要完成一个大任务,一般会将它分解成多个简单、容易解决的小问题,小问题逐个被解决,大问题也就随之解决了。 在多线程操作系统中,也同样需要开发人员把一个复杂的应用分解成多个小的、可调…

k8s--集群调度(kube-scheduler)

了解kube-scheduler 由之前博客可知kube-scheduler是k8s中master的核心组件之一 scheduler:负责调度资源。把pod调度到node节点。他有两种策略: 预算策略:人为部署,指定node节点去部署新建的pod 优先策略:通过算法选…

FineBI实战项目一(11):每日不同商品分类订单个数统计

1 明确数据分析目标 统计所有订单中的每种分类对应的商品的个数,构建词云图 2 创建用于保存数据分析结果的表 create table app_cat_cnt(id int primary key auto_increment,daystr varchar(20),catName varchar(100),cnt int ); 3 编写SQL语句进行数据分析 se…

亲测有效:腾讯云免费服务器30天申请流程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云百科txybk.com分享2024年最新腾讯云免费服务器…

「MCU」SD NAND芯片之国产新选择优秀

文章目录 前言 传统SD卡和可贴片SD卡 传统SD卡 可贴片SD卡 实际使用 总结 前言 随着目前时代的快速发展,即使是使用MCU的项目上也经常有大数据存储的需求。可以看到经常有小伙伴这样提问: 大家好,请问有没有SD卡芯片,可以…

程序员必备的面试技巧

程序员必备的面试技巧 程序员必备的面试技巧,就像是编写一段完美的代码一样重要。在面试战场上,我们需要像忍者一样灵活,像侦探一样聪明,还要像无敌铁金刚一样坚定。只有掌握了这些技巧,我们才能在面试的舞台上闪耀光…

C# .Net学习笔记—— 异步和多线程(Task)

一、概念 Task是DotNet3.0之后所推出的一种新的使用多线程的方式,它是基于ThreadPool线程进行封装的。 二、使用多线程的时机 任务能够并发运行的时候,提升速度;优化体验 三、基本使用方法 private void button5_Click(object sender, Ev…

猫头虎分享已解决Bug || Go Error: cannot use str (type string) as type int in assignment

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

以太网交换基础

0x00 前言 以为主要的作用的笔记的记忆,所以多为问答的形式进行记录。 什么是以太网? 以太网是一种局域网技术,用于链接终端,进行网络通信。 什么是冲突域? 冲突域是指连接在同一公共介质上的所有节点的集合。 就…

静态网页设计——多彩贵州(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 感谢大佬的视频:https://www.bilibili.com/video/BV1cK411v7R2/?vd_source5f425e0074a7f92921f53ab87712357b 源码:https://space.bilibili.com…

Spring——Spring的事务控制(2)升级篇

1.改造转账案例 1.1.applicationContext.xml <!--配置事物管理器--><bean class"org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name"dataSource" ref"dataSource"/></bean><!--配…

matlab使用PhysioNet的WFDB工具箱

目录 PhysioNet 官方安装示例 PhysioNet 官方 官方的文档&#xff1a;Waveform Database Software Package (WFDB) for MATLAB and Octave 简介&#xff1a;用于MATLAB的WFDB工具箱是用于读取、写入和操作&#xff08;处理&#xff09;PhysioNet数据的MATLAB函数的集合&#x…

python爬取豆瓣影评,涉及知识点:bs4,requests、time、random

页面源代码: <!DOCTYPE html> <html lang="zh-CN" class="ua-windows ua-webkit"> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="renderer" conten…

Python单继承,子类调用父类方法,使用super关键字

但是这么写话还是并不符合我们平时写代码的规范&#xff0c;一般都是用super来调用&#xff0c;贴代码&#xff1a; # 面向对象的3大特征&#xff1a;继承性&#xff0c;封装性&#xff0c;多态性 class Human():sum1 0def __init__(self, name, age):self.name nameself.ag…

Codeforces Round 646 (Div. 2) C. Game On Leaves

题目链接&#xff1a;Problem - 1363C - Codeforces 题意&#xff1a;给定一颗树和一个节点x&#xff0c;每次从这棵树上删除一个叶子节点及其任何一条连接的边&#xff0c;Ayush先手&#xff0c;问谁先取到节点x。 博弈论问题&#xff0c;先看两个样例是如何取到的。 对于样例…

【Spring】17 @Component 注解

文章目录 1. 定义2. 好处3. 示例代码4. 组件命名总结 在 Spring 框架中&#xff0c; Component 注解是一个 通用的注解&#xff0c;用于标识一个类为 Spring 容器管理的 组件。它就可以让这个类成为 Spring IoC 容器中的一个 Bean&#xff0c;并允许 通过扫描机制自动发现和…

IIC Master 设计实现

写个IIC的主机来玩一玩。 仅100M时钟输入SCL波形工整&#xff0c;任意两个上升沿之间均为整数倍周期&#xff0c;占空比50%发送数据时SDA严格对其到SCL低电平正中间尽可能少的状态机不浪费资源数据逻辑和时序逻辑分离 接口设计中&#xff0c;我的思路是将数据与时序分离开&am…

群晖安装MariaDB

群晖安装MariaDB 在套件中心安装MariaDB给root开启远程访问权限使用工具连接数据库 在套件中心安装MariaDB 给root开启远程访问权限 # ssh 登陆群晖后执行下面操作 $ mysql -uroot -p[数据库密码] $ use mysql; $ select User,authentication_string,Host from user; # 查看账…

服务端性能测试——性能测试体系

目录&#xff1a; 1.性能测试介绍 性能测试介绍性能体系&#xff1a;性能测试与分析优化&#xff1a;行业流行性能压测工具介绍行业流行性能监控工具介绍行业流行性能剖析工具介绍性能测试流程与方法性能测试计划 计划&#xff1a;DAU&#xff0c;PV(perday)&#xff0c;订单量…