623. ISIC 2024 - Skin Cancer Detection with 3D-TBP | isic-2024-challenge
嗯,这对我来说确实是一次不愉快的考验。这是我第二次被踢出金牌区,所以我有点习惯了。💀 我很久没有使用图像模型了,所以这是一个很好的机会来重温并与最新技术同步。我想祝贺所有的获胜者,并感谢组织者的比赛。这是一个非常有教育意义的过程。
我尝试了许多不同的方法,并试图将它们中的大多数纳入我最终选择的提交混合中。其中最值得注意的如下:
我也尝试了手动图像特征,但当我开始添加神经网络 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 似乎真的很擅长这一点。