本文正在参加「金石计划 . 分割6万现金大奖」

前语

本文运用 cpu 版别的 tensorflow-2.1 完成对 heart 数据的分类猜测。

本文纲要

  1. 获取并处理 Heart 数据
  2. 运用 Dataset 制造输入数据并进行模型练习
  3. 运用字典制造输入数据并进行模型练习

实现过程

1. 获取并处理 Heart 数据

(1)本文运用的数据集是由克利夫兰诊所心脏病基金会供给的一份小型数据集,里面仅有 303 行数据,每行数据都表明一个患者的各项目标情况,本文的任务就是搭建一个小型的深度学习模型,猜测每位患者是否会得心脏病,这是一个二分类问题。

(2)本文的数据在 tensorflow 中已经处理好,咱们直接运用内置函数从网络上下载到本地磁盘即可。

(3)为了方便数据的处理咱们将一切的列的内容都处理成数值,其中 df[‘thal’] 中有不同的字符串,咱们将其各个字符串转化成对应的离散值进行表明。

import pandas as pd
import tensorflow as tf
csv_file = tf.keras.utils.get_file('heart.csv', 'https://storage.googleapis.com/download.tensorflow.org/data/heart.csv')
df = pd.read_csv(csv_file)
df['thal'] = pd.Categorical(df['thal'])
df['thal'] = df.thal.cat.codes

(4)df[‘target’] 这一列主要是每行数据的标签,所以咱们将这一列独自提取出来。

labels = df.pop('target')
df.head(3)

数据前三行展现如下:

index age	sex	cp	trestbps	chol	fbs	restecg	thalach	exang	oldpeak	slope	ca	thal
0	63	1	1	145	233	1	2	150	0	2.3	3	0	2
1	67	1	4	160	286	0	2	108	1	1.5	2	3	3
2	67	1	4	120	229	0	2	129	1	2.6	2	2	4

2. 运用 Dataset 制造输入数据并进行模型练习

(1)第一层是一个输出 32 个维度向量的全衔接层,并运用了 relu 激活函数进行非线性改变。

(2)第二层是一个输出 32 个维度向量的全衔接层,并运用了 relu 激活函数进行非线性改变。

(3)第三层是一个输出 1 个维度向量的全衔接层,并运用了 sigmoid 激活函数进行非线性改变,这儿其实就是输出层,输出 0 或许 1 。

(4) 模型的优化器挑选 adam,模型的丢失值挑选 binary_crossentropy,模型的评价目标挑选 accuracy 。

(5)咱们将数据和标签做成练习数据,每个 batch 设置为 16 ,运用练习数据将模型练习 20 个 epoch 。

def get_model():
    model = tf.keras.Sequential([
        tf.keras.layers.Dense(32, activation='relu'),
        tf.keras.layers.Dense(32, activation='relu'),
        tf.keras.layers.Dense(1, activation='sigmoid') ])
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    return model
model = get_model()
train_datas = tf.data.Dataset.from_tensor_slices((df.values, labels.values))
train_datas = train_datas.shuffle(len(df)).batch(16)
model.fit(train_datas, epochs=20)

成果如下所示:

Epoch 1/20
19/19 [==============================] - 0s 15ms/step - loss: 2.4584 - accuracy: 0.5446
Epoch 2/20
19/19 [==============================] - 0s 2ms/step - loss: 0.8050 - accuracy: 0.6766
...
Epoch 19/20
19/19 [==============================] - 0s 1ms/step - loss: 0.4237 - accuracy: 0.7921
Epoch 20/20
19/19 [==============================] - 0s 1ms/step - loss: 0.4523 - accuracy: 0.7789

3. 运用字典制造输入数据并进行模型练习

(1)上面的方法是将每一行样本数据传入模型进行练习的,咱们还能够将字典作为输入传入到模型中进行练习。

(2)先创建了一个字典输入 inputs ,每列列名对应着一个张量。

(3)然后将输入转化为一个大小为 [None, 13] 的张量,其实就是将数据从列形式转化成了行形式,便于后面在模型练习时分的数据运用。

(4)然后将 inputs 传入到一个中间层,它是一个能够输出一个 10 维向量的全衔接层,激活函数为 relu 。

(5)最后是一个能够输出一个 1 维向量的全衔接层,激活函数为 sigmoid ,输出的就是该患者是否患心脏病的猜测标签。

(6)模型的优化器挑选为 adam ,丢失函数为 binary_crossentropy ,评价目标为 accuracy 。

(7)最后将 df 数据转化成了字典作为练习数据,labels 作为练习标签进行模型的练习即可,总共练习 20 个 epoch ,每个 batch 的大小设置为 16 。

inputs = {key: tf.keras.layers.Input(shape=(), name=key) for key in df.keys()}
mid_layer = tf.stack(list(inputs.values()), axis=-1)
mid_layer = tf.keras.layers.Dense(20, activation='relu')(mid_layer)
outputs = tf.keras.layers.Dense(1, activation='sigmoid')(mid_layer)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
train_datas = tf.data.Dataset.from_tensor_slices((df.to_dict('list'), labels.values)).batch(16)
model.fit(train_datas, epochs=20)

成果如下所示:

Epoch 1/20
19/19 [==============================] - 0s 12ms/step - loss: 43.7227 - accuracy: 0.2739
Epoch 2/20
19/19 [==============================] - 0s 2ms/step - loss: 20.6211 - accuracy: 0.2739
...
Epoch 19/20
19/19 [==============================] - 0s 2ms/step - loss: 0.6439 - accuracy: 0.7261
Epoch 20/20
19/19 [==============================] - 0s 2ms/step - loss: 0.6234 - accuracy: 0.7294