【Pytorch神经网络实战案例】07 预测泰坦尼克号上生存的乘客

1 样本处理

1.1 载入样本代码---Titanic forecast.py(第1部分)

import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from scipy import stats
import pandas as pd
import matplotlib.pyplot as plt
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"def moving_average(a, w=10):#定义函数计算移动平均损失值if len(a) < w:return a[:]return [val if idx < w else sum(a[(idx-w):idx])/w for idx, val in enumerate(a)]def plot_losses(losses):avgloss= moving_average(losses) #获得损失值的移动平均值plt.figure(1)plt.subplot(211)plt.plot(range(len(avgloss)), avgloss, 'b--')plt.xlabel('step number')plt.ylabel('Training loss')plt.title('step number vs. Training loss')plt.show()###1.1 载入样本
titanic_data = pd.read_csv('csv_list/titanic3.csv')
print(titanic_data.columns)
# 输出:Index(['pclass', 'survived', 'name', 'sex', 'age', 'sibsp', 'parch', 'ticket','fare', 'cabin', 'embarked', 'boat', 'body', 'home.dest'],dtype='object')

1.2 离散数据

1.2.1 离散数据的特征

数据之间没有任何连续性的数据称为离散数据,例如数据中的男、女。

离散数据通常可以处理为one-hot编码或者词向量,可以分为两类:

①具有固定类别的样本(性别):易于处理,按照总得类别进行变换

②没有固定类别的样本(姓名):通过hash算法或其他散列算法处理,再通过词向量技术进行转化

1.2.2 连续数据的特征

数据之间具有连续性的数据,称为连续数据,例如票价与年龄

对于连续数据做特征变化时,通过对数运算or归一化处理,使其具有统一的值域

1.2.3 连续数据与离散数据的转化

对于一个跨度很大的特征属性进行数据预处理时,可以有三种方法:

①按照最大值、最小值进行归一化处理

②使用对数运算

③按照分布情况将其分为几类,再做离散化处理

1.3 处理样本中的离散数据与NAn值

1.3.1 将离散数据转化为one-hot编码 代码---Titanic forecast.py(第2部分)

###1.2 处理样本中的离散数据与Nan值
# 将离散数据的字段转化为one-hot
# get_dummies()会根据指定列中的离散值转化为one-hot编码,并将转化后所生成的新列放到原有数据的后面,在新的列中的数据用0,1来表示是否具有该列的属性。
titanic_data = pd.concat([titanic_data,pd.get_dummies(titanic_data['sex']),pd.get_dummies(titanic_data['embarked'],prefix="embark"),pd.get_dummies(titanic_data['pclass'],prefix="class")],axis=1
)
print(titanic_data.columns)
# 输出:Index(['pclass', 'survived', 'name', 'sex', 'age', 'sibsp', 'parch', 'ticket', 'fare', 'cabin', 'embarked', 'boat', 'body', 'home.dest', 'female', 'male', 'embark_C', 'embark_Q', 'embark_S', 'class_1', 'class_2','class_3'],dtype='object')
print(titanic_data['sex'])
print(titanic_data['female']) # 在sex列中,值为female的行,在female列中值为1

1.3.2 对数据中的Nan值进行过滤填充代码---Titanic forecast.py(第3部分)

对于两个具有连续属性的数据列进行Nan值处理,age与fare。

# 对Nan值进行过滤填充
# 调用fillna()对特定列的NAn值进行过滤,并用该列的平均值进行填充
titanic_data["age"] = titanic_data["age"].fillna(titanic_data["age"].mean()) # 乘客年龄
titanic_data["fare"] = titanic_data["fare"].fillna(titanic_data["fare"].mean()) # 乘客票价

1.3.3 剔除无用的数据列代码---Titanic forecast.py(第4部分)

本部分剔除与遇难无关的数据列。

## 去除与是否获取无关的数据列
titanic_data = titanic_data.drop(['name','ticket','cabin','boat','body','home.dest','sex','embarked','pclass'], axis=1)
print(titanic_data.columns ) # 输出真正需要处理的数据列

1.4 分离样本与标签并制作数据集代码---Titanic forecast.py(第5部分)

将suivived列从数据集中抽取出来,将数据列中剩下的数据作为输入样本。

