欢迎关注 “小白玩转Python”,发现更多 “有趣”

1. 数据集

检测乳腺癌一般有30项特征,加载数据集来了解一下这些特征变量:

数据的尺寸

变量及其类型

在检查重复数据和空数据并确认数据集不受此限制之后,是时候检查不必要的数据了。从数据集的33列中,id 和 Unnamed:32 被删除了:

df.drop(['id','Unnamed: 32'],axis=1,inplace=True)

完成第一部分,用 .describe() 函数来了解统计学:

2. 可视化

检查良恶性肿瘤的数量:

有357例良性肿瘤诊断和212例恶性肿瘤诊断,这似乎是一个相当平衡的数据集。

现在可视化其他变量的分布:

每个变量的分布

变量之间的相关性

从上面的数据情况我们可以得到以下的结论:

  • 这是一个相当复杂的模型,能够可视化的相关性

  • 肿瘤平均半径为14.12,最小为6.98,最大为28.11

  • 维度相关的变量是正相关的(例如 area_se 和 perimeter_se)

  • 数据集中62.7% 的肿瘤是良性的,37.3% 是恶性的

3. 为机器学习准备数据

更换标签

我们想要预测的数值在“diagnosis”一栏中ーー这些是标签。我们想预测一个肿瘤是恶性的(M)还是良性的(B)。数据框架中的所有其他列都是模型的预测变量:

标签由字母 M(恶性)和 B(良性)表示。第一步是将这些信息转换成数值型的数据,良性的数据为0,恶性的数据为1:

lab ={'B':0,'M':1}
df = df.replace({'diagnosis':lab})
df.head()

现在,数据可以分为两个部分:

预测变量:我们将提供的数据作为模型的输入,以作出预测

predictors = df.iloc[:, 2:31]
predictors

标签:我们要预测的信息,即根据预测数据集中的信息,预测该肿瘤是恶性的还是良性的

labels = df.iloc[:, 0:1]
labels

转换为张量,并将数据分割为训练和测试子集

使用 scikit learn 库,使用20% 的比例将数据集分成训练和测试数据:

predictors_train, predictors_test, labels_train, labels_test = train_test_split(predictors,labels,test_size = 0.20)

到目前为止,这些数据都存储在 pandas 的数据帧中。由于我们将使用张量流来实现深度学习模型,因此必须将数据转换为张量。首先,将 pandas 数据帧转换为数组:

type(np.array(predictors_train))

Out[20]:

type(np.array(labels_train))

Out[21]:

numpy.ndarray

该模型将使用 PyTorch 实现,因此下一步是将该数组转换为一个 torch 元素:

predictors_train = torch.tensor(np.array(predictors_train), dtype=torch.float)labels_train = torch.tensor(np.array(labels_train), dtype = torch.float)df_tf = torch.utils.data.TensorDataset(predictors_train, labels_train)
type(df_tf)

Pytorch 对模型进行了小批量的训练。有一个名为 DataLoader 的类用于在数据集上执行迭代。批量大小参数给出了在调整模型权重时考虑的样本数:

train_loader = torch.utils.data.DataLoader(df_tf, batch_size=15, shuffle=True)

4. 模型的实现与评估

在本项目中,将实现一个具有两个隐藏层的神经网络。要实现这个模型,我们需要:

  • 定义模型的结构(定义层数,神经元,激活函数)

  • 选择一个训练策略

  • 选择一个优化器

由于问题的复杂性和未知性,这种类型的实现被建模为一个最佳化问题。因此,选择一个优化器是整个过程的一部分。

在最佳化问题中,我们有目标函数(称为成本函数或损失函数)。这就是我们要优化的函数。在神经网络的目标是最小化的误差,因此最小化的损失(或成本)函数。

构建模型

神经网络模型的定义如下:

classifier = nn.Sequential(nn.Linear(in_features=29, out_features=15),nn.ReLU(),nn.Linear(15, 15),nn.ReLU(),nn.Linear(15, 1),nn.Sigmoid()
)
  • Input features = 29(我们在预测数据集中有29个特性)

  • 2个隐藏层,每层有15个神经元

  • 输出层有一个神经元,输出标记0(良性肿瘤)和1(恶性肿瘤)

  • ReLu:内部层的非线性激活函数

  • Sigmoid:输出层的非线性激活函数,返回的概率介于0和1之间

ReLu 是一种非线性激活函数,它的优点是不会同时激活所有的神经元。ReLu 被选中做第一次尝试,以建立更有效的计算成本方面的模型。

据报道,Sigmoid 在分类问题上效果很好。因为我们有一个输出层分类肿瘤良性或恶性,Sigmoid 被选为激活函数。

训练策略

现在,我们必须选择神经网络的训练策略。由于这是一个二元分类任务,选择二元交叉熵准则是:

criterion = nn.BCELoss()

优化器

第三步,也是最后一步:选择优化器。Adam 优化算法是深度学习问题中一种非常流行的选择算法。这是随机梯度下降算法的扩展,但与 SGD 算法不同,Adam 优化器在训练期间并不保持相同的学习速率。

optimizer = torch.optim.Adam(classifier.parameters(), lr=0.001, weight_decay=0.0001)

训练模型

更新后的权重将运行100次,如下面的 for 循环所示:

for epoch in range(100):#To store the error:run_loss = 0.for data in train_loader:inputs, labels = dataoptimizer.zero_grad()outputs = classifier(inputs)     error = criterion(outputs, labels)error.backward()optimizer.step() run_loss += error.item()print('Epoch %3d: loss %.5f' % (epoch+1, run_loss/len(train_loader)))
  • 训练数据加载器将训练数据分批加载(这个模型选择的批量大小是15个样本)

  • zero_grad() 在反向传播过程之前,将梯度设置为零

  • outputs 计算对模型的预测

  • error 计算出计算中的误差,并将预测结果与实际数据进行比较

  • error.backward() 是神经网络中的反向传播过程来更新权值

  • optimizer.step() 更新权重

评估模型

这个模型的准确率达到了94.73% ,在我们的混淆矩阵中可以看到这一点:

分类器总共做出了114个预测,从中可以看出:

  • 70例标本被正确估计为良性肿瘤

  • 38例标本正确诊断为恶性肿瘤

  • 有3个样本被估计为假阴性,这些应该被分类为恶性肿瘤,但被分类为良性

  • 3个样本被估计为假阳性

·  END  ·

HAPPY LIFE

Pytorch 实践 —— 乳腺癌预测相关推荐

  1. 深度学习 神经网络(5)逻辑回归二分类-Pytorch实现乳腺癌预测

    深度学习 神经网络 逻辑回归二分类-乳腺癌预测 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载并查看数据集 2.3 数据处理 2.4 数据分割 2.5 迭代训练 2.6 数据验证 一.前言 ...

  2. 深度学习实验1:pytorch实践与前馈神经网络

    深度学习实验1:pytorch实践与前馈神经网络 1.pytorch基本操作 1.使用

  3. Pytorch kaggle 房价预测实战

    Pytorch kaggle 房价预测实战 0. 环境介绍 环境使用 Kaggle 里免费建立的 Notebook 教程使用李沐老师的 动手学深度学习 网站和 视频讲解 小技巧:当遇到函数看不懂的时候 ...

  4. 机器学习之乳腺癌预测

    机器学习之乳腺癌预测 (一)问题分析 1.问题背景 2.问题分析 3.题目所需的代码及数据 (二).导入数据 1. 认识数据集 2.导入数据 3.数据概述 (三)EDA 数据探索性分析 1.描述性统计 ...

  5. 在Python中使用LSTM和PyTorch进行时间序列预测

    全文链接:http://tecdat.cn/?p=8145 顾名思义,时间序列数据是一种随时间变化的数据类型.例如,24小时内的温度,一个月内各种产品的价格,一年中特定公司的股票价格(点击文末&quo ...

  6. svm预测结果为同一个值_实战:用SVM算法进行乳腺癌预测

    支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类(binary classification)的广义 ...

  7. pytorch神经网络因素预测_实战:使用PyTorch构建神经网络进行房价预测

    微信公号:ilulaoshi / 个人网站:lulaoshi.info 本文将学习一下如何使用PyTorch创建一个前馈神经网络(或者叫做多层感知机,Multiple-Layer Perceptron ...

  8. 机器学习之sklearn-KNN近邻算法分类小案例(乳腺癌预测最优模型)

    (案例):用sklearn包实现knn分类小案例,通过交叉验证网格搜索获取最优参数模型,进行参数评估. 导包: from sklearn.datasets import load_breast_can ...

  9. 数据分析之乳腺癌预测

    零.定义问题 1.1 数据介绍 http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/bre ...

最新文章

  1. SuperEdge — Overview
  2. 《Swift 权威指南》——导读
  3. restful,RESTful API 设计,GET/PUT/DELETE/POST
  4. 什么是lamda表达式?
  5. awvs 13使用_如何解密AWVS?15行代码就够了!
  6. 打响汽车信息安全战,百度Apollo构建最高等级安全防护盾牌
  7. javafx 示例_示例介绍:JavaFX 8打印
  8. 【HDU - 5965】扫雷(dp)
  9. JAVA进阶教学之(Date日期的处理)
  10. Mybatis-Plus驼峰命名规则之Date类型字段返回值为null
  11. [转]网络编程学习指南
  12. python在win10怎么搭建_Win10下Python环境搭建与配置教程
  13. Oracle Instant Client环境配置
  14. 录屏状态监听之防录屏 - iOS
  15. JavaScript(第四天)—爱创课堂专业前端培训
  16. 云原生|容器和应用安全运营实践思考
  17. hangup_after_bridge
  18. Linux xargs 命令
  19. waymo数据集总结
  20. 基于MAXPLUS2的洗衣机控制电路

热门文章

  1. 使用GORM操作数据库
  2. 计算机应用基础课程整体设计说课视频,关于计算机应用基础课程说课设计.doc...
  3. Keil MDK终于免费了,并且没有代码大小限制~
  4. 活动 支付、退款相关的订单测试
  5. centos7的syslog知识点
  6. php上传图片到mysql并显示
  7. 【优化布局】matlab基于禁忌搜索算法求解基站选址问题代码
  8. 按钮默认点击事件(打开页面时按钮默认被点击)
  9. 五、数据CRUD操作
  10. 如何进行数据文件的传输(不简单)