برنامج تعليمي حول التنبؤ بتصنيفات التعلم الآلي لمجموعة بيانات تشخيص سرطان الثدي
1. نظرة عامة على البرنامج التعليمي
مقدمة عن الأدوات/البرمجيات
- الأدوات الأساسية: لغة R (الحوسبة الإحصائية ومنصة التعلم الآلي) والمكتبات الرئيسية
- معالجة البيانات:
tidyverse
(يشملdplyr
معالجة البيانات،ggplot2
(التصور، وما إلى ذلك) - أدوات النمذجة:
caret
(عملية النمذجة الموحدة)،glmnet
(الانحدار اللوجستي المنظم)ranger
(الغابة العشوائية الفعالة)،class
(دعم خوارزمية KNN الأساسية) - أدوات التصور:
corrplot
(خريطة الحرارة الارتباطية)،GGally
(تصور البيانات المتعددة المتغيرات)
- معالجة البيانات:
- خلفية التطوير:استنادًا إلى مجموعة بيانات تشخيص سرطان الثدي في ولاية ويسكونسن (WDBC)، يوضح هذا البحث بشكل كامل عملية التعلم الآلي بأكملها لمشاكل التصنيف الثنائي (من معالجة البيانات مسبقًا إلى نشر النموذج وتقييمه).
أهداف التعلم
- إتقان عملية المعالجة المسبقة الموحدة لمجموعات البيانات الطبية (بما في ذلك إزالة الميزات المكررة، وفحص ميزات الارتباط العالي، وتقسيم البيانات وتوحيدها).
- - إتقان بناء ثلاثة نماذج تصنيف كلاسيكية: الانحدار اللوجستي المنظم (glmnet)، والغابة العشوائية (بما في ذلك تنفيذ الحارس الفعال)، وKNN، وفهم السيناريوهات القابلة للتطبيق.
- إنشاء وتفسير نتائج التصور الأساسية مثل خرائط الحرارة لارتباط الميزات، ومخططات مساهمة تباين المكونات الأساسية، ومخططات مقارنة أداء النموذج، ومخططات تصنيف أهمية الميزات.
- تحديد السمات الرئيسية لتشخيص سرطان الثدي (مثل
area_worst
،perimeter_worst
) وأهميتها السريرية.
2. بعض الاستعدادات الأولية (يمكن استنساخها من خلال البرنامج التعليمي الذي أصدرته openbayes)
وصف الملف الأساسي
- مجموعة البيانات:
data.csv
(569 عينة، 30 سمة نووية، تم تصنيفها على أنها حميدة (ب)/خبيثة (م)، بما في ذلكid
(رقم العينة)diagnosis
(النتائج التشخيصية) و 30 سمة مورفولوجية). - ملفات التعليمات البرمجية:يحتوي على نص R كامل لتحميل البيانات → المعالجة المسبقة → EDA → هندسة الميزات → النمذجة → التقييم (يمكن تشغيله مباشرة، يجب استبدال مسار البيانات).
- قائمة مكتبة التبعية(أمر التثبيت):
install.packages(c("tidyverse", "caret", "ranger", "corrplot", "GGally", "glmnet"))
العمليات التقنية الرئيسية
- معالجة البيانات مسبقًا:تحميل البيانات → إزالة الأعمدة المكررة (مثل
X
،id
) → تحويل نوع العلامة (التحليل إلى عوامل) → التحقق من القيمة المفقودة. - هندسة الميزات:احسب مصفوفة ارتباط الميزة → عرض الميزات المرتبطة بشكل كبير (العتبة 0.9) → تحليل المكونات الأساسية (PCA) وتقليل الأبعاد وتصورها.
- عملية النمذجة:تقسيم مجموعة البيانات (8:2 مجموعة تدريب/مجموعة اختبار) → ضبط معلمات التحقق المتبادل 10 أضعاف → التدريب المتوازي لثلاثة نماذج → تقييم مصفوفة الارتباك ومؤشر الأداء.
- مؤشرات التقييم:الدقة، المساحة تحت منحنى ROC (AUC)، الحساسية (الحساسية، معدل الكشف الخبيث)، الخصوصية (الخصوصية، معدل الكشف الحميد).
3. خطوات التشغيل العملي
إعداد البيئة
- تثبيت R (التحميل من الموقع الرسمي) وRStudio (IDE الموصى به،التحميل من الموقع الرسمي).
- قم بتثبيت المكتبات التابعة (راجع "قائمة مكتبات التبعية" أعلاه).
تحميل البيانات ومعالجتها المسبقة
# 加载库 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()
تفسير النتائج:التباين التراكمي المفسر للمكونات الرئيسية الثلاثة الأولى هو حوالي 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"))
تفسير النتائج:يختلف توزيع العينات الخبيثة (M) والحميدة (B) على المكونات الرئيسية الثلاثة الأولى بشكل كبير، مما يشير إلى أن تحليل المكونات الرئيسية يحتفظ بمعلومات التصنيف بشكل فعال.
التدريب النموذجي
تقسيم مجموعة البيانات (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. الغابة العشوائية (تنفيذان)
الطريقة الأولى:ranger
الحزمة (التنفيذ الفعال)
library(ranger) # 快速随机森林工具
model_rf_ranger <- ranger(
diagnosis ~ .,
data = data_training,
probability = TRUE, # 输出概率
importance = "impurity", # 计算特征重要性(不纯度)
num.trees = 500 # 500 棵决策树
)
الطريقة الثانية:caret
الحزمة المتكاملة rf
(للتحقق المتبادل)
model_rf_caret <- train(
diagnosis ~ .,
data = data_training,
method = "rf", # 传统随机森林
metric = "ROC",
trControl = data_control,
ntree = 500 # 500 棵决策树
)
3. KNN (أقرب الجيران)
# 训练模型(优化邻居数 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
(المحيط الأقصى للورم) هو السمة الأساسية للتمييز بين الأورام الحميدة والخبيثة، وهو ما يتفق مع الإدراك السريري.
رابعًا: مقارنة النماذج وتفسير النتائج
مقارنة أداء النماذج المتعددة
# 汇总所有模型 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. العمليات المتقدمة
تحسين المعلمات
- ضبط الغابة العشوائية(تحسين
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
)
- النموذج الموسع:إضافة آلة دعم المتجهات (SVM)
model_svm <- train(
diagnosis ~ .,
data = data_training,
method = "svmRadial", # 径向核 SVM
metric = "ROC",
trControl = data_control
)
السادس. الملحق
جدول البحث السريع للكود المشترك
وظيفة | عينة الكود |
---|---|
قراءة البيانات | read.csv("data.csv") |
خريطة حرارية للارتباط | corrplot(cor(data), order = "hclust") |
إعداد التحقق المتبادل 10 أضعاف | trainControl(method = "cv", number = 10) |
حساب مصفوفة الارتباك | confusionMatrix(pred, actual) |
تخفيض أبعاد PCA | prcomp(data, scale = TRUE) |
استكشاف الأخطاء وإصلاحها للمشاكل الشائعة
- الإبلاغ عن خطأ
could not find function "corrplot"
→ الحل: التثبيتcorrplot
شنطة(install.packages("corrplot")
). - خطأ في أبعاد الميزة → تحقق مما إذا كانت مفقودة
select(-id, -diagnosis)
الخطوات (باستثناء الأعمدة غير المميزة). - التدريب النموذجي بطيء → تقليل
ntree
(عدد أشجار الغابات العشوائية) أوtuneLength
(عدد مرشحي المعلمات).
من خلال هذا البرنامج التعليمي، يمكنك إتقان عملية التعلم الآلي لمشاكل التصنيف الثنائي الطبي، والتركيز على فهم المنطق الأساسي لفحص الميزات، وضبط النموذج وتصور النتائج، وتوفير مرجع لنمذجة تشخيص الأمراض الأخرى.