乳がん診断データセットの機械学習による分類予測に関するチュートリアル

1. チュートリアルの概要

ツール/ソフトウェアの紹介

  1. コアツール: R言語(統計計算および機械学習プラットフォーム)と主要ライブラリ
    • データ処理:tidyverse(含む dplyr データ操作、 ggplot2 可視化など)
    • モデリングツール:caret(統合モデリングプロセス) glmnet(正規化ロジスティック回帰) ranger(効率的なランダムフォレスト) class(KNN基本アルゴリズムのサポート)
    • 視覚化ツール:corrplot(相関ヒートマップ) GGally(多変量データ可視化)
  2. 開発背景:この論文では、ウィスコンシン乳がん診断データセット(WDBC)に基づいて、バイナリ分類問題に対する機械学習プロセス全体(データの前処理からモデルの展開と評価まで)を徹底的に示しています。

学習目標

  1. 医療データセットの標準化された前処理プロセス(冗長な特徴の除去、高相関の特徴のスクリーニング、データの分割と標準化を含む)を習得します。
  2. 正規化ロジスティック回帰 (glmnet)、ランダム フォレスト (効率的なレンジャー実装を含む)、KNN という 3 つの標準的な分類モデルの構築に習熟し、適用可能なシナリオを理解します。
  3. 特徴相関ヒートマップ、主成分分散寄与プロット、モデルパフォーマンス比較プロット、特徴重要度ランキングプロットなどの主要な視覚化結果を生成および解釈します。
  4. 乳がん診断の主な特徴(例えば area_worstperimeter_worst)とその臨床的意義。

2. 事前準備(openbayesが公開したチュートリアルからクローンできます)

コアファイルの説明

  1. データセット:data.csv(569サンプル、30の核の特徴、良性(B)/悪性(M)として分類、 id(サンプル番号)、 diagnosis(診断結果)および 30 の形態学的特徴)。
  2. コードファイル: データのロード → 前処理 → EDA → 特徴エンジニアリング → モデリング → 評価のための完全な R スクリプトが含まれています (直接実行できますが、データ パスを置き換える必要があります)。
  3. 依存ライブラリリスト(インストールコマンド):
install.packages(c("tidyverse", "caret", "ranger", "corrplot", "GGally", "glmnet"))

主要な技術プロセス

  1. データ前処理: データをロード → 冗長な列( Xid)→ラベルの型変換(因数分解)→欠損値チェック。
  2. 特徴エンジニアリング:特徴相関行列を計算 → 相関性の高い特徴をスクリーニング(しきい値 0.9) → 主成分分析(PCA)による次元削減と視覚化。
  3. モデリングプロセス:データセット分割(8:2 トレーニングセット/テストセット)→ 10 分割クロスバリデーションパラメータチューニング → 3 つのモデルの並列トレーニング → 混同行列とパフォーマンス指標の評価。
  4. 評価指標:精度、ROC曲線下面積(AUC)、感度(感度、悪性検出率)、特異度(特異度、良性検出率)。

3. 実際の操作手順

環境設定

  1. Rをインストール(公式サイトからダウンロード) と RStudio (推奨 IDE、公式サイトからダウンロード)。
  2. 依存ライブラリをインストールします (上記の「依存ライブラリ リスト」を参照)。

データの読み込みと前処理

# 加载库
library(tidyverse)  # 数据处理核心库
library(caret)      # 建模与评价工具

加载数据(替换为实际路径)
data <- read.csv("path/to/data.csv")  
预处理:移除冗余列(X 为索引列,id 为样本编号,均非特征)
data <- data %>% select(-X, -id)  
标签转换:将 diagnosis(B/M)转为因子类型(分类模型要求)
data$diagnosis <- as.factor(data$diagnosis)  
查看数据结构(确认特征类型与样本量)
str(data)  
检查缺失值(该数据集无缺失,实际场景可补充插补步骤)
colSums(is.na(data))

探索的データ分析(EDA)

中核目標: 特徴の分布と相関を理解し、多重共線性の問題を特定します。

library(corrplot)  # 相关性热图工具

计算特征相关性矩阵(排除标签列)
data_corr <- cor(data %>% select(-diagnosis))  
绘制聚类排序的相关性热图(便于识别高相关特征群)
corrplot(data_corr, order = "hclust", tl.cex = 0.6, addrect = 8)

結果の解釈:

  • 半径(radius)、周囲(perimeter)、エリア(area) とその他の特徴の相関は 0.9 を超えており、深刻な多重共線性を示しており、冗長性を除去するために特徴スクリーニングが必要です。

主成分分析 (PCA)

中核目標:次元を削減することでデータ構造を簡素化し、重要な情報を保持して視覚化します。

library(GGally)  # 多元可视化工具

