网站编写语言什么好,建设工程规划许可证网站,青岛百度排名优化,seo行业网#x1f368; 本文为#x1f517;365天深度学习训练营中的学习记录博客#x1f356; 原作者#xff1a;K同学啊 数据集包含2149名患者的广泛健康信息#xff0c;每名患者的ID范围从4751到6900不等。该数据集包括人口统计详细信息、生活方式因素、病史、临床测量、认知和功… 本文为365天深度学习训练营中的学习记录博客 原作者K同学啊 数据集包含2149名患者的广泛健康信息每名患者的ID范围从4751到6900不等。该数据集包括人口统计详细信息、生活方式因素、病史、临床测量、认知和功能评估、症状以及阿尔兹海默症的诊断。 一、前期准备工作
1.设置硬件设备
import numpy as np
import pandas as pd
import torch
from torch import nn
import torch.nn.functional as F
import seaborn as sns#设置GPU训练也可以使用CPU
devicetorch.device(cuda if torch.cuda.is_available() else cpu)
print(device)结果输出 2.导入数据
df pd.read_csv(alzheimers_disease_data.csv)
# 删除第一列和最后一列
df df.iloc[:, 1:-1]
print(df)
结果输出 二、构建数据集
1.标准化
#构建数据集
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_splitX df.iloc[:,:-1]
y df.iloc[:,-1]# 将每一列特征标准化为标准正太分布注意标准化是针对每一列而言的
sc StandardScaler()
X sc.fit_transform(X)
2.划分数据集
#划分数据集
X torch.tensor(np.array(X), dtypetorch.float32)
y torch.tensor(np.array(y), dtypetorch.int64)X_train, X_test, y_train, y_test train_test_split(X, y,test_size 0.1,random_state 1)print(X_train.shape, y_train.shape)
3.构建数据加载器
#构建数据加载器
from torch.utils.data import TensorDataset, DataLoadertrain_dl DataLoader(TensorDataset(X_train, y_train),batch_size64,shuffleFalse)test_dl DataLoader(TensorDataset(X_test, y_test),batch_size64,shuffleFalse)输出结果 三、模型训练 1.构建模型
#构建模型
class model_rnn(nn.Module):def __init__(self):super(model_rnn, self).__init__()self.rnn0 nn.RNN(input_size32, hidden_size200,num_layers1, batch_firstTrue)self.fc0 nn.Linear(200, 50)self.fc1 nn.Linear(50, 2)def forward(self, x):out, hidden1 self.rnn0(x)out self.fc0(out)out self.fc1(out)return outmodel model_rnn().to(device)
print(model)
结果输出 如何来看模型的输出数据集格式是什么
#查看数据集输出格式是什么
print(model(torch.rand(30,32).to(device)).shape)结果输出 2.定义训练函数
# 训练循环
def train(dataloader, model, loss_fn, optimizer):size len(dataloader.dataset) # 训练集的大小num_batches len(dataloader) # 批次数目, (size/batch_size向上取整)train_loss, train_acc 0, 0 # 初始化训练损失和正确率for X, y in dataloader: # 获取图片及其标签X, y X.to(device), y.to(device)# 计算预测误差pred model(X) # 网络输出loss loss_fn(pred, y) # 计算网络输出和真实值之间的差距targets为真实值计算二者差值即为损失# 反向传播optimizer.zero_grad() # grad属性归零loss.backward() # 反向传播optimizer.step() # 每一步自动更新# 记录acc与losstrain_acc (pred.argmax(1) y).type(torch.float).sum().item()train_loss loss.item()train_acc / sizetrain_loss / num_batchesreturn train_acc, train_loss3.定义测试函数
def test (dataloader, model, loss_fn):size len(dataloader.dataset) # 测试集的大小num_batches len(dataloader) # 批次数目, (size/batch_size向上取整)test_loss, test_acc 0, 0# 当不进行训练时停止梯度更新节省计算内存消耗with torch.no_grad():for imgs, target in dataloader:imgs, target imgs.to(device), target.to(device)# 计算losstarget_pred model(imgs)loss loss_fn(target_pred, target)test_loss loss.item()test_acc (target_pred.argmax(1) target).type(torch.float).sum().item()test_acc / sizetest_loss / num_batchesreturn test_acc, test_loss
4.正式训练模型
loss_fn nn.CrossEntropyLoss() # 创建损失函数
learn_rate 5e-5 # 学习率
opt torch.optim.Adam(model.parameters(),lrlearn_rate)
epochs 50train_loss []
train_acc []
test_loss []
test_acc []for epoch in range(epochs):model.train()epoch_train_acc, epoch_train_loss train(train_dl, model, loss_fn, opt)model.eval()epoch_test_acc, epoch_test_loss test(test_dl, model, loss_fn)train_acc.append(epoch_train_acc)train_loss.append(epoch_train_loss)test_acc.append(epoch_test_acc)test_loss.append(epoch_test_loss)# 获取当前的学习率lr opt.state_dict()[param_groups][0][lr]template (Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f}, Lr:{:.2E})print(template.format(epoch1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss, lr))print(*20, Done, *20)输出结果 四、模型评估
1.Loss与Accuracy图
import matplotlib.pyplot as plt
#隐藏警告
import warnings
warnings.filterwarnings(ignore) #忽略警告信息
plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签
plt.rcParams[axes.unicode_minus] False # 用来正常显示负号
plt.rcParams[figure.dpi] 200 #分辨率from datetime import datetime
current_time datetime.now() # 获取当前时间epochs_range range(epochs)plt.figure(figsize(12, 3))
plt.subplot(1, 2, 1)plt.plot(epochs_range, train_acc, labelTraining Accuracy)
plt.plot(epochs_range, test_acc, labelTest Accuracy)
plt.legend(loclower right)
plt.title(Training and Validation Accuracy)
plt.xlabel(current_time) # 打卡请带上时间戳否则代码截图无效plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_loss, labelTraining Loss)
plt.plot(epochs_range, test_loss, labelTest Loss)
plt.legend(locupper right)
plt.title(Training and Validation Loss)
plt.show()输出结果 2.混淆矩阵
print(输入数据Shape为)
print(X_test.shape: , X_test.shape)
print(y_test.shape: , y_test.shape)pred model(X_test.to(device)).argmax(1).cpu().numpy()print(\n输出数据Shape为 )
print(pred.shape: ,pred.shape)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay#计算混淆矩阵
cm confusion_matrix(y_test, pred)plt.figure(figsize(6,5))
plt.suptitle()
sns.heatmap(cm, annotTrue, fmtd,cmapBlues)#修改字体大小
plt.xticks(fontsize10)
plt.yticks(fontsize10)
plt.title(Confusion Matrix, fontsize12)
plt.xlabel(Predicted Label,fontsize10)
plt.ylabel(True Label, fontsize10)#显示图
plt.tight_layout()
plt.show()3.调用模型进行预测
text_X X_test[0].reshape(1,-1) #test[0]为输入数据pred model(test_X.to(device)).argmax(1).item()
print(模型预测结果为“,pred)
print(*20)
print(0:未患病)
print(1:已患病)
五、优化特征选择版
特征选择的思路值得学习。
数据维度多一般是先特征提取降维等操作。
特征提取①首先想到相关性分析用热力图但分析得出与是否患病相关性比较强的只有四个特征而日常以为的年龄、日常生活得分这些没有看出有相关性。②通过画图分析特征是否与目标有关但特征纬度多不是有效的一个方式。③采用随机森林进行分析效果很好。
六、总结
根据对数据的预处理帮助实验精度提高。RNN也是很基础的模型跟着教案逐渐开始体会实验的思路。看完流程图也对自己该怎么干如何干有了大致的方向。