Automatic Scoring of Multiple Semantic Attributes With Multi-Task Feature Leverage: A Study on Pu...

本文介绍了一种多任务学习方法,用于量化CT图像中肺结节的9个语义特征,包括结节的坚固程度、形状的毛刺程度等。通过深度学习模型和手工特征,结合LIDC数据集,实验表明该方法的预测评分更接近放射科医生的评分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文连接:https://ieeexplore.ieee.org/document/7745891/citations

摘要

计算机和语义特征之间的间隙是制约临床应用计算机辅助诊断性能的主要因素之一。为了架起这座桥梁,我们开发了三个多任务学习方法(MLT):利用堆叠去噪自编码器和卷积神经网络的深度学习模型衍生的异构计算特征,手工生成的Haar-like和HOG特征,CT图像中肺结节的9个语义特征描述符。我们认为“细刺状”、“纹理”和“边缘”等语义特征之间可能存在一定的关系,可以使用MTL进行探索。LIDC数据集具有丰富的标注信息,很适合这项研究。实验结果表明,与单任务的LASSO和可伸缩网络的回归方法相比,三种MTL方案的预测语义评分更接近于放射科医生的评分。


9个语义特征
  1. 结节的坚固程度
  2. 人类检测结节的难易程度
  3. 结节形状的毛刺程度
  4. 结节形状的圆度
  5. 结节的钙化模式
  6. 结节边缘的定义程度
  7. 结节为恶性肿瘤的可能性
  8. 结节形状的分叶程度
  9. 结节构成类型

方法流程图
7239122-0b636f1dee73d473.png

需要解决的新问题

新CAD问题面临很大的挑战,可以主要概括为三个方面:

  1. 我们目标是开发一个自动评分模型来量化大多数语义特征的程度,因此,为每个语义特征的评分设计有效的低级图像特征可能比结节的离散三分法的特征提取问题更复杂。
  2. 切片的注释评级者之间存在的差异。在某些情况下,评分过程是主观的,并且高度依赖于评分者的经验,所以评级的变化是显著的。
  3. LIDC数据集中胸部CT扫描切片厚度的变化。由于z方向和x/y方向各向一行分辨率的不同,对纯3D图像特征的计算提出了挑战。

为了解决三个问题,提出了利用多任务学习框架的方法:
尽可能多的计算异构特征。使用SDAE提取一般特征(不需要标签),使用CNN提取针对性强的特征,将这些特征和低级的Harr和HOG特征结合在一起。同时利用MTL进一步探索9个语义特征之间的关系。为避开切片厚度的变化,实现了基于切片的方案,也就是回归模型的训练是用二维切片ROIs 单元进行的,测试阶段通过平均来自组合式切片ROIs的分数来获得肺结节的最终评分。


贡献

该论文的贡献可以概括为三个方面:

  1. 首先,提出了一种新的CADa方案,对CT图像中描述肺结节的9个语义特征进行定量评估。
  2. 提出了一种MTL方案,以有效地弥合计算特征与多个临床语义特征之间的差距。
  3. 异构计算计算特征与MTL方案之间的有效协同的新颖性。

方法

使用神经元生成特征

  1. 堆叠去噪自编码器
    堆叠自编码器(SAE)是一种深度学习模型,通过非监督和监督训练两个阶段来实现。在无监督训练阶段,SAE体系结构是堆叠一个由一个输入层和一个隐藏层组成的两层自编码器来构建的。自编码器由编码器和解码器两部分组成,可以通过寻找合适的编码器和解码器啦实现重构误差的最小化。在没有数据标签的情况下,进行无监督的SDAE训练,因此,其提取的特征对所有语义特征具有通用性。
  2. 卷积神经网络
    CNN模型的训练通常是在监督下进行的。针对9个语义特征使用了9个CNN模型,获得了针对于特定任务的计算特征。对于每一个CNN,将每个语义描述作为一个单独的类,作为分类问题进行训练。

手动生成特征

  1. 手动Haar-like特征
    通过简单的逐块计算来表征低级图像的外观和上下文信息。结节的外观和纹理线索可以通过单块和成对块的Haar-like特征量化。
  2. 手动HOG特征
    HOG使用局部方向梯度直方图描述感兴趣对象形状的一种低级描述符。HOG特征可以用来帮助描述几个形状语义特征。

总结

为了得到计算机术语和医学语义特征的映射关系。使用CNN、SDEA、Haar-like和HOG产生一个异构特征集合,针对医生评分得到的9个语义特征,使用多任务线性回归和随机森林回归产生特征和特定语义之间的最佳映射关系。

