pytorch-入门(信用卡欺诈数据二分类模型)

首先我们先看看这个数据集长什么样子:
首先这个数据集是没有表头的,最后一行是需要预测的结果-1和1代表欺诈和不欺诈。
image

读取文件

import pandas as pd
import torch

data=pd.read_csv('./credit-a.csv',header=None)
data.head()

image

数据处理

image
我们先取出X.

X=data.iloc[:,:-1]
X.head()

image
然后再取出Y:
注意这里由于标签只含有-1和1,所以我们要将-1变为0,我们使用replace函数。

.repalce(old,new,[,count])
old : 要被替换的旧字符串。
new : 用于替换的新字符串。
count : 可选参数,指定 count 后,只有 str 中前 count 个旧字符串old被替换。

Y = data.iloc[:, -1].replace(-1, 0)

X,Y转化成Tensor

X=torch.from_numpy(X.values).type(torch.FloatTensor)
Y = torch.from_numpy(Y.values.reshape(-1, 1)).type(torch.FloatTensor)

X.shape
Y.shape

但是要注意的是这个Y需要.reshape(-1, 1)操作,因为它只有一行,转化后的Y.shape=[653,1],如果没有转化的话,它的Y.shape=[653]。
所以这里是需要注意的
image

模型

from torch import nn

model = nn.Sequential(
        nn.Linear(15, 1),
        nn.Sigmoid()
)

model

image
这里只有一层线形层

损失函数和优化器

pytorch中的优化器位于torch.optim包内,作用是根据反向传播算法更新神经网络中的参数,以达到降低损失值loss的目的。

loss_fn = nn.BCELoss()
opt=torch.optim.SGD(model.parameters(),lr=0.00001)

训练

batches = 16
no_of_batches = 653//16

我们这里手动实现的这个batch

for epoch in range(1000):
    for batch in range(no_of_batches):
        start = batch*batches
        end = start + batches
        x = X[start: end]
        y = Y[start: end]
        y_pred = model(x)
        loss = loss_fn(y_pred, y)
        opt.zero_grad()
        loss.backward()
        opt.step()

核心分为三步

  • opt.zero_grad()函数:梯度归零。Pytorch不会自动进行梯度归零,如果不手动清零,则下一次迭代时计算得到的梯度值会与之前留下的梯度值进行叠加。
  • l.backward()函数:计算梯度
  • opt.step()函数:执行梯度下降,对学习的参数进行一次更新。
model.state_dict()

image

计算准确率

((model(X).data.numpy() > 0.5).astype('int') == Y.numpy()).mean()

0.7243491577335375

posted @ 2023-10-15 10:17  lipu123  阅读(149)  评论(0)    收藏  举报