玩转ChatGPT:Transformer分类模型

一、写在前面

之前,我们介绍了Sklearn包以及Boost辈的各种分类模型,这些模型都很经典了,实际上也很强大,比如说Xgboost。

然而,近期随着ChatGPT的大火,其底层框架Transformer也逐渐火了,现在大家朝着通用人工智能的方向靠拢。因此,我在想,尝试使用Transformer框架做一做临床诊断/预后问题(本质上就是分类问题),看看效果如何。

首先使用GPT简单科普Transformer框架:

二、尝鲜过程

实际上,我对于Transformer框架一概不知。所以,无脑求助GPT。

(1)用TA提供一个基础代码:

咒语:我有一个<临床数据>,其中“X1”列表示病人的预后(0表示生存,1表示死亡),其余列“X3”至“X19”表示临床自变量。

我需要写一个Transformer框架做分类的代码,使用“X3”至“X19”这17个自变量去预测“X1”,请用python帮我写出代码。

数据格式如下:

<

X1 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19

0 0 0 0 0 0 0 2.17 22 6.5 295 1.16 0.08 3.52 224 0.33 0 82.6

0 1 0 0 0 1 0 1.17 23 24.3 261 0.79 0.04 3.75 59 0.27 0.02 53.3

0 0 0 0 0 0 0 1.82 63.99 3.9 460.67 1.2 0.05 4.8 21 0.07 0 38.3

1 0 0 0 1 1 0 2.13 63.99 15.7 401.3 1.24 0.12 5.1 147 0.9 0.01 80.84

>

回复如下:

首先得安装PyTorch,具体安装教程就不说了。算了,还是说一下:

(a)打开Anaconda Prompt;

