如何用Keras构建一个人工神经网络

253 阅读6分钟

用Keras构建人工神经网络

在这篇文章中,你将学习如何用Keras构建和训练一个人工神经网络。我们将制作一个模型,告诉我们一个客户是否会流失。这在企业中可能非常有用。

如果你知道哪些客户会流失,你可以为这些客户提供更好的优惠。所以你可以留住他们。我们将使用机器学习来确定那些可能会流失的客户。我们有一个来自一家银行的样本数据集。我们将预测哪些客户会停止在这家银行的业务。这里是这个项目的GitHub[repo]。

前提条件

要跟上这个教程,你需要具备以下条件。

  • [人工神经网络]的基础知识。
  • [Google Colab]。
  • 从[Kaggle]下载Churn建模的数据集。

导入库

我们将使用的大多数库都已经预装在Google Colab上。因此,我们将它们导入我们的代码中。

import numpy as np
import pandas as pd
import tensorflow as tf

让我们确认我们正在使用的Tensorflow的版本。不需要导入Keras,因为它在Tensorflow 2的基础上运行。

print(tf.__version__)

输出

'2.5.0'

让我们加载我们的数据集。如果你是用谷歌Colab运行代码,那么先上传数据集。点击左侧面板上的文件夹图标。

click on folder icon

然后点击上传图标。

Upload_dataset

进入数据集所在的目录,在你的本地计算机上,并选择它。点击打开,将数据集上传到Colab。

Select dataset in local directory

Uploaded dataset

让我们加载我们的数据集并显示前五条记录。

dataset = pd.read_csv('/content/Churn_Modelling.csv')
dataset.head()

first 5 rows of dataset

数据预处理

在我们的数据集中,并非所有的特征都是有用的。我们不需要行号、客户ID和客户名称。这些特征将不能帮助我们预测客户是否会流失。因此,我们可以把它们去掉。我们使用下面的代码来分离特征和标签。

X = dataset.iloc[:, 3:-1].values
y = dataset.iloc[:, -1].values
print(X)
print(y)

下面是分离后得到的特征和标签。

features of dataset

dataset label

你注意到,在我们的数据集中有一些分类的变量。它们在地理和性别两栏中。我们必须对这些变量进行编码。由于在Gender 列中有两个独特的变量,我们对其进行标签编码。然后,我们对Geography 列进行一热编码。

一热编码在数据集中创建了新的列。创建的新列的数量取决于要进行一热编码的列中的唯一值的数量。这些新列取代了地理列。例如,1.0, 0.0, 0.0 代表一个来自France 的客户。

gender 列进行标签编码,用数字取代文本。0 代表Female ,而1 代表Male

# label encode the gender column
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
X[:, 2] = le.fit_transform(X[:, 2])
print(X)

这就是标签编码后得到的结果。

label encode the gender column

# one-encode the geography column
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [1])], remainder='passthrough')
X = np.array(ct.fit_transform(X))
print(X)

这是单次编码后得到的结果。

one hot encode the geography column

接下来,使用下面的代码,我们将数据集分成训练集和测试集。

# split the dataset into train and test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

最后,我们进行特征缩放。这在深度学习中是至关重要的,因为它有助于减少训练时间。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
print(X_train)

这些是特征缩放后得到的结果。

feature scaling

现在已经完成了,让我们来建立和可视化我们的ANN。

构建和可视化人工神经网络

我们用Sequential() 类建立我们的神经网络。我们首先创建有12个节点的输入层。12是我们训练集中的行数。然后我们添加隐藏层。

为了保持简单,我们使用两个隐藏层。最初的隐藏层有12个节点,而下一层有8个节点。在隐藏层中,我们使用[relu激活函数]。

最后,我们添加输出层。由于我们只有两个类别,我们在输出层使用一个节点。我们还在输出层使用[sigmoid激活函数]。它将给我们一个客户流失的概率。

# Initializing the ANN
ann = tf.keras.models.Sequential()
# Add the input layer and first hidden layer
ann.add(tf.keras.layers.Dense(units=12, activation='relu', input_shape=X_train[0].shape))
# Add the second hidden layer
ann.add(tf.keras.layers.Dense(units=8, activation='relu'))
# Add the output layer
ann.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))

现在我们已经创建了我们的模型,让我们使用下面的代码来可视化它。

from tensorflow.keras.utils import plot_model
plot_model(ann,
           to_file="model.png",
           show_shapes=True,
           show_layer_names=True,
          )

输出

Artificial Neural Network Plot

我们还可以使用NN-SVG工具来显示我们的模型。

ANN Visualization using NN-SVG

训练ANN

在训练ANN的过程中,我们执行了几项任务。

  • 我们用[Adam优化器]编译模型。
  • 我们使用二进制[交叉熵损失]。
  • 我们对模型进行100次的训练。
ann.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
ann.fit(X_train, y_train, batch_size = 32, epochs = 100)

Last 11 epoch of training

评估模型

现在,我们的模型训练已经完成,我们可以对单个客户进行预测。让我们找出一个有以下细节的客户是否会流失。

记录详细情况
国家西班牙
信用评分600
性别
年龄40岁
任职时间3年
余额$60000
拥有的产品数量2
拥有信用卡吗?
是一个活跃的会员?是的
估算薪资$50000
print(ann.predict(sc.transform([[0, 0, 1, 600, 1, 40, 3, 60000, 2, 1, 1, 50000]])))

输出

[[0.04270527]]

请记住,经过一次编码,0, 0, 1 代表地理位置,Spain 。它将出现在我们的特征矩阵的前三列。

我们可以添加一个0.5的阈值。如果预测的概率高于0.5,客户就会离开银行。在极端情况下,我们可以增加阈值。也就是说,如果我们希望我们的模型只在非常有信心的情况下预测True

print(ann.predict(sc.transform([[0, 0, 1, 600, 1, 40, 3, 60000, 2, 1, 1, 50000]])) > 0.5)

输出

[[False]]

这对银行来说是个好消息!这个客户将不会流失。让我们用测试集来评估我们的模型。

y_pred = ann.predict(X_test)
y_pred = (y_pred > 0.5)
pd.DataFrame(list(zip(y_test, y_pred)), columns=['Actual', 'Predicted'])

Actual Values vs Predicted Values

看起来我们的模型得到了大部分的预测结果。但是,对于测试集中的第二个客户,它犯了一个错误。我们可以检查准确率得分,并建立一个混淆矩阵。

from sklearn.metrics import confusion_matrix, accuracy_score
print(confusion_matrix(y_test, y_pred))
print(accuracy_score(y_test, y_pred))

输出

[[1506  89]
 [193  212]]
0.859

准确率为85.9%。在2000个案例中,我们的模型正确预测了1718个案例。混淆矩阵显示了真阳性、假阳性、假阴性和真阴性的数量。

我们的模型不恰当地预测了193个客户流失(假阳性),和89个客户没有流失(假阴性)。但它正确地预测了1506名客户流失(真阳性),212名客户没有流失(真阴性)。

总结

在本指南中,我们学习了如何使用Keras构建、可视化和训练一个ANN。我们做了一个模型,显示将离开银行的客户。

我们得到了85.9%的准确率。现在你可以制作一个人工神经网络,并在任何数据集上进行训练。没有明确的架构可以使用。你可以研究不同的架构。目标是看哪一个能给你一个更好的结果。你可以从使用深度学习研究论文中的架构开始。