1.1准备数据

本项目使用的数据可在作者公众号‘算法美食屋 ’获取

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
from torch import nn
from torch.utils.data import Dataset,DataLoader,TensorDatasetdftrain_raw = pd.read_csv('./eat_pytorch_in_20_days-master/eat_pytorch_datasets/titanic/train.csv')
dftest_raw = pd.read_csv('./eat_pytorch_in_20_days-master/eat_pytorch_datasets/titanic/test.csv')
dftrain_raw.head(10)


字段说明:
Survived:0代表死亡,1代表存活【y标签】
Pclass:乘客所持票类,有三种值(1,2,3) 【转换成onehot编码】
Name:乘客姓名 【舍去】
Sex:乘客性别 【转换成bool特征】
Age:乘客年龄(有缺失) 【数值特征,添加“年龄是否缺失”作为辅助特征】
SibSp:乘客兄弟姐妹/配偶的个数(整数值) 【数值特征】
Parch:乘客父母/孩子的个数(整数值)【数值特征】
Ticket:票号(字符串)【舍去】
Fare:乘客所持票的价格(浮点数,0-500不等) 【数值特征】
Cabin:乘客所在船舱(有缺失) 【添加“所在船舱是否缺失”作为辅助特征】
Embarked:乘客登船港口:S、C、Q(有缺失)【转换成onehot编码,四维度 S,C,Q,nan】

1.2.数据预处理

def preprocessing(dfdata):dfresult= pd.DataFrame()#PclassdfPclass = pd.get_dummies(dfdata['Pclass'])dfPclass.columns = ['Pclass_' +str(x) for x in dfPclass.columns ]dfresult = pd.concat([dfresult,dfPclass],axis = 1)#SexdfSex = pd.get_dummies(dfdata['Sex'])dfresult = pd.concat([dfresult,dfSex],axis = 1)#Agedfresult['Age'] = dfdata['Age'].fillna(0)dfresult['Age_null'] = pd.isna(dfdata['Age']).astype('int32')#SibSp,Parch,Faredfresult['SibSp'] = dfdata['SibSp']dfresult['Parch'] = dfdata['Parch']dfresult['Fare'] = dfdata['Fare']#Carbindfresult['Cabin_null'] =  pd.isna(dfdata['Cabin']).astype('int32')#EmbarkeddfEmbarked = pd.get_dummies(dfdata['Embarked'],dummy_na=True)dfEmbarked.columns = ['Embarked_' + str(x) for x in dfEmbarked.columns]dfresult = pd.concat([dfresult,dfEmbarked],axis = 1)return(dfresult)x_train = preprocessing(dftrain_raw).values
y_train = dftrain_raw[['Survived']].valuesx_test = preprocessing(dftest_raw).values
y_test = dftest_raw[['Survived']].valuesprint("x_train.shape =", x_train.shape )
print("x_test.shape =", x_test.shape )print("y_train.shape =", y_train.shape )
print("y_test.shape =", y_test.shape )

1.3.使用DataLoader和TensorDataset封装成可以迭代的数据管道

dl_train = DataLoader(TensorDataset(torch.tensor(x_train).float(),torch.tensor(y_train).float()),shuffle = True, batch_size = 8)
dl_val = DataLoader(TensorDataset(torch.tensor(x_test).float(),torch.tensor(y_test).float()),shuffle = False, batch_size = 8)

2.定义模型

此处选择使用最简单的nn.Sequential,按层顺序模型

def create_net():net = nn.Sequential()net.add_module("linear1",nn.Linear(15,20))net.add_module("relu1",nn.ReLU())net.add_module("linear2",nn.Linear(20,15))net.add_module("relu2",nn.ReLU())net.add_module("linear3",nn.Linear(15,1))return netnet = create_net()
print(net)

3.训练模型

Pytorch通常需要用户编写自定义训练循环,训练循环的代码风格因人而异。

有3类典型的训练循环代码风格:脚本形式训练循环,函数形式训练循环,类形式训练循环。

此处介绍一种较通用的仿照Keras风格的脚本形式的训练循环。

该脚本形式的训练代码与 torchkeras 库的核心代码基本一致。

torchkeras详情: https://github.com/lyhue1991/torchkeras

