一、引言

  在当今数字化时代,客户流失预测对于企业来说至关重要。通过提前预测哪些客户可能会流失,企业可以采取针对性的措施来挽留客户,从而降低客户流失率,提高业务收益。本文将介绍如何使用 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.ModuleBPNet类来构建 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 进行深度学习任务时提供一些参考和帮助。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