623. ISIC 2024 - Skin Cancer Detection with 3D-TBP | isic-2024-challenge
祝贺所有的获奖者和参与者!我简直不敢相信我正在写一篇“第一名解决方案”的帖子。我非常感谢组织者举办了这次竞赛,也感谢所有的 Kaggle 参赛者,特别是 @greysky 的公开 Notebook,这是我实验的起点(ISIC 2024 | Only Tabular Data)。大约在三周前,也就是 LMSYS 竞赛结束后不久,我开始基于此进行实验。
我的解决方案与大多数参与者一样,基于集成各种 GBDT 模型的实现以及图像模型。对于图像模型,我使用了两种架构:EVA02-small (eva02_small_patch14_336.mim_in22k_ft_in1k) 和 EdgeNeXt (edgenext_base.in21k_ft_in1k)。此外,我还花费了大量时间生成合成数据,并尝试将以往竞赛的数据纳入当前的 pipeline 中。
我使用了简单的 5 折 Stratified Group KFold,没有进行特定的调整。对于性能评估,我应用了 @daniel89 曾在 Mercedes-Benz Greener Manufacturing 竞赛 中描述过的策略。就像他所做的那样,我使用了不同的种子运行 CV 10 次,计算 t 统计量(使用 scipy.stats.ttest_rel),并使用 p 值来指导我的决策。为了解决多重比较问题,我只使用这种方法测试了最显著的变化。如果 CV 显示出任何显著的改进,我会在公共 leaderboard 上进行测试,如果那里也有改进(几乎总是如此),这些变化就会被添加到最终解决方案中。
然而,在竞赛接近尾声时,当我卡在 0.185-0.186 的分数(私有榜 0.173)左右时,我偏离了这个规则(看到自己从第 23 名掉下来令人沮丧),开始测试甚至很小的假设,将 p 值阈值降低到 0.2,主要依赖公共 leaderboard。这导致我的最终解决方案在公共 leaderboard 上表现更好,但在私有 leaderboard 上略差。
我使用了 CatBoost、LGBM 和 XGBoost。每个模型都在 GPU 上使用 Group K-Fold(5 折)训练 10 次,模型和数据拆分使用不同的种子。这总共产生了 150 个模型。老实说,与只有 45 个模型的基础设置相比,这并没有提供显著的改进,但由于模型训练相当快(总训练时间不到 20 分钟),我决定增加集成的大小,即使收益很小。
对于每个模型,预测值进行排名 (.rank(pct=True)) 并以相等的权重平均。所有模型都使用 @daniel89 公开 Notebook 中的默认参数进行训练,包括欠采样和过采样。唯一的例外是 CatBoost,它训练了 1000 步,并根据验证集进行早停(od_wait = 100)。对于 CatBoost,我使用了以下参数:
1. 'learning_rate': 0.026
2. 'l2_leaf_reg': 18
3. 'random_strength': 4.7
4. 'depth': 6
5. 'bagging_temperature': 0.874
6. 'border_count': 256
7. 'grow_policy': 'Lossguide'
8. 'min_data_in_leaf': 38
这些参数最初是使用 Optuna 选择的,仅基于表格数据。不幸的是,在引入基于 CV 模型的特征后,我没有时间重新调整它们。我也没有优化其他模型的参数。
大多数技术采纳自 这里。
此外,我添加了:
虽然大多数特征描述的是绝对病变参数,但我旨在添加额外的相对信息(例如,描述特定病变对患者来说有多异常)。为了实现这一点,我根据 CatBoost 的特征重要性选择了顶级特征,并计算了每位患者病变的局部异常因子 (Local Outlier Factor) 分数。这使我的 CV 分数显著提高(从 0.18149 到 0.18185),并在 leaderboard 上也有所反映。
另一个尝试是使用最重要的特征对痣进行聚类,并计算每个痣在聚类内的 Z-score。这略微提高了 CV 和公共 leaderboard 的分数,但在私有 leaderboard 上没有产生显著改进。
由于正样本数量极少,预计模型将难以识别皮肤病变的边界情况。为了解决这个问题,在集成基于本次竞赛图像训练的模型之前,我使用从 repo 获得的数据,使用 EVA02 small 训练了一个 3 类分类模型(bkl/melanoma/nevus)。然后我根据 diagnosis_pr 应用了以下规则:
nevus -> nevus
melanoma -> melanoma
basal cell carcinoma -> bkl
seborrheic keratosis -> bkl
solar lentigo -> bkl
lentigo NOS -> bkl
所有剩余样本被标记为 benign_malignant == 'benign',但 diagnosis_pr != 'bkl' 的被标记为 'nevus'。
将此模型的预测添加到仅基于表格数据的模型中,显著提高了 CV 和 leaderboard 分数。CV: 0.1756 -> 0.1760, 公共榜:0.180 -> 0.182, 私有榜:0.163 -> 0.165。
同时,在最终模型中,添加这些特征略微提高了 CV: 0.18185 -> 0.18195。然而,公共和私有 leaderboard 分数也有 slight 改进。
我对使用合成正样本提高模型性能的潜力特别感兴趣,这也是我决定参加竞赛的主要原因之一。类似的方法在 Derm-T2IM 中实施。
生成合成数据的过程概述如下。
.png?generation=1725919714475856&alt=media)
下面,您可以比较恶性病变的真实照片、Derm-T2IM 模型生成的示例以及在竞赛数据上训练的模型。
.png?generation=1725919770830018&alt=media)
单个模型级别的平均指标证明了合成数据的有效性。

很明显,在合成数据上训练的模型的 CV 分数始终更好。Leaderboard(公共和私有)结果略好,平均而言,在合成数据上训练的模型表现更好。


例如,在合成数据上训练的模型集成在私有榜上显示出略好的结果(0.140 vs 0.142),在公共榜上也略好(在 0.157 范围内)。然而,不幸的是,添加在合成数据上训练的模型并没有改善最终集成,因此它们未包含在最终解决方案中。
如果有人有兴趣继续这方面的实验,我附上了我的一个 合成痣图像数据集。