### 1.3 分离样本和标签并制作数据集
# 分离样本
labels = titanic_data["survived"].to_numpy()titanic_data = titanic_data.drop(['survived'],axis=1)
data = titanic_data.to_numpy()# 样本属性名称
feature_names = list(titanic_data.columns)# 将样本分为训练和测试两部分
np.random.seed(10) # 设置随机种子,保证每次运行所分的样本一致# set() 函数创建一个无序不重复元素集,x-y返回一个新的集合,包括在集合x中但不在集合y中的元素
# random.choice(a=5, size=3, replace=False, p=None) 参数意思分别 是从a中以概率P随机选择3个, p没有指定的时候相当于是一致的分布
# 按照行号提取
train_indices = np.random.choice(len(labels),int(0.7 * len(labels)),replace = False)
print('train_indices++++',train_indices)
test_indices = list(set(range(len(labels))) - set(train_indices)) #将剩余部分设为测试集
print('train_indices++++',train_indices)# data[:]相当于重新拷贝一个列表,列表是可变对象如果直接引用传参给函数,则会导致修改其中任意一个变量,其余变量相应改变。但是,通过这种方式可以避免这种情况。
train_features = data[train_indices]
train_labels = labels[train_indices]test_features = data[test_indices]
test_labels = labels[test_indices]
print('测试样本数量',len(test_labels)) # 测试样本数量 393

2 训练模型

2.1 定义Mish激活函数与多层全连接网络代码---Titanic forecast.py(第6部分)

###定义Mish激活函数与多层全连接网络
# 定一个带有3层全连接网络的类,每个网络层使用Mish作为激活函数,该模型使用交叉熵损失函数
class Mish(nn.Module):def __init__(self):super().__init__()def forward(self,x):x = x * (torch.tanh(F.softplus(x)))return xtorch.manual_seed(0) # 设置随机种子函数class ThreeLinearModel(nn.Module):def __init__(self):super().__init__()self.linear1 = nn.Linear(12,12)self.mish1 = Mish()self.linear2 = nn.Linear(12,8)self.mish2 = Mish()self.linear3 = nn.Linear(8,2)self.softmax = nn.Softmax(dim = 1)self.criterion = nn.CrossEntropyLoss() #定义交叉熵def forward(self,x): # 定义一个全连接网络lin1_out = self.linear1(x)out_1 = self.mish1(lin1_out)out_2 = self.mish2(self.linear2(out_1))return self.softmax(self.linear3(out_2))def getloss(self,x,y): # 实现类的损失值计算接口y_pred = self.forward(x)loss = self.criterion(y_pred,y)return loss

2.2 训练模型并输出结果代码---Titanic forecast.py(第7部分)

### 训练模型并输出结果
if __name__ == '__main__':net = ThreeLinearModel()num_epochs = 200optimizer = torch.optim.Adam(net.parameters(),lr = 0.04)# 将输入的样本标签转化为标量input_tensor = torch.from_numpy(train_features).type(torch.FloatTensor)label_tensor = torch.from_numpy(train_labels)losses = [] # 定义损失值列表for epoch in range(num_epochs):loss = net.getloss(input_tensor, label_tensor)losses.append(loss.item())optimizer.zero_grad()  # 清空之前的梯度loss.backward()  # 反向传播损失值optimizer.step()  # 更新参数if epoch % 20 == 0:print('Epoch {}/{} => Loss: {:.2f}'.format(epoch + 1, num_epochs, loss.item()))os.makedirs('models', exist_ok=True)torch.save(net.state_dict(), 'models/titanic_model.pt')plot_losses(losses)# 输出训练结果# tensor.detach():从计算图中脱离出来,返回一个新的tensor,新的tensor和原tensor共享数据内存,(这也就意味着修改一个tensor的值,另外一个也会改变),#                  但是不涉及梯度计算。在从tensor转换成为numpy的时候,如果转换前面的tensor在计算图里面(requires_grad = True),那么这个时候只能先进行detach操作才能转换成为numpyout_probs = net(input_tensor).detach().numpy()out_classes = np.argmax(out_probs, axis=1)print("Train Accuracy:", sum(out_classes == train_labels) / len(train_labels))# 测试模型test_input_tensor = torch.from_numpy(test_features).type(torch.FloatTensor)out_probs = net(test_input_tensor).detach().numpy()out_classes = np.argmax(out_probs, axis=1)print("Test Accuracy:", sum(out_classes == test_labels) / len(test_labels))

3.0 代码汇总

