返回列表

Private 24th / Public 1st Approach

623. ISIC 2024 - Skin Cancer Detection with 3D-TBP | isic-2024-challenge

开始: 2024-06-27 结束: 2024-09-06 医学影像分析 数据算法赛
私有榜第 24 名 / 公有榜第 1 名 方案思路

私有榜第 24 名 / 公有榜第 1 名 方案思路

作者: Anil Ozturk (nlztrk)  |  发布时间: 2024-09-07  |  排名: 私有榜 24 / 公有榜 1

嗯,这对我来说确实是一次不愉快的考验。这是我第二次被踢出金牌区,所以我有点习惯了。💀 我很久没有使用图像模型了,所以这是一个很好的机会来重温并与最新技术同步。我想祝贺所有的获胜者,并感谢组织者的比赛。这是一个非常有教育意义的过程。

方案总结

我尝试了许多不同的方法,并试图将它们中的大多数纳入我最终选择的提交混合中。其中最值得注意的如下:


图像骨干网络

  • Resnet18,使用独热编码的性别、切片类型和站点信息
  • EfficientNetB0,使用独热编码的性别、切片类型和站点信息
  • Dreamsim VitB-16 嵌入 + LinearSVC

图像特征

我也尝试了手动图像特征,但当我开始添加神经网络 OOF 预测时,它们失去了效果:

中心病变比例: 将所有图像灰度化 + 阈值化,然后计算位于图像中心 50% 区域内的掩码值为 1 的像素比例。
HSV 特征: 计算所有图像的色相 - 饱和度 2D 矩阵,并计算它们的分布统计信息。


表格特征

我从最早的 notebook 开始使用 starter 特征。我没有直接使用任何分类特征。最大的改进来自分组聚合。它们很简单:

分组依据: (patient_id) 和 (patient_id, tbp_lv_location)
聚合: max, mean, min, median, skew, std, nunique, sum, z-score, ecdf


模型

模型只是一个 CatBoost(我是说 5 个 CatBoost 模型 blended 用于 5 折 CV),参数如下:

cb_params = {
    "random_state": 42,
    "iterations": 4500,
    "learning_rate": 0.015,
    "depth": 3,
    "verbose": 100,
    "use_best_model": True,
    "auto_class_weights": "Balanced",
    "eval_metric": "AUC:use_weights=false",
    "task_type": "GPU",
    "bootstrap_type": "Poisson",
    "l2_leaf_reg": 200.,
    "border_count": 254,
}

交叉验证与特征选择

使用了一个简单的分层分组 K 折交叉验证,如下:

sgkf = StratifiedGroupKFold(n_splits=5)
df_train["fold"] = -1
for idx, (train_idx, val_idx) in enumerate(sgkf.split(
    df_train,
    df_train["target"],
    groups=df_train["patient_id"]
)):
    df_train.loc[val_idx, "fold"] = idx

尝试了许多特征选择方案,如 SHAP、LOFO、Top-K 重要性。Top-K 方案对 CV 和 LB 都有改进。CatBoost 似乎真的很擅长这一点。

同比赛其他方案