简单神经网络模型训练—乳腺癌预测(线性函数+激活函数)

# 使用torch求解非线性问题
'''
1、数据集预处理
    1.1 数据加载
    1.2 特征、标签分离
2、数据集划分
    2.1 划分测试集与训练集
    2.2 为了加快模型收敛速度,对数据进行标准化
    2.3 将数据转化为张量类型(为了放入pytorch中)
3、Sigmoid函数(激活函数)
4、乳腺癌模型训练
    4.1 正向传播,输出预测结果
    4.2 预测结果和真值,计算损失
    4.3 反向传播,获取梯度
    4.4 梯度更新模型的权重
    4.5 梯度清空
    4.6 循环上面的操作,直到损失较小为止
5、测试与准确率计算
'''
import pandas as pd
import torch
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 1.1数据加载
df = pd.read_csv('./breast_cancer.csv')  # 0-正常,1-乳腺癌

# 1.2 特征、标签分离
X = df[df.columns[0:-1]].values
Y = df[df.columns[-1]].values
print(X.shape, Y.shape)

# 2.1 划分测试集与训练集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=123)

print(X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)

# 2.2 为了加快模型收敛速度,将所有的数据按照比例缩放到一定范围内,对原始数据进行标准化
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.fit_transform(X_test)

# 2.3 将数据转化为张量类型(为了放入pytorch中)
X_train = torch.from_numpy(X_train.astype(np.float32))
Y_train = torch.from_numpy(Y_train.astype(np.float32))
X_test = torch.from_numpy(X_test.astype(np.float32))
Y_test = torch.from_numpy(Y_test.astype(np.float32))

# 将标签转成2维
Y_train = Y_train.view(Y_train.shape[0], 1)
Y_test = Y_test.view(Y_test.shape[0], 1)
print(X_train.size(), Y_train.size())

'''
线性函数是一条没有上界和下界的直线,线性函数预测出来的值可以很大,也可以很小。
而实验数据的标签只有0和1,因此用线性函数来拟合乳腺癌数据点是不合理的。

我们需要找到输出始终为0-1之间的函数模型,如果拥有这样的函数模型,那么将任意的X
放入该模型中,都会输出0-1之间的值。这个值我们可以看做说患有乳腺癌的概率,如果
这个概率值小于0.5,则表示没有乳腺癌,如果这个概率值大于0.5则表示患有乳腺癌。

Sigmoid就是这样的函数,又名激活函数
'''


class Model(torch.nn.Module):
    def __init__(self, n_input_features):
        super(Model, self).__init__()
        self.linear = torch.nn.Linear(n_input_features, 1)

    def forward(self, x):
        y_pred = torch.sigmoid(self.linear(x))
        return y_pred

# 获取样本量和特征数
n_samples, n_features = X.shape

# 模型的初始化
model = Model(n_features)
# 损失函数公式
loss = torch.nn.BCELoss()
# 迭代次数
num_epochs = 100
# 学习率
learning_rate = 0.1
# 优化器
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

'''
乳腺癌模型训练:
    4.1 正向传播,输出预测结果
    4.2 预测结果和真值,计算损失
    4.3 反向传播,获取梯度
    4.4 梯度更新模型的权重
    4.5 梯度清空
    4.6 循环上面的操作,直到损失较小为止
'''
for epoch in range(num_epochs):
    y_pred = model(X_train)
    l = loss(y_pred, Y_train)
    # 反向传播
    l.backward()
    # 更新权重
    optimizer.step()
    # 清空梯度
    optimizer.zero_grad()
    if epoch % 5 == 0:
        print(f'epoch:{epoch},loss:{l.item():.4f}')

print("Training Done !")

# 测试
index = np.random.randint(0, len(X_test))
y_pred = model(X_test[index])
y_pred_label = y_pred.round()
# 将结果转化为numpy类型
real = Y_test[index].detach().numpy()[0]
pre = y_pred_label.detach().numpy()[0]
print(f'第{index}条的真值为{real}:,预测结果为:{pre}')

# 计算模型准确率
with torch.no_grad():
    y_pred = model(X_test)
    y_pred_cls = y_pred.round()
    # 统计结果
    acc = y_pred_cls.eq(Y_test).sum().numpy() / float(Y_test.shape[0])
    print(f'准确率:{acc.item():.4f}')
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值