import os,sys,time
import numpy as np
import pandas as pd
import datetime
from tqdm import tqdm import torch
from torch import nn
from copy import deepcopy
from torchkeras.metrics import Accuracydef printlog(info):nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')print("\n"+"=========="*8 + "%s"%nowtime)print(str(info)+"\n")loss_fn = nn.BCEWithLogitsLoss()
optimizer= torch.optim.Adam(net.parameters(),lr = 0.01)
metrics_dict = {"acc":Accuracy()}epochs = 20
ckpt_path='checkpoint.pt'#early_stopping相关设置
monitor="val_acc"
patience=5
mode="max"history = {}for epoch in range(1, epochs+1):printlog("Epoch {0} / {1}".format(epoch, epochs))# 1,train -------------------------------------------------  net.train()total_loss,step = 0,0loop = tqdm(enumerate(dl_train), total =len(dl_train))train_metrics_dict = deepcopy(metrics_dict) for i, batch in loop: features,labels = batch#forwardpreds = net(features)loss = loss_fn(preds,labels)#backwardloss.backward()optimizer.step()optimizer.zero_grad()#metricsstep_metrics = {"train_"+name:metric_fn(preds, labels).item() for name,metric_fn in train_metrics_dict.items()}step_log = dict({"train_loss":loss.item()},**step_metrics)total_loss += loss.item()step+=1if i!=len(dl_train)-1:loop.set_postfix(**step_log)else:epoch_loss = total_loss/stepepoch_metrics = {"train_"+name:metric_fn.compute().item() for name,metric_fn in train_metrics_dict.items()}epoch_log = dict({"train_loss":epoch_loss},**epoch_metrics)loop.set_postfix(**epoch_log)for name,metric_fn in train_metrics_dict.items():metric_fn.reset()for name, metric in epoch_log.items():history[name] = history.get(name, []) + [metric]# 2,validate -------------------------------------------------net.eval()total_loss,step = 0,0loop = tqdm(enumerate(dl_val), total =len(dl_val))val_metrics_dict = deepcopy(metrics_dict) with torch.no_grad():for i, batch in loop: features,labels = batch#forwardpreds = net(features)loss = loss_fn(preds,labels)#metricsstep_metrics = {"val_"+name:metric_fn(preds, labels).item() for name,metric_fn in val_metrics_dict.items()}step_log = dict({"val_loss":loss.item()},**step_metrics)total_loss += loss.item()step+=1if i!=len(dl_val)-1:loop.set_postfix(**step_log)else:epoch_loss = (total_loss/step)epoch_metrics = {"val_"+name:metric_fn.compute().item() for name,metric_fn in val_metrics_dict.items()}epoch_log = dict({"val_loss":epoch_loss},**epoch_metrics)loop.set_postfix(**epoch_log)for name,metric_fn in val_metrics_dict.items():metric_fn.reset()epoch_log["epoch"] = epoch           for name, metric in epoch_log.items():history[name] = history.get(name, []) + [metric]# 3,early-stopping -------------------------------------------------arr_scores = history[monitor]best_score_idx = np.argmax(arr_scores) if mode=="max" else np.argmin(arr_scores)if best_score_idx==len(arr_scores)-1:torch.save(net.state_dict(),ckpt_path)print("<<<<<< reach best {0} : {1} >>>>>>".format(monitor,arr_scores[best_score_idx]),file=sys.stderr)if len(arr_scores)-best_score_idx>patience:print("<<<<<< {} without improvement in {} epoch, early stopping >>>>>>".format(monitor,patience),file=sys.stderr)break net.load_state_dict(torch.load(ckpt_path))dfhistory = pd.DataFrame(history)