<think>嗯,用户问的是关于UserWarning: One or more of the test scores are non-finite的问题。首先,我需要理解这个警告出现的场景。通常在机器学习或数据分析中,使用交叉验证时,模型评估的分数出现NaN(非数字)值,就会触发这个警告。那为什么会发生这种情况呢? 可能的原因有几个。首先,最常见的是数据中存在缺失值(NaN或infinity)。比如数据预处理的时候没有处理干净,或者某些特征在划分训练集和测试集后,测试集里出现了训练时没见过的类别,导致编码错误,生成NaN。这时候模型在预测时就会出问题,分数计算失败。 其次,模型本身的问题。比如,在训练过程中出现数值不稳定,比如除零错误,或者某些算法比如逻辑回归,当数据没有归一化,导致计算时溢出,得到infinity,这时候评估指标如准确率、F1-score就可能变成NaN。另外,像SVM如果参数设置不当,比如C值过小,也可能导致无法收敛,产生异常值。 第三个可能是评估指标的问题。比如某些指标在特定情况下无法计算,像当测试集中的所有样本都属于同一类别时,F1-score的分母可能为零,导致除以零的错误,结果就是NaN。另外,自定义的评估函数如果有bug,也可能返回无效值。 那如何解决这个问题呢?首先检查数据预处理。确保处理了缺失值,可以用填充或删除的方法。检查是否有无限大的值,可以用np.isfinite检查数组。对于分类问题,确保测试集的分层正确,特别是在使用分层交叉验证时,避免某些类别在测试集中不存在,导致编码问题。 然后是模型配置。检查模型参数是否合理,比如正则化强度,学习率等。对于容易数值不稳定的模型,尝试数据标准化或归一化。添加异常值处理,比如在训练前过滤异常样本,或者使用鲁棒性更强的模型。 接下来检查评估指标。确认选择的指标是否适合当前任务,比如在类别极度不平衡时,使用准确率可能不合适。对于可能除零的指标,可以添加平滑项,比如在分母上加一个很小的数epsilon。如果是自定义评估函数,仔细检查代码逻辑,确保没有错误。 调试步骤的话,可以先用简单的模型(如线性回归、逻辑回归)测试,看问题是否依然存在。逐步添加数据预处理步骤,定位问题出现的环节。在交叉验证循环中加入打印语句,检查每次迭代的数据和预测结果,找出哪一次迭代出现NaN,进一步分析具体原因。 举个例子,比如在使用随机森林时,如果数据中存在缺失值,可能不会报错,但某些实现可能在计算指标时出错。或者在使用梯度提升树时,学习率太高导致预测值溢出,变成inf,进而使得评估分数无效。 总结来说,这个警告提示在模型评估过程中出现了无效的分数,需要从数据、模型、评估指标三个方面排查,逐步调试,找到导致NaN的具体原因并解决。</think>当你在机器学习或数据分析过程中遇到 `UserWarning: One-Or-More of the test scores are non-finite: [nan nan ... nan]` 警告时,通常意味着模型在交叉验证或评估时出现了无法计算的分数(例如 `NaN` 或 `infinity`)。以下是逐步分析和解决方法: --- ### **1. 根本原因** #### **(1) 数据问题** - **缺失值未处理**:数据中存在 `NaN` 或 `infinity` 值,但未正确填充或删除。 - **类别标签不平衡**:在分类任务中,某些交叉验证的测试集可能只包含单一类别(如全部是正类或负类),导致某些评估指标(如 `F1-score`)的分母为零。 - **特征工程错误**:例如,测试集中出现了训练集中未见的类别(如独热编码时新类别未处理),导致生成 `NaN`。 #### **(2) 模型问题** - **数值不稳定**:例如: - 模型参数导致计算溢出(如梯度爆炸、除零错误)。 - 未标准化数据时,某些模型(如线性回归、SVM)可能因数值过大产生 `infinity`。 - **超参数配置错误**:例如正则化强度(`alpha`、`C`)过小,导致权重过大。 #### **(3) 评估指标问题** - 自定义评估函数存在逻辑错误(如除以零)。 - 某些指标(如 `R2-score`)在数据方差为零时返回 `NaN`。 --- ### **2. 解决步骤** #### **步骤 1:检查数据预处理** - **处理缺失值**: ```python # 检查数据中是否有 NaN 或 infinity import numpy as np print("NaN in data:", np.isnan(X).any()) print("Infinity in data:", np.isinf(X).any()) # 填充缺失值(示例) from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy="mean") X = imputer.fit_transform(X) ``` - **处理分类特征**: - 对测试集中出现的新类别,使用 `handle_unknown="ignore"`(如 `OneHotEncoder`)。 #### **步骤 2:验证模型稳定性** - **添加数据标准化**: ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) ``` - **调整超参数**: - 增加正则化强度(如 `alpha=1e-3`)。 - 对树模型限制最大深度(如 `max_depth=5`)。 #### **步骤 3:检查评估指标** - **避免不兼容的指标**: ```python # 例如:在类别不平衡时使用 accuracy 可能不可靠 from sklearn.metrics import make_scorer, f1_score scorer = make_scorer(f1_score, average="micro") # 改用微平均 ``` - **自定义评估函数时添加异常处理**: ```python def custom_score(y_true, y_pred): try: # 计算指标 return score except: return np.nan # 返回 NaN 或默认值 ``` #### **步骤 4:交叉验证调试** - **逐步缩小数据范围**: ```python # 使用部分数据测试 X_subset = X[:100] y_subset = y[:100] model.fit(X_subset, y_subset) ``` - **打印中间结果**: ```python from sklearn.model_selection import cross_val_score scores = cross_val_score(model, X, y, cv=5) print("Cross-validation scores:", scores) # 定位具体出错的 fold ``` --- ### **3. 示例代码修复** 假设使用 `GridSearchCV` 时出现此警告: ```python from sklearn.model_selection import GridSearchCV from sklearn.linear_model import LogisticRegression # 修复:添加数据标准化并限制正则化强度 param_grid = {"C": [0.1, 1, 10]} model = LogisticRegression(max_iter=1000, solver="liblinear") grid = GridSearchCV(model, param_grid, scoring="f1") # 确保数据已处理 from sklearn.preprocessing import StandardScaler X_scaled = StandardScaler().fit_transform(X) grid.fit(X_scaled, y) ``` --- ### **4. 总结** | 问题方向 | 检查点 | 解决方法 | |----------------|--------------------------------|------------------------------| | **数据质量** | NaN/infinity、类别分布 | 填充缺失值、分层交叉验证 | | **模型稳定性** | 参数范围、标准化 | 调整超参数、标准化数据 | | **评估指标** | 指标定义、分母为零的可能性 | 改用鲁棒性指标、添加平滑项 | 通过逐步排查数据、模型和评估指标,可以定位并修复此警告。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值