步骤 1:移除高相关特征(阈值 0.9)
high_corr_indices <- findCorrelation(data_corr, cutoff = 0.9)  # 筛选高相关特征索引 
data2 <- data %>% select(-all_of(names(data)[high_corr_indices])) # 移除冗余特征 步骤 2:执行 PCA(需标准化与中心化) pca_data2 <- prcomp(data2, scale = TRUE, center = TRUE) 步骤 3:可视化方差贡献(确定核心主成分) explained_variance <- pca_data2$sdev^2 / sum(pca_data2$sdev^2) # 单个主成分方差占比
cumulative_variance <- cumsum(explained_variance) # 累积方差占比 variance_data <- data.frame(
PC = 1:length(explained_variance),
ExplainedVariance = explained_variance,
CumulativeVariance = cumulative_variance
)
ggplot(variance_data, aes(x = PC)) +
geom_bar(aes(y = ExplainedVariance), stat = "identity", fill = "skyblue", alpha = 0.7) +
geom_line(aes(y = CumulativeVariance), color = "red", size = 1) +
geom_point(aes(y = CumulativeVariance), color = "red") +
labs(
title = "主成分方差贡献图",
x = "主成分",
y = "方差解释比例"
) +
scale_y_continuous(sec.axis = sec_axis(~., name = "累积方差解释比例")) +
theme_minimal()

結果の解釈最初の 3 つの主成分の累積説明分散は約 70%-80% であり、これを使用してモデルを簡素化できます。

ステップ4:主成分と診断ラベルの関連の可視化

# 提取前 3 个主成分得分,关联诊断标签
pca_scores <- as.data.frame(pca_data2$x[, 1:3])  # 前 3 个主成分
pca_scores$diagnosis <- data$diagnosis  # 加入诊断标签

绘制散点矩阵(含相关性、密度分布)
ggpairs(
pca_scores,
columns = 1:3,
mapping = aes(color = diagnosis, fill = diagnosis),
upper = list(continuous = wrap("cor", size = 3)), # 上三角:相关性
lower = list(continuous = "points"), # 下三角:散点图
diag = list(continuous = wrap("densityDiag")) # 对角线:密度分布
) +
theme_minimal() +
scale_color_manual(values = c("B" = "salmon", "M" = "cyan3")) +
scale_fill_manual(values = c("B" = "salmon", "M" = "cyan3"))

結果の解釈最初の 3 つの主成分における悪性 (M) および良性 (B) サンプルの分布は大きく異なり、PCA が分類情報を効果的に保持していることを示しています。

モデルのトレーニング

データセットの分割(8:2)

set.seed(123)  # 固定随机种子,保证结果可复现

组合标签与处理后特征(便于建模)
data3 <- cbind(diagnosis = data$diagnosis, data2)  
按标签分层抽样(维持训练集/测试集类别比例一致)
data_sampling_index <- createDataPartition(data3$diagnosis, times = 1, p = 0.8, list = FALSE)
data_training <- data3[data_sampling_index, ] # 训练集(80%)
data_testing <- data3[-data_sampling_index, ] # 测试集(20%) 定义交叉验证策略(10 折交叉验证,计算分类概率与二分类指标)
data_control <- trainControl(
method = "cv",
number = 10,
classProbs = TRUE,
summaryFunction = twoClassSummary # 输出 ROC 、灵敏度、特异度
)

1. 正規化ロジスティック回帰(glmnet)

# 训练模型(带 L1/L2 正则化,自动调优参数)
model_glmnet <- train(
  diagnosis ~ ., 
  data = data_training, 
  method = "glmnet",  # 正则化逻辑回归
  metric = "ROC",  # 以 ROC 为优化目标
  preProcess = c("scale", "center"),  # 特征标准化
  tuneLength = 20,  # 20 组参数候选
  trControl = data_control
)

2. ランダムフォレスト(2つの実装)

方法1:ranger パッケージ(効率的な実装)

library(ranger)  # 快速随机森林工具

model_rf_ranger <- ranger(
diagnosis ~ .,
data = data_training,
probability = TRUE, # 输出概率
importance = "impurity", # 计算特征重要性(不纯度)
num.trees = 500 # 500 棵决策树
)

方法2:caret パッケージ統合 rf(クロス検証用)

model_rf_caret <- train(
  diagnosis ~ ., 
  data = data_training, 
  method = "rf",  # 传统随机森林
  metric = "ROC", 
  trControl = data_control,
  ntree = 500  # 500 棵决策树
)

3. KNN(K近傍法)

# 训练模型(优化邻居数 k)
model_knn <- train(
  diagnosis ~ ., 
  data = data_training, 
  method = "knn", 
  metric = "ROC", 
  preProcess = c("scale", "center"),  # KNN 对距离敏感,必须标准化
  trControl = data_control, 
  tuneLength = 31  # 测试 k= 1 到 31 的最优值
)

可视化不同 k 值的 ROC 表现(确定最优 k)
plot(model_knn, main = "KNN 模型不同邻居数的 ROC 表现")

