使用 PyTorch 搭建 BP 神经网络进行客户流失预测
一、引言
在当今数字化时代,客户流失预测对于企业来说至关重要。通过提前预测哪些客户可能会流失,企业可以采取针对性的措施来挽留客户,从而降低客户流失率,提高业务收益。本文将介绍如何使用 PyTorch 搭建一个简单的反向传播(BP)神经网络,来对客户是否会流失进行预测,并展示模型的训练过程和最终评估结果。
二、数据准备
(1)数据加载
我们从 CSV 文件中加载训练数据和测试数据,分别使用pandas库的read_csv函数:
import pandas as pd
train_data = pd.read_csv('select-data.csv')
test_data = pd.read_csv('scalar-test.csv')
(2)特征与标签提取
从加载的数据中提取用于训练和预测的特征以及对应的标签。这里,我们选取了诸如信用评分(CreditScore)、性别(Gender)、年龄(Age)等一系列特征作为输入,而客户是否流失(Exited)作为输出标签:
X_train = train_data[['CreditScore', 'Gender', 'Age', 'Tenure', 'EB', 'NumOfProducts', 'HasCrCard',
'IsActiveMember', 'EstimatedSalary']].values
y_train = train_data['Exited'].values
X_test = test_data[['CreditScore', 'Gender', 'Age', 'Tenure', 'EB', 'NumOfProducts', 'HasCrCard',
'IsActiveMember', 'EstimatedSalary']].values
y_test = test_data['Exited'].values
(3)数据转换为张量
为了能在 PyTorch 中使用数据,需要将其转换为张量形式,同时根据数据类型设置合适的dtype:
import torch
X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)
X_test_tensor = torch.tensor(X_test, dtype=torch.float32)
y_test_tensor = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)
(4)创建数据集和数据加载器
使用TensorDataset将特征张量和标签张量组合成数据集,并通过DataLoader创建数据加载器,设置合适的批量大小(batch_size)并开启数据打乱(shuffle)功能,以便在训练过程中更好地优化模型:
from torch.utils.data import TensorDataset, DataLoader
train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
三、模型构建
(1)定义 BP 神经网络类
我们定义一个继承自nn.Module的BPNet类来构建 BP 神经网络。该网络包含一个输入层(接收 9 个特征),一个隐藏层(16 个神经元),以及一个输出层(1 个神经元用于预测是否流失),并在隐藏层使用 ReLU 激活函数,输出层使用 Sigmoid 激活函数:
class BPNet(nn.Module):
def __init__(self):
super(BPNet, self).__init__()
self.fc1 = nn.Linear(9, 16)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(16, 1)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
out = self.sigmoid(out)
return out
四、训练与优化
(1)初始化模型、损失函数和优化器
初始化我们定义的 BP 神经网络模型,选择二分类交叉熵损失函数(nn.BCELoss)来衡量预测值和真实值之间的差异,并使用 Adam 优化器来更新模型的参数:
model = BPNet()
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
(2)模型训练
通过循环指定的训练轮数(num_epochs),在每一轮中遍历数据加载器中的每个批次数据,进行前向传播计算损失,反向传播计算梯度并更新模型参数:
num_epochs = 10
for epoch in range(num_epochs):
for batch_X, batch_y in train_loader:
optimizer.zero_grad()
outputs = model(batch_X)
loss = criterion(outputs, batch_y)
loss.backward()
optimizer.step()
print(f'Epoch {epoch + 1}/{num_epochs}, Loss: {loss.item()}')
从训练过程的输出结果(如图所示)可以看到,每一轮训练的损失值在不断变化,这反映了模型在训练过程中逐渐学习和优化的过程:

五、模型评估
在训练完成后,我们使用测试数据对模型进行评估。通过在测试数据上进行前向传播得到预测结果,将预测结果进行阈值判断(大于 0.5 视为正例,即客户会流失),并计算预测结果与真实标签的准确率:
with torch.no_grad():
model.eval()
test_outputs = model(X_test_tensor)
predicted = (test_outputs > 0.5).float()
accuracy = (predicted == y_test_tensor).sum().item() / y_test_tensor.size(0)
print(f'Test Accuracy: {accuracy}')
最终我们得到模型在测试集上的准确率为 0.673,这表示模型在预测客户是否流失这个任务上有一定的表现,但也存在进一步优化的空间:
六、总结
本文通过使用 PyTorch 搭建了一个简单的 BP 神经网络来进行客户流失预测,从数据准备、模型构建、训练优化到最终评估,完整地展示了整个流程。在实际应用中,可以进一步尝试调整模型结构、超参数(如隐藏层神经元数量、学习率、训练轮数等),或者对数据进行更精细的预处理(如特征工程、归一化等),来提升模型的性能。希望本文能为大家在使用 PyTorch 进行深度学习任务时提供一些参考和帮助。
更多推荐

所有评论(0)