医学图像人工智能专项课程-深度学习用于疾病诊断-第一课第一周16-18节-如何确保数据集病人不重叠+作业解说

模型测试

既然你已经了解了如何训练医学诊断模型,那么让我们来谈谈如何测试这样的模型。

接下来你会学习如何测试这样的一个模型。您将学习如何正确使用训练、验证和测试集。以及为了评估你的模型需要强大的ground truth。

当我们在做机器学习时,数据集通常将其分成训练集和测试集。

  • 训练集: 用于开发和选择模型。在实际应用中,训练集被进一步分割为训练集和验证集。训练集用于学习模型,验证集用于超参数调整。
  • 测试集: 用于最终报告我们的结果

有时,为了减少模型性能估计中的可变性,可以多次使用称为交叉验证的方法将训练集和验证集分开。

这些集合有时也有不同的名称,比如验证集可以称为调整集或深度集,训练集可以称为开发集,而测试集可以被称为无效集,甚至更容易混淆验证集。

为了我们的目的,我们将坚持训练、验证和测试集等术语。

我们将讨论在医学背景下构建这些数据集的三个挑战

  • 第一个挑战涉及到我们如何使这些测试集独立
  • 第二个挑战涉及我们如何对它们进行采样
  • 第三个挑战涉及我们如何设置 ground truth

我们先讨论一下病人重叠的问题。假设一个病人来做两次x光检查,一次在六月,一次在十一月。两次,他们在拍x光片时都戴着项链。

他们的一张x光片作为训练集的一部分取样,另一张作为测试的一部分。

我们训练了我们的深度学习模型,发现它正确地预测了测试集中的x射线:为正常图像。

问题是,当模型看到戴着项链的病人时,它实际上记忆的是脖子上的项链。

这不是假设,深度学习模型可以无意中记忆训练数据,而且模型可以记忆患者罕见或独特的训练数据方面,例如项链。

这可以帮助它在对同一个患者进行测试时获得正确答案。这将导致测试集的性能过于乐观,我们会认为我们的模型比实际的要好。

通过病人构建训练集合测试集

为了在我们的数据集中解决这个问题,我们可以确保患者的X光只出现在其中一个数据集中。

现在,我们把同一个病人的数据都放在训练集中,如果模型记住了病人身上的项链,这并不能帮助它在测试集上获得更高的性能,因为它看不到同一个病人。让我们看看这在所有病人身上的作用。

当我们用传统的方法(按图像分成不同的集合)分割一个数据集时,图像被随机分配到其中一个集合。

请注意,这样我们就得到了属于同一病人的不同组的X射线。例如,20号病人Xray1.jpg,是训练的一部分。Xray2.jpg也属于20号病人,也是验证的一部分。而Xray0.jpg也属于20号病人,这是测试集的一部分。

这就是病人重叠的问题。相反,当我们按患者分割数据集时,属于同一患者的所有X射线都在同一组中。

通过以病人来划分数据集,我们就可以确保两组之间没有病人重叠。这涵盖了我们对第一个挑战的解决方案。

作业解读

作业文件:AI4M_C1_W1_lecture_ex_04

了解过chest-xray8这个数据集,就会知道一个病人可能含有多个图像。

医学数据中的病人重叠是机器学习中一个非常普遍的问题,称为数据泄漏(data leakage)

要确定本周作业中的患者重叠,您不仅需要检查患者ID是否同时出现在训练集和测试集中。

您还应该检查在训练集和验证集中有没有患者重叠,这就是您将要做的。

下面是一个简单的示例,展示了如何检查和删除训练和验证集中的患者重叠。

tips:我给的代码文件里面没有训练集的csv文件,需要请自行下载。

通过‘valid-small.csv’文件,可以查看数据集的构造。

valid_df = pd.read_csv("nih/valid-small.csv")
print(f'There are {valid_df.shape[0]} rows and {valid_df.shape[1]} columns in the validation dataframe')
valid_df.head()

接下来提取 train 和 valid 的 PatientId

# Extract patient id's for the training set
ids_train = train_df.PatientId.values
# Extract patient id's for the validation set
ids_valid = valid_df.PatientId.values

使用 set() 对 ID 排序

ids_train_set = set(ids_train)   
print(f'There are {len(ids_train_set)} unique Patient IDs in the training set')
# Create a "set" datastructure of the validation set id's to identify unique id's
ids_valid_set = set(ids_valid)
print(f'There are {len(ids_valid_set)} unique Patient IDs in the validation set')
+ There are 928 unique Patient IDs in the training set
- There are 97 unique Patient IDs in the validation set

set()函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。

然后通过求集合的交集来看是否有重叠的病人

# Identify patient overlap by looking at the intersection between the sets
patient_overlap = list(ids_train_set.intersection(ids_valid_set))
n_overlap = len(patient_overlap)
print(f'There are {n_overlap} Patient IDs in both the training and validation sets')
print('')
print(f'These patients are in both the training and validation datasets:')
print(f'{patient_overlap}')
+ There are 11 Patient IDs in both the training and validation sets

- These patients are in both the training and validation datasets:
- [20290, 27618, 9925, 10888, 22764, 19981, 18253, 4461, 28208, 8760, 7482]

由此,我们就求出了训练集和验证集中有多少病人重叠,以及重叠的病人ID。

接下来,我们就要在训练集或验证集中删除它们。我们选择删除验证集,你也可以选择删除训练集。

方法是通过找到重叠的PatientId的那些行索引,然后删除该行。

train_overlap_idxs.extend(train_df.index[train_df['PatientId'] == patient_overlap[idx]].tolist())
valid_overlap_idxs.extend(valid_df.index[valid_df['PatientId'] == patient_overlap[idx]].tolist())
valid_df.drop(valid_overlap_idxs, inplace=True)

Congratulations!

你已经解决了数据集的第一个挑战!

作业解读只介绍了部分重点,更深刻的理解需要自己去做一做作业。

欢迎继续阅读下一次内容~~~

文章持续更新,可以关注微信公众号【医学图像人工智能实战营】获取最新动态,一个关注于医学图像处理领域前沿科技的公众号。坚持已实践为主,手把手带你做项目,打比赛,写论文。凡原创文章皆提供理论讲解,实验代码,实验数据。只有实践才能成长的更快,关注我们,一起学习进步~

我是Tina, 我们下篇博客见~

白天工作晚上写文,呕心沥血

觉得写的不错的话最后,求点赞,评论,收藏。或者一键三连
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tina姐

我就看看有没有会打赏我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值