Tutoriel Sur La Prédiction De Classification Par Apprentissage Automatique Des Données De Diagnostic Du Cancer Du Sein
1. Présentation du didacticiel
Présentation de l'outil/logiciel
- Outils de base: Langage R (plateforme de calcul statistique et d'apprentissage automatique) et bibliothèques clés
- Informatique:
tidyverse
(Incluredplyr
Manipulation de données,ggplot2
visualisation, etc.) - Outils de modélisation :
caret
(Processus de modélisation unifié),glmnet
(Régression logistique régularisée),ranger
(Forêt aléatoire efficace),class
(Prise en charge de l'algorithme de base KNN) - Outils de visualisation :
corrplot
(Carte thermique de corrélation),GGally
(Visualisation de données multivariées)
- Informatique:
- Contexte de développement:Sur la base de l'ensemble de données de diagnostic du cancer du sein du Wisconsin (WDBC), cet article démontre pleinement l'ensemble du processus d'apprentissage automatique pour les problèmes de classification binaire (du prétraitement des données au déploiement et à l'évaluation du modèle).
Objectifs d'apprentissage
- Maîtriser le processus de prétraitement standardisé des ensembles de données médicales (y compris la suppression des fonctionnalités redondantes, le filtrage des fonctionnalités à forte corrélation, le fractionnement et la normalisation des données).
- Maîtriser la construction de trois modèles de classification classiques : la régression logistique régularisée (glmnet), la forêt aléatoire (y compris la mise en œuvre efficace du ranger) et le KNN, et comprendre leurs scénarios applicables.
- Générez et interprétez les résultats de visualisation de base tels que les cartes thermiques de corrélation des fonctionnalités, les graphiques de contribution de la variance des composants principaux, les graphiques de comparaison des performances du modèle et les graphiques de classement de l'importance des fonctionnalités.
- Identifier les principales caractéristiques du diagnostic du cancer du sein (telles que
area_worst
,perimeter_worst
) et sa signification clinique.
2. Quelques préparatifs préliminaires (peuvent être clonés via le tutoriel publié par openbayes)
Description du fichier principal
- Ensemble de données:
data.csv
(569 échantillons, 30 caractéristiques nucléaires, étiquetés comme bénins (B)/malins (M), y comprisid
(numéro d'échantillon),diagnosis
(résultats diagnostiques) et 30 caractéristiques morphologiques). - Fichiers de code: Contient un script R complet pour le chargement des données → prétraitement → EDA → ingénierie des fonctionnalités → modélisation → évaluation (peut être exécuté directement, le chemin des données doit être remplacé).
- Liste des bibliothèques de dépendances(Commande d'installation) :
install.packages(c("tidyverse", "caret", "ranger", "corrplot", "GGally", "glmnet"))
Processus techniques clés
- Prétraitement des données: Charger les données → supprimer les colonnes redondantes (telles que
X
,id
) → Conversion du type d'étiquette (factorisation) → Vérification des valeurs manquantes. - Ingénierie des fonctionnalités: Calculer la matrice de corrélation des caractéristiques → Filtrer les caractéristiques hautement corrélées (seuil 0,9) → Analyse en composantes principales (ACP) réduction de la dimensionnalité et visualisation.
- Processus de modélisation:Répartition de l'ensemble de données (ensemble d'entraînement 8:2/ensemble de test) → Réglage des paramètres de validation croisée 10 fois → Formation parallèle de trois modèles → Évaluation de la matrice de confusion et des indicateurs de performance.
- Indicateurs d'évaluation:Précision, aire sous la courbe ROC (AUC), sensibilité (sensibilité, taux de détection maligne), spécificité (spécificité, taux de détection bénigne).
3. Étapes pratiques de l'opération
Configuration de l'environnement
- Installer R (Télécharger depuis le site officiel) et RStudio (IDE recommandé,Télécharger depuis le site officiel).
- Installez les bibliothèques dépendantes (voir « Liste des bibliothèques dépendantes » ci-dessus).
Chargement et prétraitement des données
# 加载库 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))
Analyse exploratoire des données (EDA)
Objectifs fondamentaux: Comprendre la distribution et la corrélation des caractéristiques et identifier les problèmes de multicolinéarité.
library(corrplot) # 相关性热图工具 计算特征相关性矩阵(排除标签列) data_corr <- cor(data %>% select(-diagnosis)) 绘制聚类排序的相关性热图(便于识别高相关特征群)
corrplot(data_corr, order = "hclust", tl.cex = 0.6, addrect = 8)
Interprétation des résultats:
- rayon(
radius
),périmètre(perimeter
),zone(area
) et d'autres caractéristiques ont une corrélation supérieure à 0,9, indiquant une multicolinéarité sérieuse et nécessitant un filtrage des caractéristiques pour supprimer la redondance.
Analyse en composantes principales (ACP)
Objectifs fondamentaux:Simplifiez la structure des données en réduisant la dimensionnalité, conservez les informations clés et visualisez-les.
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()
Interprétation des résultats:La variance expliquée cumulative des trois premières composantes principales est d'environ 70%-80%, ce qui peut être utilisé pour simplifier le modèle.
Étape 4 : Visualisation de l’association entre les composantes principales et les étiquettes de diagnostic
# 提取前 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"))
Interprétation des résultats:La distribution des échantillons malins (M) et bénins (B) sur les trois premières composantes principales est significativement différente, ce qui indique que l'ACP conserve efficacement les informations de classification.
Formation de modèle
Division de l'ensemble de données (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. Régression logistique régularisée (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. Forêt aléatoire (deux implémentations)
Méthode 1 :ranger
Paquet (implémentation efficace)
library(ranger) # 快速随机森林工具
model_rf_ranger <- ranger(
diagnosis ~ .,
data = data_training,
probability = TRUE, # 输出概率
importance = "impurity", # 计算特征重要性(不纯度)
num.trees = 500 # 500 棵决策树
)
Méthode 2 :caret
Paquet intégré rf
(pour la validation croisée)
model_rf_caret <- train(
diagnosis ~ .,
data = data_training,
method = "rf", # 传统随机森林
metric = "ROC",
trControl = data_control,
ntree = 500 # 500 棵决策树
)
3. KNN (K voisins les plus proches)
# 训练模型(优化邻居数 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 表现")
Prédiction et évaluation du modèle
1. Résultats de prédiction et matrice de confusion
Prenons l’exemple de la régression logistique:
# 测试集预测 prediction_glmnet <- predict(model_glmnet, data_testing) 生成混淆矩阵(评估分类准确性)
cm_glmnet <- confusionMatrix(prediction_glmnet, data_testing$diagnosis, positive = "M")
cm_glmnet # 输出准确率、灵敏度、特异度等指标
Visualisation de la matrice de confusion:
# 转换为数据框用于绘图 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. Analyse de l'importance des fonctionnalités
Importance des fonctionnalités de la forêt aléatoire:
# 提取前 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()
Principales conclusions:area_worst
(surface tumorale maximale), perimeter_worst
(La circonférence maximale de la tumeur) est la caractéristique principale permettant de distinguer les tumeurs bénignes et malignes, ce qui est cohérent avec la cognition clinique.
IV. Comparaison des modèles et interprétation des résultats
Comparaison des performances multi-modèles
# 汇总所有模型 model_list <- list( 逻辑回归 = model_glmnet, 随机森林 = model_rf_caret, KNN = model_knn ) 提取交叉验证结果 results <- resamples(model_list) 输出性能指标(ROC 、灵敏度、特异度)
summary(results)
Comparaison visuelle:
# 箱线图:展示各模型 ROC 分布 bwplot(results, metric = "ROC", main = "模型 ROC 性能对比(10 折交叉验证)") 点图:带 95% 置信区间的性能指标
dotplot(results, metric = c("ROC", "Sens", "Spec"), main = "模型性能指标对比")
Interprétation des résultats:
- La régression logistique a donné les meilleurs résultats (ROC = 0,993, sensibilité = 0,989) et s'est avérée appropriée comme modèle de base.
- Les forêts aléatoires fonctionnent de manière proche de la régression logistique, mais à un coût de calcul plus élevé.
- Le KNN présente une spécificité légèrement inférieure (0,888) et un taux de classification erronée légèrement supérieur pour les échantillons bénins.
5. Opérations avancées
Optimisation des paramètres
- Réglage de forêt aléatoire(optimisation
mtry
paramètres, c'est-à-dire le nombre de fonctionnalités par division) :
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
)
- Modèle étendu: Ajouter une machine à vecteurs de support (SVM)
model_svm <- train(
diagnosis ~ .,
data = data_training,
method = "svmRadial", # 径向核 SVM
metric = "ROC",
trControl = data_control
)
VI. Annexe
Table de recherche rapide du code commun
Fonction | Exemple de code |
---|---|
Lecture des données | read.csv("data.csv") |
Carte thermique de corrélation | corrplot(cor(data), order = "hclust") |
Paramètre de validation croisée 10 fois | trainControl(method = "cv", number = 10) |
Calcul de la matrice de confusion | confusionMatrix(pred, actual) |
Réduction de la dimensionnalité PCA | prcomp(data, scale = TRUE) |
Dépannage des problèmes courants
- Signaler une erreur
could not find function "corrplot"
→ Solution : Installercorrplot
Sac(install.packages("corrplot")
). - Erreur de dimension de fonctionnalité → Vérifiez si elle est manquante
select(-id, -diagnosis)
Étapes (à l'exclusion des colonnes non fonctionnelles). - La formation du modèle est lente → réduire
ntree
(nombre d'arbres forestiers aléatoires) outuneLength
(nombre de paramètres candidats).
Grâce à ce didacticiel, vous pouvez maîtriser le processus d'apprentissage automatique des problèmes de classification binaire médicale, vous concentrer sur la compréhension de la logique de base du filtrage des fonctionnalités, du réglage du modèle et de la visualisation des résultats, et fournir une référence pour la modélisation d'autres diagnostics de maladies.