脑PET图像分析和疾病预测挑战赛---逻辑回归

目录

赛题背景

赛事任务

赛题数据集

评价标准

逻辑回归

结果与分析

总结


赛题背景

        脑PET全称为脑部正电子发射计算机断层显像(brain positron emission tomography PET),是反映脑部病变的基因、分子、代谢及功能状态的显像。它是利用正电子核素标记葡萄糖等人体代谢物作为显像剂,通过病灶对显像剂的摄取来反映其代谢变化,从而为临床提供疾病的生物代谢信息,为脑癫痫病、脑肿瘤、帕金森病、阿尔茨海默综合征等提供了有效的检测手段。可利用脑PET图像检测出轻度认知障碍病灶,并提前介入治疗,从而延缓发病,对后续患者康复治疗有着积极的意义。因此本赛题以轻度认知障碍为例对脑PET图像进行分析与疾病预测。

赛事任务

        为研究基于脑PET图像的疾病预测,本次大赛提供了海量脑PET数据集作为脑PET图像检测数据库的训练样本,参赛者需根据提供的样本构建模型,对轻度认知障碍进行分析和预测。

        脑PET图像检测数据库,记录了老年人受试志愿者的脑PET影像资料,其中包括确诊为轻度认知障碍(MCI)患者的脑部影像数据和健康人(NC)的脑部影像数据。

        被试者按医学诊断分为两类:

        NC:健康

        MCI:轻度认知障碍

赛题数据集

        本次大赛所用脑PET图像检测数据库,图像格式为nii(将要使用nibabel库来处理医学图像数据)

评价标准

        本次竞赛的评价标准采用F1_score,分数越高,效果越好。

逻辑回归

        总体流程图:

          逻辑回归Baseline代码如下:

import glob                # 获取文件路径
import numpy as np
import pandas as pd
import nibabel as nib      # 处理医学图像数据
from nibabel.viewers import OrthoSlicer3D    # 图像可视化
from collections import Counter              # 计数统计
from sklearn.linear_model import LogisticRegression # 导入逻辑回归模型

# 读取训练集与测试集的文件路径
train_path = glob.glob('./BrainPET/Train/*/*') # 索引Train目录下的二级目录
test_path = glob.glob('./BrainPET/Test/*')  # 索引Test目录下的一级目录


# 随机打乱训练集和测试集的顺序
np.random.shuffle(train_path)
np.random.shuffle(test_path)


# 对PET文件提取特征
def extract_feature(path):
    # 使用nibabel库加载PET神经图像数据
    img = nib.load(path)
    # 获取第一个通道的数据
    img = img.dataobj[:, :, :, 0]

    # 随机筛选其中的10个通道提取特征
    random_img = img[:, :, np.random.choice(range(img.shape[2]), 10)]

    # 对图片计算统计值
    feat = [
        (random_img != 0).sum(),               # 非零像素的数量
        (random_img == 0).sum(),               # 零像素的数量
        random_img.mean(),                     # 平均值
        random_img.std(),                      # 标准差
        len(np.where(random_img.mean(0))[0]),  # 在列方向上平均值不为零的数量
        len(np.where(random_img.mean(1))[0]),  # 在行方向上平均值不为零的数量
        random_img.mean(0).max(),              # 列方向上的最大平均值
        random_img.mean(1).max()               # 行方向上的最大平均值
    ]

    # 根据路径判断样本标签('NC'表示正常,'MCI'表示异常)
    if 'NC' in path:
        return feat + ['NC']
    else:
        return feat + ['MCI'] # 注意在提取测试集特征时最后一栏标签将全部默认为‘MCI'


# 对训练集进行30次特征提取,每次提取后的特征及其标签('NC'表示正常,'MCI'表示异常)被添加到train_feat列表中。
train_feat = []
for _ in range(30):
    for path in train_path:
        train_feat.append(extract_feature(path))

# 同理,对测试集进行30次特征提取
test_feat = []
for _ in range(30):
    for path in test_path:
        test_feat.append(extract_feature(path))


# 使用训练集的特征作为输入,训练集的类别作为输出,对逻辑回归模型进行训练。
m = LogisticRegression(max_iter=1000)
m.fit(
    np.array(train_feat)[:, :-1].astype(np.float32),  # 特征
    np.array(train_feat)[:, -1]            # 标签
)

# 对测试集进行预测并进行转置操作,使得每个样本有30次预测结果。
test_pred = m.predict(np.array(test_feat)[:, :-1].astype(np.float32)) # 不使用test_feat的最后一列数据
test_pred = test_pred.reshape(30, -1).T

# 对每个样本的30次预测结果进行投票,选出最多的类别作为该样本的最终预测类别,存储在test_pred_label列表中。
test_pred_label = [Counter(x).most_common(1)[0][0] for x in test_pred]


# 构造提交结果的DataFrame,其中包括样本ID和预测类别。
submit = pd.DataFrame(
    {
        'uuid': [int(x.split('/')[-1][:-4]) for x in test_path],  # 提取测试集文件名中的ID
        'label': test_pred_label                    # 预测的类别
    }
)


# 按照ID对结果排序并保存为CSV文件
submit = submit.sort_values(by='uuid')
submit.to_csv('submit1.csv', index=None)

结果与分析

        小试牛刀,第一次尝试可见分数较差,究其原因,主要是因为此处使用了机器学习种的逻辑回归,特征的选取基于主观意识,因此不同特征之间可能存在一定联系,不能证明所采用的特征具有充分的代表性,从而导致了评分较低。

总结

        由于本次赛题数据量较小,首先初步利用sklearn库的逻辑回归简单实现了Baseline方案,但由于人工构造提取的特征还仍待商榷,因此评分较差是情理之中的结果,接下来将尝试进行优化,并基于Pytorch框架搭建CNN网络,实现特征的自动提取,最后再对二者进行可解释性分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值