import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from scipy import stats
import pandas as pd
import matplotlib.pyplot as plt
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"def moving_average(a, w=10):#定义函数计算移动平均损失值if len(a) < w:return a[:]return [val if idx < w else sum(a[(idx-w):idx])/w for idx, val in enumerate(a)]def plot_losses(losses):avgloss= moving_average(losses) #获得损失值的移动平均值plt.figure(1)plt.subplot(211)plt.plot(range(len(avgloss)), avgloss, 'b--')plt.xlabel('step number')plt.ylabel('Training loss')plt.title('step number vs. Training loss')plt.show()###1.1 载入样本
titanic_data = pd.read_csv('csv_list/titanic3.csv')
print(titanic_data.columns)
# 输出:Index(['pclass', 'survived', 'name', 'sex', 'age', 'sibsp', 'parch', 'ticket','fare', 'cabin', 'embarked', 'boat', 'body', 'home.dest'],dtype='object')###1.2 处理样本中的离散数据与Nan值
# 将离散数据的字段转化为one-hot
# get_dummies()会根据指定列中的离散值转化为one-hot编码,并将转化后所生成的新列放到原有数据的后面,在新的列中的数据用0,1来表示是否具有该列的属性。
titanic_data = pd.concat([titanic_data,pd.get_dummies(titanic_data['sex']),pd.get_dummies(titanic_data['embarked'],prefix="embark"),pd.get_dummies(titanic_data['pclass'],prefix="class")],axis=1
)
print(titanic_data.columns)
# 输出:Index(['pclass', 'survived', 'name', 'sex', 'age', 'sibsp', 'parch', 'ticket', 'fare', 'cabin', 'embarked', 'boat', 'body', 'home.dest', 'female', 'male', 'embark_C', 'embark_Q', 'embark_S', 'class_1', 'class_2','class_3'],dtype='object')
print(titanic_data['sex'])
print(titanic_data['female']) # 在sex列中,值为female的行,在female列中值为1
# 对Nan值进行过滤填充
# 调用fillna()对特定列的NAn值进行过滤,并用该列的平均值进行填充
titanic_data["age"] = titanic_data["age"].fillna(titanic_data["age"].mean()) # 乘客年龄
titanic_data["fare"] = titanic_data["fare"].fillna(titanic_data["fare"].mean()) # 乘客票价## 去除与是否获取无关的数据列
titanic_data = titanic_data.drop(['name','ticket','cabin','boat','body','home.dest','sex','embarked','pclass'], axis=1)
print(titanic_data.columns )### 1.3 分离样本和标签并制作数据集
# 分离样本
labels = titanic_data["survived"].to_numpy()titanic_data = titanic_data.drop(['survived'],axis=1)
data = titanic_data.to_numpy()# 样本属性名称
feature_names = list(titanic_data.columns)# 将样本分为训练和测试两部分
np.random.seed(10) # 设置随机种子,保证每次运行所分的样本一致# set() 函数创建一个无序不重复元素集,x-y返回一个新的集合,包括在集合x中但不在集合y中的元素
# random.choice(a=5, size=3, replace=False, p=None) 参数意思分别 是从a中以概率P随机选择3个, p没有指定的时候相当于是一致的分布
# 按照行号提取
train_indices = np.random.choice(len(labels),int(0.7 * len(labels)),replace = False)
print('train_indices++++',train_indices)
test_indices = list(set(range(len(labels))) - set(train_indices)) #将剩余部分设为测试集
print('train_indices++++',train_indices)# data[:]相当于重新拷贝一个列表,列表是可变对象如果直接引用传参给函数,则会导致修改其中任意一个变量,其余变量相应改变。但是,通过这种方式可以避免这种情况。
train_features = data[train_indices]
train_labels = labels[train_indices]test_features = data[test_indices]
test_labels = labels[test_indices]
print('测试样本数量',len(test_labels)) # 测试样本数量 393###定义Mish激活函数与多层全连接网络
# 定一个带有3层全连接网络的类,每个网络层使用Mish作为激活函数,该模型使用交叉熵损失函数
class Mish(nn.Module):def __init__(self):super().__init__()def forward(self,x):x = x * (torch.tanh(F.softplus(x)))return xtorch.manual_seed(0) # 设置随机种子函数class ThreeLinearModel(nn.Module):def __init__(self):super().__init__()self.linear1 = nn.Linear(12,12)self.mish1 = Mish()self.linear2 = nn.Linear(12,8)self.mish2 = Mish()self.linear3 = nn.Linear(8,2)self.softmax = nn.Softmax(dim = 1)self.criterion = nn.CrossEntropyLoss() #定义交叉熵def forward(self,x): # 定义一个全连接网络lin1_out = self.linear1(x)out_1 = self.mish1(lin1_out)out_2 = self.mish2(self.linear2(out_1))return self.softmax(self.linear3(out_2))def getloss(self,x,y): # 实现类的损失值计算接口y_pred = self.forward(x)loss = self.criterion(y_pred,y)return loss### 训练模型并输出结果
if __name__ == '__main__':net = ThreeLinearModel()num_epochs = 200optimizer = torch.optim.Adam(net.parameters(),lr = 0.04)# 将输入的样本标签转化为标量input_tensor = torch.from_numpy(train_features).type(torch.FloatTensor)label_tensor = torch.from_numpy(train_labels)losses = [] # 定义损失值列表for epoch in range(num_epochs):loss = net.getloss(input_tensor, label_tensor)losses.append(loss.item())optimizer.zero_grad()  # 清空之前的梯度loss.backward()  # 反向传播损失值optimizer.step()  # 更新参数if epoch % 20 == 0:print('Epoch {}/{} => Loss: {:.2f}'.format(epoch + 1, num_epochs, loss.item()))os.makedirs('models', exist_ok=True)torch.save(net.state_dict(), 'models/titanic_model.pt')plot_losses(losses)# 输出训练结果# tensor.detach():从计算图中脱离出来,返回一个新的tensor,新的tensor和原tensor共享数据内存,(这也就意味着修改一个tensor的值,另外一个也会改变),#                  但是不涉及梯度计算。在从tensor转换成为numpy的时候,如果转换前面的tensor在计算图里面(requires_grad = True),那么这个时候只能先进行detach操作才能转换成为numpyout_probs = net(input_tensor).detach().numpy()out_classes = np.argmax(out_probs, axis=1)print("Train Accuracy:", sum(out_classes == train_labels) / len(train_labels))# 测试模型test_input_tensor = torch.from_numpy(test_features).type(torch.FloatTensor)out_probs = net(test_input_tensor).detach().numpy()out_classes = np.argmax(out_probs, axis=1)print("Test Accuracy:", sum(out_classes == test_labels) / len(test_labels))

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

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

