目录
1.导包
2.加载数据
3.获取X与Y数据
4.将X,Y数据转化成tensor张量, tensor张量必须是二维数据
5.用封装的API实现线性分类
5.1导包
5.2建模-神经网络(二分类问题)
5.3定义损失函数
5.4定义优化器
5.5定义训练过程
5.6 计算正确率
1.导包
import torch
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
2.加载数据
data = pd.read_csv('./dataset/credit-a.csv', header = None)data.head() #查看读取数据的前5条
data.shape
(653, 16)
3.获取X与Y数据
#前15列式特征,最后一列是标记(二分类的目标结果)
X = data.iloc[:, :-1] #dataframe的切片索引数据:所有的行数据都要,最后一列数据不要
Y = data.iloc[:, -1] #行都要,列数据只要最后一列
X.shape
(653, 15)
Y.shape
(653,)
# 在机器学习与深度学习中,series数据结构是不能做为分类标记, series数据结构不属于一维数据结构,也不是二维数据结构
Y #Y原数据是series
X
X.values #是二维数组
array([[0.000e+00, 3.083e+01, 0.000e+00, ..., 0.000e+00, 2.020e+02,0.000e+00],[1.000e+00, 5.867e+01, 4.460e+00, ..., 0.000e+00, 4.300e+01,5.600e+02],[1.000e+00, 2.450e+01, 5.000e-01, ..., 0.000e+00, 2.800e+02,8.240e+02],...,[1.000e+00, 2.525e+01, 1.350e+01, ..., 0.000e+00, 2.000e+02,1.000e+00],[0.000e+00, 1.792e+01, 2.050e-01, ..., 0.000e+00, 2.800e+02,7.500e+02],[0.000e+00, 3.500e+01, 3.375e+00, ..., 0.000e+00, 0.000e+00,0.000e+00]])
Y.values #是一维数组
Y.replace(-1, 0, inplace=True) #将Y数据中的-1替换成0,inplace=True表示修改原数据, 方便后续求分类概率
Y
4.将X,Y数据转化成tensor张量, tensor张量必须是二维数据
#将X,Y数据转化成tensor张量, tensor张量必须是二维数据
X = torch.from_numpy(X.values).type(torch.FloatTensor)
Y = torch.from_numpy(Y.values.reshape(-1, 1)).type(torch.FloatTensor)
5.用封装的API实现线性分类
5.1导包
# 回归和分类之间, 区别其实不大. 回归后面加上一层sigmoid, 就变成分类.
from torch import nn #导入神经网络nn
5.2建模-神经网络(二分类问题)
#建模:建立神经网络 (二分类问题)
model = nn.Sequential(nn.Linear(15, 1), #隐藏层的模型 (输入维度,输出维度)nn.Sigmoid() #输出层的激活函数
)
model #查看模型的网络层数与信息
Sequential((0): Linear(in_features=15, out_features=1, bias=True)(1): Sigmoid() )
5.3定义损失函数
# BCE binary cross entroy 二分类的交叉熵损失函数 ,用于二分类问题
loss_fn = nn.BCELoss()
5.4定义优化器
#定义优化器(第一个参数是模型需要更新的参数)
opt = torch.optim.SGD(model.parameters(), lr=0.0001)
X.shape
torch.Size([653, 15])
X.shape[0]
653
5.5定义训练过程
#声明参数
batch_size = 32 #每次训练要取的数据量
steps = X.shape[0] // batch_size #取数据的次数
steps
20
#定义训练过程
for epoch in range(1000): #训练1000次for batch in range(steps):#获取起始索引start = batch * batch_sizeend = start + batch_size#获取x,y数据x = X[start: end]y = Y[start: end]#预测数据y_pred = model(x)#计算损失函数loss = loss_fn(y_pred, y)#梯度(迭代参数)清零opt.zero_grad()#反向传播,求导w和bloss.backward()#更新参数opt.step()
model.state_dict() #查看模型训练的参数结果
OrderedDict([('0.weight',tensor([[-0.2032, 0.0212, -0.0182, 0.0338, -0.0985, 0.0473, 0.0367, -0.2860,0.4145, 0.0227, -0.3472, 0.2760, 0.1583, 0.0106, -0.0017]])),('0.bias', tensor([0.0978]))])
5.6 计算正确率
# 计算正确率
# 设定阈值
# 现在预测得到的是概率. 我们根据阈值, 把概率转化为类别, 就可以计算准确率.
#每次训练的准确率都不同
((model(X).data.numpy() > 0.5) == Y.numpy()).mean()
0.7611026033690659
X.shape
torch.Size([653, 15])
model(X)
输出数据如下: (部分数据)
model(X).data
model(X).data.numpy()
model(X).data.numpy() > 0.5
Y.numpy()