🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#,Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用,熟悉DICOM医学影像及DICOM协议,业余时间自学JavaScript,Vue,qt,python等,具备多种混合语言开发能力。撰写博客分享知识,致力于帮助编程爱好者共同进步。欢迎关注、交流及合作,提供技术支持与解决方案。\\n技术合作请加本人wx(注明来自csdn):xt20160813
机器学习实践:使用 scikit-learn 实现 Kaggle 胸部 X 光图像分类任务
本文将详细讲解如何使用 Python 的 scikit-learn 库完成 Kaggle 上的 Chest X-Ray Images (Pneumonia) 数据集分类任务,聚焦于区分正常和肺炎的胸部 X 光图像。文章涵盖数据集获取、数据预处理、特征提取、决策树模型构建与优化、模型评估、结果可视化等内容。本实践与之前的乳腺癌数据集和乳腺组织病理学图像分类任务形成对比,展示 scikit-learn 在不同医学影像场景中的应用。
一、背景介绍
1.1 Kaggle 胸部 X 光图像分类任务
Chest X-Ray Images (Pneumonia) 数据集是一个经典的医学影像二分类任务,用于检测胸部 X 光图像是否显示肺炎迹象。数据集由广州医科大学提供,广泛用于研究自动化肺炎诊断。
- 数据集来源:Kaggle 上的 Chest X-Ray Images (Pneumonia)
- 样本数量:
- 训练集:5,216 张图像(1,341 正常,3,875 肺炎)
- 验证集:16 张图像
- 测试集:624 张图像
- 任务:二分类(正常 vs. 肺炎)
- 挑战:
- 类不平衡(肺炎样本多于正常样本)
- 图像分辨率较高(通常 1024×768 或更高)
- 复杂的肺部纹理和病灶特征
1.2 任务目标
使用 scikit-learn 的决策树分类器,结合图像特征提取技术,对胸部 X 光图像进行分类,评估模型性能,并优化模型以提高预测准确率。
1.3 工具与环境
- 编程语言:Python 3.x
- 主要库:
- scikit-learn:机器学习建模
- pandas、numpy:数据处理
- OpenCV、scikit-image:图像处理与特征提取
- matplotlib、seaborn:可视化
- 数据集获取:从 Kaggle 下载数据集(需注册 Kaggle 账户并获取 API 密钥)
二、数据获取与预处理
2.1 数据集下载
通过 Kaggle API 下载:
pip install kaggle
kaggle datasets download -d paultimothymooney/chest-xray-pneumonia
unzip chest-xray-pneumonia.zip -d chest_xray
数据集结构:
- 包含 train、val 和 test 三个文件夹
- 每个文件夹内有 NORMAL 和 PNEUMONIA 子文件夹,存放 .jpeg 图像
2.2 数据预处理
由于数据集图像分辨率较高且数量较多,直接处理所有图像可能超出计算资源,因此我们对图像进行降采样并随机选择部分图像进行实验。
代码示例:加载和预处理图像
import os
import cv2
import numpy as np
from glob import glob
def load_images(data_dir, sample_size=1000, resize_shape=(64, 64)):
\”\”\”
加载并预处理图像数据
:param data_dir: 数据集根目录(train 目录)
:param sample_size: 采样图像数量
:param resize_shape: 调整后的图像尺寸
:return: 图像数据和标签
\”\”\”
images = []
labels = []
# 获取正常和肺炎样本路径
normal_paths = glob(os.path.join(data_dir, \’NORMAL\’, \’*.jpeg\’))
pneumonia_paths = glob(os.path.join(data_dir, \’PNEUMONIA\’, \’*.jpeg\’))
# 随机采样(考虑类不平衡,保持比例)
np.random.seed(42)
normal_sample_size = int(sample_size * 0.25) # 正常样本约占 25%
pneumonia_sample_size = sample_size – normal_sample_size
normal_paths = np.random.choice(normal_paths, normal_sample_size, replace=False)
pneumonia_paths = np.random.choice(pneumonia_paths, pneumonia_sample_size, replace=False)
# 加载并调整图像大小
for path in normal_paths:
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE) # 灰度图像
img = cv2.resize(img, resize_shape) # 调整大小以减少计算量
images.append(img)
labels.append(0) # 正常
for path in pneumonia_paths:
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, resize_shape)
images.append(img)
labels.append(1) # 肺炎
return np.array(images), np.array(labels)
# 示例:加载 1000 张图像
data_dir = \’chest_xray/train\’
X_images, y = load_images(data_dir, sample_size=1000)
print(f\’Loaded {
len(X_images)} images with shape {
X_images.shape}\’)
输出示例:
Loaded 1000 images with shape (1000, 64, 64)
注释:
- 使用灰度图像以减少数据维度(单通道 vs. RGB 三通道)。
- 将图像调整为 64×64 像素以降低计算复杂度。
- 采样时考虑类不平衡,保持正常和肺炎样本的比例。
2.3 特征提取
直接使用原始像素(64×64=4096 维)会导致维数灾难,因此提取低维特征。常用的特征包括:
- 灰度直方图:描述图像的灰度分布
- 灰度共生矩阵(GLCM):提取纹理特征
- HOG(方向梯度直方图):捕捉肺部边缘和结构信息
代码示例:提取特征
from skimage.feature import graycomatrix, graycoprops, hog
def extract_features(image):
\”\”\”
从图像中提取灰度直方图、GLCM 和 HOG 特征
:param image: 输入灰度图像
:return: 特征向量
\”\”\”
# 1. 灰度直方图
hist = cv2.calcHist([image], [0], None, [16], [0, 256]).flatten()
# 2. GLCM 纹理特征
image_uint8 = image.astype(np.uint8)
glcm = graycomatrix(image_uint8, distances=[1], angles=[0], levels=256, symmetric=True, normed=True)
glcm_features = [
graycoprops(glcm, \’contrast\’)[0, 0],
graycoprops(glcm, \’dissimilarity\’)[0, 0],
graycoprops(glcm, \’homogeneity\’)[0, 0],
graycoprops(glcm, \’energy\’)[0, 0],
graycoprops(glcm, \’correlation\’)[0
评论前必须登录!
注册