相关文章

基于sanic的服务使用celery完成动态修改定时任务

首先声明一下 考虑到celery目前和asyncio的不兼容性&#xff0c;协程任务需要转换为非异步的普通方法才能被当做task加入定时&#xff0c;并且celery和asyncio使用可能会带来预想不到的问题&#xff0c;在celery官方第二次承诺的6.0版本融合asyncio之前&#xff0c;需要慎重考虑…

Pyscript,使用Python编写前端脚本

介绍 Anaconda的CEO Peter Wang在前两个月的时候发布了Pyscript&#xff0c;实现了在HTML支持Python的使用&#xff0c;整个引用过程甚至不需要安装任何环境&#xff0c;只需要使用link和script标签即可引用实现Python在HTML中运行的功能&#xff0c;在HTML中也可以运行和使用…

如何把应用程序app编译进android系统

转载&#xff1a;http://ywxiao66.blog.163.com/blog/static/175482055201152710441106/------------------------------------------------------------------把常用的应用程序编译到img文件中&#xff0c;就成了系统的一部分&#xff0c;用户不必自己安装&#xff0c;当然也卸…

【Pytorch神经网络实战案例】08 识别黑白图中的服装图案(Fashion-MNIST)

1 Fashion-MNIST简介 FashionMNIST 是一个替代 MNIST 手写数字集 的图像数据集。 它是由 Zalando&#xff08;一家德国的时尚科技公司&#xff09;旗下的研究部门提供。其涵盖了来自 10 种类别的共 7 万个不同商品的正面图片。 FashionMNIST 的大小、格式和训练集/测试集划分与…

PHP list的赋值

List右边的赋值对象是一个以数值为索引的数组&#xff0c;左边的变量的位置和赋值对象的键值一一对应&#xff0c;有些位置的变量可以省略不写。非末尾的被赋值变量省略时&#xff0c;分隔的逗号不能省略。左边变量被赋值的顺序是从右到左的。 1 list($a, ,$b,$c[],$c[]) [1,2…

Pyscript,创建一个能执行crud操作的网页应用

