返回列表

40th Place Solution for the ICR - Identifying Age-Related Conditions Competition

568. ICR - Identifying Age-Related Conditions | icr-identify-age-related-conditions

开始: 2023-05-11 结束: 2023-08-10 基因组学与生物信息 数据算法赛

ICR识别年龄相关条件竞赛第40名解决方案

作者: Davide Stenner
发布时间: 2023年8月18日

我非常惊讶自己在最终榜单上的排名,名次提升了3283位 :D

背景部分

方法概述

本次挑战的难点在于可用数据行数非常有限,这给建立合适的交叉验证方案带来了巨大挑战。

最终选择了基于Alpha列的分层抽样策略作为交叉验证方法。

我的解决方案核心采用了对比学习方法。选择对比学习的原因是能够通过生成大量模拟数据来弥补观测数据的稀缺性。

该方法很大程度借鉴了SetFit框架(文末附参考链接)。

使用的模型是LGBM,该模型从所有特征的绝对差值出发,判断两个特征是否属于同一类别。在计算绝对差值的初始特征基础上,还添加了以下特征:

  • number_zero:差值为零的特征百分比
  • mean_diff:绝对差值的平均值
  • std_diff:绝对差值的标准差
  • median_diff:绝对差值的中位数
  • diff_mean:所有初始值平均值的绝对差值
  • diff_std:所有初始值标准差的绝对差值
  • diff_median:所有初始值中位数的绝对差值

提交细节

模型训练时,正负样本对按1:5比例采样(类别0 vs 类别1)以保持数据平衡。每个观测值会从同类和异类中随机选取若干样本,并移除重复组合。

采用AUC指标确定最佳训练轮数。

推理阶段执行以下后处理:

  • 预测新观测属于类别0的概率(通过比较所有类别0样本)
  • 计算其属于类别1的概率(通过比较所有类别1样本)

最终概率计算公式:prob = prob_1 / (prob_0 + prob_1),其中prob_0和prob_1分别是前两步概率的平均值。这样每个观测需要执行617次预测。

以下是新观测与训练集比对的核心函数:

def get_retrieval_dataset(
        test: pd.DataFrame, target_example: pd.DataFrame, 
        feature_list: list
    ) -> Tuple[pd.DataFrame, list]:

    test_shape = test.shape[0]
    target_example_shape = target_example.shape[0]

    test_x = test[feature_list].to_numpy('float32')

    target_example = np.concatenate(
        [
            target_example
            for _ in range(test_shape)
        ], axis=0
    )
    test_x = np.repeat(test_x, target_example_shape, axis=0)
    index_test = np.repeat(test.index.values, target_example_shape, axis=0)

    retrieval_dataset = fe_pipeline(
        dataset_1=target_example,
        dataset_2=test_x, feature_list=feature_list,
    )
    retrieval_dataset['rows'] = index_test

    return retrieval_dataset

未生效的方法

  • 神经网络度量学习(DNN和TabNet),无论使用余弦相似度、MSE还是对比损失等指标,都无法超越LGBM的交叉验证结果,极有可能是数据量极度有限所致
  • 在Alpha列上应用对比学习
  • 为每个训练观测值分配权重
同比赛其他方案