(b)打开Pytorch官网(https://pytorch.org/)寻找安装命令代码,根据自己的需求选择安装条件,比如我的LOW电脑没有GPU,只能用CPU;

(c)在Anaconda Prompt输入代码安装(记得切换好安装环境):

conda install pytorch torchvision torchaudio cpuonly -c pytorch

回车安装即可。

再附上GPT给的代码:

import torchimport torch.nn as nnimport torch.optim as optimfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerimport pandas as pdimport numpy as np# 加载数据data = pd.read_csv('your_data.csv')  # 请用您数据的实际路径替换 'your_data.csv'X = data.loc[:, 'X3':'X19'].valuesy = data['X1'].values# 数据预处理scaler = StandardScaler()X = scaler.fit_transform(X)# 划分数据集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建PyTorch数据加载器train_data = torch.utils.data.TensorDataset(torch.Tensor(X_train), torch.Tensor(y_train))test_data = torch.utils.data.TensorDataset(torch.Tensor(X_test), torch.Tensor(y_test))train_loader = torch.utils.data.DataLoader(train_data, batch_size=32, shuffle=True)test_loader = torch.utils.data.DataLoader(test_data, batch_size=32, shuffle=True)# 定义设备device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')# 创建Transformer模型class TransformerModel(nn.Module):def __init__(self, input_dim, output_dim, nhead=1):super(TransformerModel, self).__init__()self.encoder = nn.TransformerEncoder(nn.TransformerEncoderLayer(d_model=input_dim, nhead=nhead),num_layers=3)self.classifier = nn.Linear(input_dim, output_dim)def forward(self, x):x = self.encoder(x)x = self.classifier(x)return x# 初始化模型和优化器model = TransformerModel(input_dim=X.shape[1], output_dim=2).to(device)optimizer = optim.Adam(model.parameters(), lr=0.001)criterion = nn.CrossEntropyLoss()# 训练模型for epoch in range(100):for i, (inputs, labels) in enumerate(train_loader):inputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels.long())loss.backward()optimizer.step()print(f'Epoch {epoch+1} / 100: Average Loss: {loss.item()}')

(2)模型需要计算性能参数

写咒语:我还需要做得出模型在训练集和测试集上的性能指标,包括灵敏度、特异度和AUC值,帮我更新代码。

TA又更新了代码(只显示更新的部分):

# 训练模型for epoch in range(20):for i, (inputs, labels) in enumerate(train_loader):inputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels.long())loss.backward()optimizer.step()# 验证模型model.eval()with torch.no_grad():# 训练集predictions = []truths = []for inputs, labels in train_loader:inputs, labels = inputs.to(device), labels.to(device)output = model(inputs)_, predicted = torch.max(output.data, 1)predictions += predicted.tolist()truths += labels.tolist()tn, fp, fn, tp = confusion_matrix(truths, predictions).ravel()sensitivity = tp / (tp + fn)specificity = tn / (tn + fp)auc = roc_auc_score(truths, predictions)#print(f'Epoch {epoch+1} / 100, Training: Sensitivity: {sensitivity}, Specificity: {specificity}, AUC: {auc}')# 测试集predictions = []truths = []for inputs, labels in test_loader:inputs, labels = inputs.to(device), labels.to(device)output = model(inputs)_, predicted = torch.max(output.data, 1)predictions += predicted.tolist()truths += labels.tolist()tn, fp, fn, tp = confusion_matrix(truths, predictions).ravel()sensitivity = tp / (tp + fn)specificity = tn / (tn + fp)auc = roc_auc_score(truths, predictions)print(f'Epoch {epoch+1} / 100, Testing: Sensitivity: {sensitivity}, Specificity: {specificity}, AUC: {auc}')

把数据带进去运行试试:

可以看到,应该还是有一些过拟合的现象。

(3)继续施咒,如何改善过拟合。

施咒:上述的代码运行后出现过拟合,如何改善?

总体的挺到位的。我们来看看:

数据量就不考虑了,我也想要更多数据。更简单的模型,说的有道理,不过现在是测试这个面模型的性能。早停法也不适合,因为从20次迭代来看,都是过拟合的,你怎么样TA停,同样,交叉验证也是不可行。所以,试试其他的办法。

(4)增加正则化。

咒语:如何在代码中增加正则化项,请帮我改写相关代码段。

然后我加进去了,没啥效果。这是L2正则化,然后又问了L1正则化:

同样效果也不明显。

(5)减少模型复杂度。

咒语:如何做到“减少编码器层的数量、减少自注意力机制的头数或降低前馈神经网络的隐藏单元数量”,请分别修改代码段展示。

GPT注意给了回复,这里我一起展示:

# 创建Transformer模型class TransformerModel(nn.Module):def __init__(self, input_dim, output_dim, nhead=1):super(TransformerModel, self).__init__()self.encoder = nn.TransformerEncoder(nn.TransformerEncoderLayer(d_model=input_dim, nhead=nhead),num_layers=int(0.5 * input_dim) # 减少层数)self.norm = nn.BatchNorm1d(input_dim)  # 添加批归一化层        self.classifier = nn.Linear(input_dim, output_dim)self.dropout = nn.Dropout(1)  # 添加一个dropout层  

然后,效果也是不明显。

看来过拟合不好解决,同时我们可以看到,Sensitivity都是比Specificity要小的,这也可以理解,因为这是一个不平衡数据(正比负是1:3),下一步考虑从这一点入手。

(6)处理不平衡数据。

咒语:Sensitivity远远比Specificity要小,请问如何改进代码?

我们来分析下:重采样就算了,尽量不要动原始数据。第三个看不懂。所以,试试改变阈值。

(7)改变阈值。

咒语:改代码中如何改变阈值?请修改相应代码段。

代码如下:

# 验证模型model.eval()with torch.no_grad():# 测试集predictions = []truths = []for inputs, labels in test_loader:inputs, labels = inputs.to(device), labels.to(device)output = model(inputs)# 将输出结果用 softmax 函数转换为概率probabilities = torch.nn.functional.softmax(output, dim=1)# 调整阈值,例如设定阈值为 0.3threshold = 0.3predicted = (probabilities[:, 1] > threshold).long()predictions += predicted.tolist()truths += labels.tolist()tn, fp, fn, tp = confusion_matrix(truths, predictions).ravel()sensitivity = tp / (tp + fn)specificity = tn / (tn + fp)auc = roc_auc_score(truths, predictions)print(f'Epoch {epoch+1} / 100, Testing: Sensitivity: {sensitivity}, Specificity: {specificity}, AUC: {auc}')

当然值变动了测试集,我们来试试效果,阈值改成0.3:

可以看到,特异度的份额被分到了灵敏度了,总体的AUC值变化不大。因此,性能基本上也就这样了。

最终的代码:

import torchimport torch.nn as nnimport torch.optim as optimfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.metrics import confusion_matrix, roc_auc_scoreimport pandas as pdimport numpy as np# 加载数据data = pd.read_csv('Entry model3.csv')  # 请用您数据的实际路径替换 'your_data.csv'X = data.loc[:, 'X3':'X19'].valuesy = data['X1'].values# 数据预处理scaler = StandardScaler()X = scaler.fit_transform(X)# 划分数据集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2338)# 创建PyTorch数据加载器train_data = torch.utils.data.TensorDataset(torch.Tensor(X_train), torch.Tensor(y_train))test_data = torch.utils.data.TensorDataset(torch.Tensor(X_test), torch.Tensor(y_test))train_loader = torch.utils.data.DataLoader(train_data, batch_size=32, shuffle=True)test_loader = torch.utils.data.DataLoader(test_data, batch_size=32, shuffle=True)# 定义设备device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')# 创建Transformer模型class TransformerModel(nn.Module):def __init__(self, input_dim, output_dim, nhead=1):super(TransformerModel, self).__init__()self.encoder = nn.TransformerEncoder(nn.TransformerEncoderLayer(d_model=input_dim, nhead=nhead),num_layers=int(0.5 * input_dim) # 减少层数)self.norm = nn.BatchNorm1d(input_dim)  # 添加批归一化层        self.classifier = nn.Linear(input_dim, output_dim)self.dropout = nn.Dropout(1)  # 添加一个dropout层        def forward(self, x):x = self.encoder(x)x = self.classifier(x)return x# 初始化模型和优化器model = TransformerModel(input_dim=X.shape[1], output_dim=2).to(device)optimizer = optim.Adam(model.parameters(), lr=0.0001, weight_decay=1e-5)criterion = nn.CrossEntropyLoss()# 训练模型for epoch in range(20):for i, (inputs, labels) in enumerate(train_loader):inputs, labels = inputs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels.long())# 添加L1正则化#l1_lambda = 0.001#l1_norm = sum(p.abs().sum() for p in model.parameters())#loss = loss + l1_lambda * l1_normloss.backward()optimizer.step()# 验证模型model.eval()with torch.no_grad():# 训练集predictions = []truths = []for inputs, labels in train_loader:inputs, labels = inputs.to(device), labels.to(device)output = model(inputs)_, predicted = torch.max(output.data, 1)predictions += predicted.tolist()truths += labels.tolist()tn, fp, fn, tp = confusion_matrix(truths, predictions).ravel()sensitivity = tp / (tp + fn)specificity = tn / (tn + fp)auc = roc_auc_score(truths, predictions)#print(f'Epoch {epoch+1} / 100, Training: Sensitivity: {sensitivity}, Specificity: {specificity}, AUC: {auc}')# 测试集predictions = []truths = []for inputs, labels in test_loader:inputs, labels = inputs.to(device), labels.to(device)output = model(inputs)# 将输出结果用 softmax 函数转换为概率probabilities = torch.nn.functional.softmax(output, dim=1)# 调整阈值,例如设定阈值为 0.3threshold = 0.3predicted = (probabilities[:, 1] > threshold).long()predictions += predicted.tolist()truths += labels.tolist()tn, fp, fn, tp = confusion_matrix(truths, predictions).ravel()sensitivity = tp / (tp + fn)specificity = tn / (tn + fp)auc = roc_auc_score(truths, predictions)print(f'Epoch {epoch+1} / 100, Testing: Sensitivity: {sensitivity}, Specificity: {specificity}, AUC: {auc}')

三、总结

以上,Transformer框架能解决分类问题。不过在这个例子中,性能不太好,可能是因为数据量太小了吧(400多例而已)。反而,同样的数据,Xgboost略胜一筹(AUC:0.75),所以有时候,合适的模型才是最好的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6706.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT进化的过程简介

Chat GPT可以做什么&#xff1f; 分点列条的回答问题 写代码或SQL 翻译 语法检查 ChatGPT官方还未公开论文&#xff0c;ChatGPT有一个“孪生兄弟”InstructGPT&#xff0c;InstructGPT有论文&#xff0c;可以根据InstructGPT论文推导ChatGPT的训练过程&#xff1a; ChatGPT的…

Chatgpt频繁“something went wrong”需要刷新的解决办法

问题描述&#xff1a; 使用Chatgpt问一两个问题或者过一段时间再提问就会出现下图&#xff1a; 需要频繁刷新&#xff0c;很影响体验。 解决办法&#xff1a; 【2023.4.23更新】 目前亲测可用的方法是在edge浏览器&#xff08;火狐浏览器貌似也可以&#xff0c;chrome不可以…

【视频文稿】车载Android应用开发与分析 - 走进车载操作系统

本期内容的视频地址&#xff1a;https://www.bilibili.com/video/BV1rR4y1B7Qd/ Hello&#xff0c;各位好&#xff0c;我是一个做车载软件开发的软件工程师&#xff0c;之前在CSDN、稀土掘金这些平台上发表过一些车载应用方面的文章&#xff0c;期间得到了许多朋友的反馈。2023…

Midjourney|文心一格prompt教程[Text Prompt(下篇)]:游戏、实物、人物、风景、动漫、邮票、海报等生成,终极模板教学

Midjourney|文心一格prompt教程[Text Prompt&#xff08;下篇&#xff09;]&#xff1a;游戏、实物、人物、风景、动漫、邮票、海报等生成&#xff0c;终极模板教学 场景6&#xff1a;游戏 Prompt 真的越长越好吗&#xff1f; 按照 Midjourney 的官方文档里的说法&#xff0…

OpenAI开源3D模型生成器;IBM将推出AIGC平台Watsonx;百度正在内测文心千帆大模型平台丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 OpenAI开源3D模型生成器Shap-E 5月10日&#xff0c;OpenAI公开了其最新的开源模型Shap-E&#xff0c;这款创新型3D模型生成器能将描述性的文本转化为相应的3D模型。用户只需提供描述性的文本&#xff0c;就能生…

美团收购光年之外公司全部业务;工联院对大模型知识问答能力进行评测;图森未来计划出售美国业务;小i机器人发布华藏大模型丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 美团收购王慧文光年之外公司全部业务 6月29日&#xff0c;美团发布公告称&#xff1a;于2023年6月29日&#xff08;交易时段后&#xff09;订立交易协议&#xff0c;收购光年之外的全部权益。总代价包括现金233…

13岁青少年DAO创始人:Web3治好了我的“丧”

“我看大家都死气沉沉的&#xff0c;大家都站起来活动活动。” 4月&#xff0c;香港Web3嘉年华的一场沙龙&#xff0c;橙色针织帽给黑压压的现场带来一抹亮色&#xff0c;13岁的Carry Zheng戴着它登台&#xff0c;没有“大家好”的寒暄&#xff0c;直接向台下的成年人发出指令&…

从数据到应用 Web3不再纸上谈兵

继宣布拨款5000万港元加速推动Web3生态圈发展后&#xff0c;香港再次明确对Web3产业创新的支持。近日&#xff0c;香港Web3协会正式成立&#xff0c;创立Web3Hub基金&#xff0c;“东方之珠”正在大力推进第三代互联网的生态建设。 不仅仅是政策红利&#xff0c;ChatGPT等人工…

雷军谈人生低谷,刘强东“卸任”后“整顿”京东,AI 引领技术热潮 | 2022 科技圈那些事...

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 2023 年的钟声已经敲响&#xff0c;回顾 2022 年&#xff0c;新兴技术在蓬勃发展&#xff0c;热点趋势不断出现&#xff0c;在潜移默化中给我们工作、学习和生活带来了许多的变化。 这一…

一周 AIGC 丨全球最大 AIGC 收购案诞生,中国大模型独角兽折戟

同样是在 AIGC 赛道&#xff0c;MosaicML 被 Databricks 以 13 亿美元收购&#xff0c;相比上轮估值翻了 5 倍&#xff0c;创造迄今全球最大的生成式 AI 收购案。而在中国&#xff0c;最耀眼的大模型独角兽光年之外&#xff0c;被以 2.85 亿美元送给了美团&#xff0c;相比两个…

从关键新闻和最新技术看AI行业发展(2023.5.22-6.22第一期) |【WeThinkIn老实人报】

Rocky Ding WeThinkIn 写在前面 【WeThinkIn老实人报】是WeThinkIn的全新栏目&#xff0c;旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0…

中国芯发展新模式:在高质量、高增长内需中发现机会并建立创新生态

北京华兴万邦管理咨询有限公司 刘朝晖 陈皓 集成电路产业从诞生开始历来都是全球化和生态化的行业。全球化是为了摊销其高额的研发费用和制造成本&#xff0c;以及不低的市场营销&#xff08;试错&#xff09;支出&#xff1b;而生态化是因为芯片行业本身并不面向最终用户&…

客观地说,应该看一看 Web3.0 了

武术圈有名言&#xff1a;“八极加劈挂&#xff0c;神鬼都害怕”。要是 Web3.0AGI 的话&#xff0c;世界将会变成什么样子&#xff1f; 数科星球原创作者丨苑晶编辑丨大兔 Web3.0 的价值开始受到重视&#xff0c;在最近&#xff0c;来自香港的好消息再次带火了这个领域的热度。…

CSDN参加欧洲最大开源盛会KubeCon,与全球开发者共促开源生态发展

4月18-21日&#xff0c; CSDN与来自全球超 1 万名的工程师、开发者一起参加了在荷兰阿姆斯特丹召开的 KubeConCloudNatvieCon Europe 2023 大会。 KubeConCloudNatvieCon被誉为“欧洲最大开源的盛会”。CSDN第一时间跟进了Kubernetes、云原生技术的最新进展&#xff0c;并与全球…

LLM论文周报|来自谷歌、华为、斯坦福大学、香港大学等机构前沿论文研究

大模型(LLM)是一种人工智能模型&#xff0c;旨在理解和生成人类语言。它们在大量的文本数据上进行训练&#xff0c;可以执行广泛的任务&#xff0c;包括文本总结、翻译、情感分析等等。LLM的特点是规模庞大&#xff0c;包含数十亿的参数&#xff0c;帮助它们学习语言数据中的复…

雷军谈人生低谷,刘强东“卸任”后“整顿”京东,AI 引领技术热潮 | 2022 科技圈那些事

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 2023 年的钟声已经敲响&#xff0c;回顾 2022 年&#xff0c;新兴技术在蓬勃发展&#xff0c;热点趋势不断出现&#xff0c;在潜移默化中给我们工作、学习和生活带来了许多的变化。 这…

长虹电视将搭载AI大模型;我国新型城际市域智能列车在青岛问世;百度盲人导航眼镜专利获授权丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 周杰伦与中国移动开启元宇宙合作&#xff1a;推出数智人“周同学” 中国移动动感地带与周杰伦合作20周年暨周同学元宇宙合作发布会于5月8日举行&#xff0c;在发布会上周杰伦与中国移动共同推出了数智人“周同学…

ChatGPT4通道开放接入基于OPEN AI 平台你的任何APP 可一键接入AI 智能

你一定很好奇什么是 OPEN AI快速开发平台 顾名思义&#xff0c;开放的OPEN AI平台。 基于这个平台你的上层应用&#xff0c;如何 APP,小程序,H5,WEB, 公众号,任何一切终端都可以轻松接入&#xff0c;AI智能应用。 开发初衷 爆肝一周&#xff0c;我开源了ChatGPT 中文版接口&a…

复旦发布类ChatGPT模型Moss;OpenAI回应ChatGPT不向中国用户开放;Linux 6.2 发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

ChatGPT消灭全球3亿打工人!高盛重磅预测:25%岗位将被AI取代

来源丨新智元 点击进入—>3D视觉工坊学习交流群 【导读】高盛又发报告称&#xff0c;全球3亿打工人恐被AI替代。从前&#xff0c;是给员工配电脑&#xff0c;现在&#xff0c;是给电脑配员工。 上周&#xff0c;OpenAI刚发了一篇让打工人瑟瑟发抖的论文&#xff0c;预言80%美…