用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运行代码,那么先上传数据集。点击左侧面板上的文件夹图标。
然后点击上传图标。
进入数据集所在的目录,在你的本地计算机上,并选择它。点击打开,将数据集上传到Colab。
让我们加载我们的数据集并显示前五条记录。
dataset = pd.read_csv('/content/Churn_Modelling.csv')
dataset.head()
数据预处理
在我们的数据集中,并非所有的特征都是有用的。我们不需要行号、客户ID和客户名称。这些特征将不能帮助我们预测客户是否会流失。因此,我们可以把它们去掉。我们使用下面的代码来分离特征和标签。
X = dataset.iloc[:, 3:-1].values
y = dataset.iloc[:, -1].values
print(X)
print(y)
下面是分离后得到的特征和标签。
你注意到,在我们的数据集中有一些分类的变量。它们在地理和性别两栏中。我们必须对这些变量进行编码。由于在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)
这就是标签编码后得到的结果。
# 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)
这是单次编码后得到的结果。
接下来,使用下面的代码,我们将数据集分成训练集和测试集。
# 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)
这些是特征缩放后得到的结果。
现在已经完成了,让我们来建立和可视化我们的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,
)
输出
我们还可以使用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)
评估模型
现在,我们的模型训练已经完成,我们可以对单个客户进行预测。让我们找出一个有以下细节的客户是否会流失。
| 记录 | 详细情况 |
|---|---|
| 国家 | 西班牙 |
| 信用评分 | 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'])
看起来我们的模型得到了大部分的预测结果。但是,对于测试集中的第二个客户,它犯了一个错误。我们可以检查准确率得分,并建立一个混淆矩阵。
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%的准确率。现在你可以制作一个人工神经网络,并在任何数据集上进行训练。没有明确的架构可以使用。你可以研究不同的架构。目标是看哪一个能给你一个更好的结果。你可以从使用深度学习研究论文中的架构开始。