モデルの予測と評価

1. 予測結果と混同行列

ロジスティック回帰を例に挙げる:

# 测试集预测
prediction_glmnet <- predict(model_glmnet, data_testing)

生成混淆矩阵(评估分类准确性)
cm_glmnet <- confusionMatrix(prediction_glmnet, data_testing$diagnosis, positive = "M")
cm_glmnet # 输出准确率、灵敏度、特异度等指标

混同行列の可視化:

# 转换为数据框用于绘图
cm_table <- as.table(cm_glmnet$table)
cm_df <- as.data.frame(cm_table)
colnames(cm_df) <- c("实际标签", "预测标签", "频数")

ggplot(cm_df, aes(x = 实际标签, y = 预测标签, fill = 频数)) +
geom_tile(color = "white") +
scale_fill_gradient(low = "lightblue", high = "blue") +
geom_text(aes(label = 频数), color = "black", size = 6) +
labs(title = "逻辑回归混淆矩阵", x = "实际诊断", y = "预测诊断") +
theme_minimal()

2. 特徴重要度分析

ランダムフォレストの特徴の重要度:

# 提取前 10 个重要特征
importance_rf <- model_rf_ranger$variable.importance  # ranger 模型结果
importance_df <- data.frame(
  特征 = names(importance_rf), 
  重要性 = importance_rf
) %>% arrange(desc(重要性)) %>% slice(1:10)  # 取前 10

可视化
ggplot(importance_df, aes(x = reorder(特征, 重要性), y = 重要性)) +
geom_bar(stat = "identity", fill = "skyblue") +
coord_flip() + # 横向条形图,便于阅读特征名
labs(title = "随机森林 Top10 重要特征", x = "特征", y = "重要性(不纯度下降)") +
theme_minimal()

主な調査結果:area_worst(最大腫瘍面積) perimeter_worst(腫瘍の最大周囲径)は良性腫瘍と悪性腫瘍を区別する中核的な特徴であり、臨床的認識と一致しています。

IV. モデルの比較と結果の解釈

複数モデルのパフォーマンス比較

# 汇总所有模型
model_list <- list(
  逻辑回归 = model_glmnet, 
  随机森林 = model_rf_caret, 
  KNN = model_knn
)

提取交叉验证结果
results <- resamples(model_list)
输出性能指标(ROC 、灵敏度、特异度)
summary(results)

視覚的な比較:

# 箱线图:展示各模型 ROC 分布
bwplot(results, metric = "ROC", main = "模型 ROC 性能对比(10 折交叉验证)")

点图:带 95% 置信区间的性能指标
dotplot(results, metric = c("ROC", "Sens", "Spec"), main = "模型性能指标对比")

結果の解釈:

  • ロジスティック回帰は最も優れたパフォーマンス (ROC = 0.993、感度 = 0.989) を示し、ベースライン モデルとして適していました。
  • ランダムフォレストはロジスティック回帰に近いパフォーマンスを発揮しますが、計算コストが高くなります。
  • KNN は、特異度 (0.888) がわずかに低く、良性サンプルの誤分類率がわずかに高くなっています。

5. 高度な操作

パラメータの最適化

  1. ランダムフォレストチューニング(最適化 mtry パラメータ(分割あたりの機能の数など):
model_rf_tuned <- train(
  diagnosis ~ ., 
  data = data_training, 
  method = "rf",
  metric = "ROC", 
  trControl = data_control,
  tuneGrid = expand.grid(mtry = seq(5, 15, 2))  # 测试 mtry=5,7,...,15
)
  1. 拡張モデル: サポートベクターマシン (SVM) を追加する
model_svm <- train(
  diagnosis ~ ., 
  data = data_training, 
  method = "svmRadial",  # 径向核 SVM
  metric = "ROC", 
  trControl = data_control
)

VI. 付録

共通コードのクイックルックアップテーブル

関数コードサンプル
データの読み取りread.csv("data.csv")
相関ヒートマップcorrplot(cor(data), order = "hclust")
10倍交差検証設定trainControl(method = "cv", number = 10)
混同行列の計算confusionMatrix(pred, actual)
PCA次元削減prcomp(data, scale = TRUE)

よくある問題のトラブルシューティング

  1. エラーを報告する could not find function "corrplot"→ 解決策: インストール corrplot バッグ(install.packages("corrplot"))。
  2. フィーチャ寸法エラー → 欠落していないか確認 select(-id, -diagnosis)ステップ(非特徴列を除く)。
  3. モデルのトレーニングが遅い → 削減 ntree(ランダムフォレストツリーの数)または tuneLength(パラメータ候補の数)。

このチュートリアルを通じて、医療のバイナリ分類問題の機械学習プロセスを習得し、特徴スクリーニング、モデル調整、結果の視覚化の中核ロジックを理解することに重点を置き、他の疾患診断のモデル化の参考資料を提供できます。