【学习笔记—eat_pytorch_in_20_days】结构化数据建模流程范例相关推荐

  1. titanic数据集_TF2.0结构化数据建模流程范例

    尽管TensorFlow设计上足够灵活,可以用于进行各种复杂的数值计算.但通常人们使用TensorFlow来实现机器学习模型,尤其常用于实现神经网络模型. 从原理上说可以使用张量构建计算图来定义神经网 ...

  2. 1-1 结构化数据建模流程范例

    一.准备数据 titanic数据集(下载链接:https://www.kaggle.com/c/titanic/data)的目标是根据乘客信息预测他们在Titanic号撞击冰山沉没后能否生存. 结构化 ...

  3. 新手入门深度学习 | 2-2:结构化数据建模流程示例

    文章目录 一.准备数据 二.定义模型 三.训练模型 四.评估模型 五.使用模型 六.保存模型 1. 保存整个模型 2. 保存模型权重

  4. 【TF2基础教程1】结构化数据建模流程

    note 文章目录 note 一.数据处理 1.1 tf.data 1.2 tf.keras: 1.3 tf.distribute: 二.tf2结构化数据建模流程 一,准备数据 二,定义模型 三,训练 ...

  5. 《30天吃掉那只 TensorFlow2.0》 1-4 时间序列数据建模流程范例 (国内新冠疫情结束时间预测问题)

    1-4 时间序列数据建模流程范例 (国内新冠疫情结束时间预测问题) 文章目录 1-4 时间序列数据建模流程范例 (国内新冠疫情结束时间预测问题) 一,准备数据 二,定义模型 三,训练模型 四,评估模型 ...

  6. 结构化数据建模——titanic数据集的模型建立和训练(Pytorch版)

    本文参考<20天吃透Pytorch>来实现titanic数据集的模型建立和训练 在书中理论的同时加入自己的理解. 一,准备数据 数据加载 titanic数据集的目标是根据乘客信息预测他们在 ...

  7. SQL学习笔记三——结构化查询语言

    数据库系统-结构化查询语言 SQL数据定义 SQL基本数据类型 数值型 INT/INTEGER:整数,取值范围取决于DBMS实现 SMALLINT:整数,取值范围比INT小 BIGINT:整数,取值范 ...

  8. 《自然语言处理实战入门》 深度学习组件TensorFlow2.0 ---- 文本数据建模流程

    文章大纲 一,准备数据 二,定义模型 三,训练模型 四,评估模型 五,使用模型 六,保存模型 参考文献 文本处理的建模流程,使用清华发布的新闻分类数据集: 中文文本分类数据集THUCNews THUC ...

  9. 【Elasticsearch 权威指南学习笔记】结构化搜索

    结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作.比较常见的操作包括比较数字 ...

  10. windows核心编程学习笔记(八)结构化异常处理(Structured Exception Handling)

    首先要要知道,结构化异常处理(SEH)和C++提供的异常处理不相同. 一.Termination HandlersTermination Handlers使用很简单.在想使用SEH处理的地方使用 __ ...

最新文章

  1. 解决PhpStorm卡顿的问题
  2. 查看端口被哪个进程占用
  3. 实时计算 Flink性能调优
  4. NumPy 百题大冲关,冲鸭!
  5. 20幅扎心漫画,道尽无数人的人生!30万网友:这简直是在偷窥我生活...
  6. QT每日一练day25:触发绘画事件
  7. POJ3278 HDU2717 Catch That Cow【BFS】
  8. Java基础复习---线程创建
  9. 视频教程- Docker入门与进阶实战(上)-Docker/K8S
  10. LPC1788系统时钟的设置
  11. 163邮箱如何注册呢?
  12. 重积分 | 高斯公式使用的四种情况
  13. matlab根据火焰RGB值求温度程序,基于MATLAB的炉膛火焰图像温度测量
  14. CTF中遇到不知道文件类型_在营销界碰到网易,你永远不知道会遇到什么惊喜……...
  15. redhat升级linux内核,redhat内核升级方法
  16. 突破单IP频繁反爬虫限制的小技巧
  17. Ubuntu安装过程中出现“没有定义根文件系统”,Ubuntu安装过程中无法读取Windows分区
  18. php 单词拼写检查,拼写检查 · phpstorm手册 · 看云
  19. linux文件系统实现原理简述【转】
  20. P2455雾雨魔理沙

热门文章

  1. 类案检索功能优化建议(一)——开发路径辨析
  2. 什么软件能测试电脑能不能玩lol,怎么测试自己电脑能不能玩英雄联盟
  3. 鸿蒙大陆9.1正式版礼包,鸿蒙大陆2.0正式版
  4. 华为S6720系列万兆交换机光模块解决方案
  5. 一位企业家的成功之道
  6. 纯js前端导出Excel表格(Excel科学计数法问题)
  7. 前端页面--瀑布流布局的实现
  8. 线性表之单链表史上无敌傻瓜教程无敌无敌细节
  9. matlab 求特征值的命令,matlab怎么求特征值
  10. 异数OS 织梦师-纤手(二)-- LPC RPC篇