623. ISIC 2024 - Skin Cancer Detection with 3D-TBP | isic-2024-challenge
我很激动能在这次竞赛中获得第 3 名,我想感谢 Kaggle 和组织者让这次奇妙的经历成为可能。同时也祝贺所有其他获奖者!
特别感谢 @greysky、@murashow、@merfarukelik 和 @richolson 在整个竞赛期间的工作和分享。
我的解决方案与许多其他优秀的公开 Notebook 一致,将 GBDT 表格模型与图像模型的输出作为特征相结合。我的大部分工作集中在开发各种图像模型以提高 GBDT 的分数。正如许多 Kaggle 选手指出的那样,这次竞赛的关键因素是可信的交叉验证(Trust-CV),我专注于创建可靠的 CV 并最大化 CV 分数。(我的最终 CV 为 0.183099)
我的最终解决方案使用了 4 个图像模型:
正样本:"target" = 1
正样本:target=1 + iddx_1=Indeterminate + iddx_2!=nan
上述最后 2 个模型旨在提供保守的预测,以便 GBDT 模型拥有更多样化的特征。
总体而言,正如许多人提到的,较小的模型在我的案例中表现也更好。
class ISICDataset(Dataset):
def __init__(self, hdf5_file, isic_ids, targets=None, transform=None, ratio_int=2):
self.hdf5_file = hdf5_file
self.isic_ids = isic_ids
self.targets = targets
self.transform = transform
self.ratio_int = ratio_int # 如果 ratio_int=2 则 正:负 = 1:2
self.positive_list = [ii for ii, tt in zip(self.isic_ids, self.targets) if tt == 1]
random.shuffle(self.positive_list)
self.negative_list = [ii for ii, tt in zip(self.isic_ids, self.targets) if tt == 0]
random.shuffle(self.negative_list)
self.balanced_list = self.create_balanced_list()
def create_balanced_list(self):
balanced_list = []
pos_count = 0
neg_count = 0
# 根据指定比例依次重复和排列正列表和负列表。
while pos_count < len(self.positive_list) or neg_count < len(self.negative_list):
if pos_count < len(self.positive_list):
balanced_list.append(self.positive_list[pos_count])
pos_count += 1
for _ in range(self.ratio_int):
if neg_count < len(self.negative_list):
balanced_list.append(self.negative_list[neg_count])
neg_count += 1
return balanced_list
def __getitem__(self, idx):
isic_id = self.balanced_list[idx]
按 patient_id 进行 GroupStratified 5 折交叉验证,并检查患者数量和正标签在各折之间是否均匀分布。图像模型和表格模型使用相同的折数分割。
我的表格模型几乎与以下优秀的 Notebook 相同。我的最终解决方案使用了 LGBM(无图像) + LGBM(有图像) + Catboost(有图像) + XGB(有图像)。
在整个竞赛过程中,我一直在思考如何最好地将 GBDT 模型与图像模型结合起来,旨在通过覆盖对方挣扎的领域来互补彼此的弱点。我尝试训练图像模型,目标为 ("target" - "GBDT prediction"),但该模型对最终集成的 GBDT 模型没有贡献。
在我看来,身体左侧和右侧发生恶性肿瘤的概率不同似乎不合逻辑。因此,我通过将“左臂 - 下部”和“右臂 - 下部”等类别合并为单个“臂 - 下部”特征来创建新特征,但这并没有导致分数提高。
最后,我的工作建立在许多 Kaggle 选手的贡献之上。再次我想向所有慷慨分享知识和技术的 Kaggle 选手表示感谢。这是一次很棒的学习经历,我很兴奋能在这个奇妙的社区中继续成长。
我的代码可在 此处 获取。