目录 实现一个添加邀请客人名单的功能 循序渐进&#xff0c;逐步实现&#xff1a; 输入客人名称&#xff0c;按下enter键添加客人名单点击客人名单在名单上添加或者取消添加删除线&#xff0c;表示已经检查客人到场或未到场 checkbox&#xff0c;点击客人名单或者点击checkb…

爬虫实战学习笔记_1 爬虫基础+HTTP原理

1 爬虫简介 网络爬虫&#xff08;又被称作网络蜘蛛、网络机器人&#xff0c;在某些社区中也经常被称为网页追逐者)可以按照指定的规则&#xff08;网络爬虫的算法&#xff09;自动浏览或抓取网络中的信息。 1.1 Web网页存在方式 表层网页指的是不需要提交表单&#xff0c;使…

爬虫实战学习笔记_2 网络请求urllib模块+设置请求头+Cookie+模拟登陆

1 urllib模块 1.1 urllib模块简介 Python3中将urib与urllib2模块的功能组合&#xff0c;并且命名为urllib。Python3中的urllib模块中包含多个功能的子模块&#xff0c;具体内容如下。 urllib.request&#xff1a;用于实现基本HTTP请求的模块。urlb.error&#xff1a;异常处理…

java----IO和NIO的区别

概念&#xff1a;NIO即New IO&#xff0c;这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的&#xff0c;但实现方式不同&#xff0c;NIO主要用到的是块&#xff0c;所以NIO的效率要比IO高很多。在Java API中提供了两套NIO&#xff0c;一套是针对标准输入输出NIO&#xf…

【Pytorch神经网络理论篇】 11 卷积网络模型+Sobel算子原理

同学你好&#xff01;本文章于2021年末编写&#xff0c;已与实际存在较大的偏差&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)…

DataFrame高效处理行列数据/倒三角型数据/处理阶梯型数据/根据列的值确定行的值

锲子 在使用pandas处理数据时&#xff0c;遇到了一种要按照留存天数来处理的数据&#xff0c;当列所对应的日期超过了最晚的“今天”那么数据就要置为0&#xff0c;举个例子&#xff1a; 在这个DataFrame中&#xff0c;需要将超过了今天2022-10-30的数据置为“-”&#xff0c…

Sanic服务启动失败,报错Cannot finalize with no routes defined

Sanic服务启动失败&#xff0c;记录解决方法 问题描述 Sanic服务启动失败&#xff0c;同样的代码和python版本在之前的win10系统上运行的好好的&#xff0c;换了台win11的机器就跑不起来了&#xff0c;不知道是系统原因还是因为换了执行pycharm等其他原因 在尝试启动时总是会…

【Pytorch神经网络理论篇】 12 卷积神经网络实现+卷积计算的图解

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

【Pytorch神经网络实战案例】09 使用卷积提取图片的轮廓信息(手动模拟Sobel算子)

1 载入图片并显示 import matplotlib.pyplot as plt import matplotlib.image as mpimg import torch import torchvision.transforms as transforms import os os.environ["KMP_DUPLICATE_LIB_OK"]"TRUE" ### 1 载入图片并显示 myimg mpimg.imread(img.…

【Pytorch神经网络理论篇】 13 深层卷积神经网络介绍+池化操作+深层卷积神经网络实战

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

【Pytorch神经网络实战案例】10 搭建深度卷积神经网络

识别黑白图中的服装图案(Fashion-MNIST)https://blog.csdn.net/qq_39237205/article/details/123379997基于上述代码修改模型的组成 1 修改myConNet模型 1.1.1 修改阐述 将模型中的两个全连接层&#xff0c;变为全局平均池化层。 1.1.2 修改结果 ### 1.5 定义模型类 class m…

【Pytorch神经网络理论篇】 14 过拟合问题的优化技巧(一):基本概念+正则化+数据增大

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…

MTK 8127平台使用busybox

一、什么是BusyBox &#xff1f; BusyBox 是标准 Linux 工具的一个单个可执行实现。BusyBox 包含了一些简单的工具&#xff0c;例如 cat 和 echo&#xff0c;还包含了一些更大、更复杂的工具&#xff0c;例如 grep、find、mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具…

【Pytorch神经网络理论篇】 15 过拟合问题的优化技巧(二):Dropout()方法

同学你好&#xff01;本文章于2021年末编写&#xff0c;获得广泛的好评&#xff01; 故在2022年末对本系列进行填充与更新&#xff0c;欢迎大家订阅最新的专栏&#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现&#xff0c; Pytorch深度学习理论篇(2023版)目录地址…