一、引言
乳腺癌被认为是全球最常见的女性恶性肿瘤之一,对患者和公共健康造成了巨大的负担。准确评估乳腺癌风险是预防、诊断和治疗该疾病的关键。然而,乳腺癌风险估计面临着一些挑战,如数据的限制性、模型的复杂性和准确性等。因此,发展一种准确且高效的乳腺癌风险评估方法具有重要意义。
本研究旨在探索无监督学习和关联规则的潜力,以改进乳腺癌风险评估方法。无监督学习在无需标记的数据集中识别潜在模式方面具有优势,而关联规则分析则可发现变量之间的关联和依赖关系[1]。基于这些方法,我们提出了一种新的乳腺癌风险评估模型。该模型可以从大规模数据集中挖掘隐藏的关联规则和特征,为个体提供个性化的风险评估结果。
二、无监督学习关联规则概述
2.1 无监督学习的基本概念和原理
无监督学习是一种机器学习方法,其目标是从未标记的数据中发现模式、结构和相似性,而无需预先定义的目标变量。相对于监督学习需要使用标记的数据进行训练,无监督学习更加灵活,适用于探索数据中的隐藏结构和关联关系。
在无监督学习中,常见的方法包括聚类、降维和异常检测。聚类算法根据数据点之间的相似性将它们分组到不同的类别中,从而帮助发现数据中的无标签模式。降维技术可以将高维数据映射到较低维的子空间,以帮助可视化和理解数据。异常检测则用于识别与正常模式不符的异常数据点。
2.2 关联规则挖掘及其在数据挖掘中的应用
关联规则挖掘是数据挖掘领域中的一项重要任务,用于发现数据集中项目之间的关联和依赖关系。关联规则通常采用"If-Then"的形式,例如"If A, Then B",它描述了两个或多个项目之间的关系。关联规则挖掘不仅仅可以应用于市场篮子分析、产品推荐和销售策略优化等领域,还具有在乳腺癌风险评估中发现相关特征的潜力。
关联规则挖掘的主要步骤包括支持度和置信度的计算、规则生成和规则评估。支持度衡量了规则在数据集中出现的频率,而置信度度量了规则的可靠性。通过设置支持度和置信度的阈值,可以选择出具有较高支持度和置信度的关联规则。这些规则可以帮助我们发现数据中的潜在关联和规律,为进一步的分析和决策提供有价值的信息。
通过结合无监督学习和关联规则挖掘,我们可以利用无监督学习来识别数据中的模式和结构,然后使用关联规则挖掘技术来揭示关联关系和依赖关系。这种整合的方法在乳腺癌风险评估中具有潜力,可以从大规模的数据集中提取有关乳腺癌风险因素的重要见解。
三、基于关联规则的风险评估
3.1 模型的核心思想和基本步骤
我们提出了一种基于关联规则的乳腺癌风险评估模型,旨在从大规模数据集中挖掘相关特征和风险因素,为个体提供个性化的风险评估结果。
该模型的核心思想是通过关联规则挖掘技术来发现患者基本特征和可能的乳腺癌相关因素之间的关联关系。这些关联规则将根据实际数据集中的支持度和置信度进行筛选,以保证规则的有效性和可靠性。
「模型的基本步骤包括」:
-
「数据收集和预处理」:从实际数据源中收集乳腺癌相关的患者数据,并对数据进行预处理,例如清洗、去除缺失值和异常值等,以确保数据的质量和一致性。 -
「特征选择」:在数据预处理后,我们需要进行特征选择以减少数据维度并提高模型的效果。常用的特征选择方法包括相关性分析、信息增益和卡方检验等。 -
「关联规则挖掘」:选择适当的关联规则挖掘算法,例如Apriori算法或FP-growth算法,来挖掘数据中的潜在关联关系。通过设置支持度和置信度的阈值,筛选出具有高支持度和置信度的关联规则。 -
「风险评估和结果生成」:根据患者的个人特征和关联规则,计算其乳腺癌风险评估值,并生成相应的风险评估结果。这些结果可以帮助医生和患者更好地了解个体的乳腺癌风险,并为预防、早期检测和治疗提供指导。
另外这是一个半监督学习的分析流程图,可供参考!
3.2 数据预处理和特征选择的方法
在模型中,数据预处理是一个关键步骤,它确保数据的可靠性和一致性。预处理过程中,我们会清洗数据,去除不完整或有缺失值的记录,并处理异常值。
对于特征选择,我们可以使用多种方法来选取最相关的特征,以降低数据维度和提高模型性能。常见的方法包括相关性分析、信息增益和卡方检验等。这些方法可以衡量特征与乳腺癌之间的相关性,从而选择对乳腺癌风险评估最为重要的特征。
3.3 关联规则挖掘算法的选择和参数调整
在关联规则挖掘阶段,我们需要选择适当的算法来挖掘数据中的关联关系。一种常用的算法是Apriori算法,它基于频繁项集来生成关联规则。另一种算法是FP-growth算法,它使用树状结构来挖掘频繁项集和关联规则,相比Apriori算法具有更高的效率。
参数调整是关联规则挖掘的重要一步,可以通过设置支持度和置信度的阈值来控制关联规则的数量和质量。较高的支持度阈值可以过滤掉一些不常见的规则,而较高的置信度阈值可以保证关联规则的可靠性。通过合理设定这些参数,我们可以得到具有较高支持度和置信度的关联规则,从而提高模型的准确性和可解释性。
在模型的开发过程中,我们需要对算法进行参数调优和模型训练。这意味着我们需要对关联规则挖掘算法的参数进行调整,以最大限度地发现数据中的有意义的关联规则。常见的参数包括支持度阈值和置信度阈值,通过调整这些参数,我们可以获得适合当前数据集和问题的最佳关联规则。
需要注意的是,模型的表现和效果取决于数据的质量和特征的选取。因此,我们应该注意数据预处理的准确性和特征选择的有效性,以获得更好的乳腺癌风险评估结果。
四、实用案例分析
步骤一:数据载入和解释
library(survival)
str(gbsg)
结果展示:
'data.frame': 686 obs. of 10 variables:
$ age : int 49 55 56 45 65 48 48 37 67 45 ...
$ meno : int 0 1 1 0 1 0 0 0 1 0 ...
$ size : int 18 20 40 25 30 52 21 20 20 30 ...
$ grade : int 2 3 3 3 2 2 3 2 2 2 ...
$ nodes : int 2 16 3 1 5 11 8 9 1 1 ...
$ pgr : int 0 0 0 0 0 0 0 0 0 0 ...
$ er : int 0 0 0 4 36 0 0 0 0 0 ...
$ hormon : int 0 0 0 0 1 0 0 1 1 0 ...
$ rfstime: int 1838 403 1603 177 1855 842 293 42 564 1093 ...
$ status : Factor w/ 2 levels "0","1": 1 2 1 1 1 2 2 1 2 2 ...
age:患者年龄
meno:更年期状态(0表示未更年期,1表示已更年期)
size:肿瘤大小
grade:肿瘤分级
nodes:受累淋巴结数量
pgr:孕激素受体表达水平
er:雌激素受体表达水平
hormon:激素治疗(0表示否,1表示是)
rfstime:复发或死亡时间(以天为单位)
status:事件状态(0表示被截尾,1表示事件发生)
步骤二:数据预处理和特征选择
我们本片文章的主要目的是演示无监督学习的关联规则,这里不对特征选择进行演示,如果有需要知道如何进行相关性检验和卡方检验的可以关注和私信我,我们一起讨论学习。
# 特征选择(这里可以t检验的结果进行特征选择)
selected_features <- c("age", "meno", "size", "grade","pgr","er","hormon")
gbsg_select <- gbsg[,selected_features]
结果展示:
# > head(gbsg_select)
age meno size grade pgr er hormon
1 49 0 18 2 0 0 0
2 55 1 20 3 0 0 0
3 56 1 40 3 0 0 0
4 45 0 25 3 0 4 0
5 65 1 30 2 0 36 1
6 48 0 52 2 0 0 0
正常的情况下是要根据卡方检验和相关性分析结果进行特征选择的,这里是为了更加突出无监督学习,不予展示!
步骤三:无监督学习-关联规则
# 安装并加载arules包
install.packages("arules")
library(arules)
# 将gbsg数据集转换为适合关联规则分析的数据格式
gbsg_trans <- as(gbsg_select, "transactions")
# 使用Apriori算法发现关联规则
rules <- apriori(gbsg_trans, parameter = list(support = 0.1, confidence = 0.7))
# 查看发现的关联规则
inspect(rules)
结果展示:
lhs rhs support confidence coverage lift count
[1] {} => {grade=[2,3]} 0.8819242 0.8819242 1.0000000 1.0000000 605
[2] {} => {hormon=[0,1]} 1.0000000 1.0000000 1.0000000 1.0000000 686
[3] {} => {meno=[0,1]} 1.0000000 1.0000000 1.0000000 1.0000000 686
[4] {grade=[1,2)} => {hormon=[0,1]} 0.1180758 1.0000000 0.1180758 1.0000000 81
[5] {grade=[1,2)} => {meno=[0,1]} 0.1180758 1.0000000 0.1180758 1.0000000 81
[6] {size=[22,30)} => {grade=[2,3]} 0.2463557 0.8894737 0.2769679 1.0085602 169
[7] {size=[22,30)} => {hormon=[0,1]} 0.2769679 1.0000000 0.2769679 1.0000000 190
[8] {size=[22,30)} => {meno=[0,1]} 0.2769679 1.0000000 0.2769679 1.0000000 190
[9] {size=[3,22)} => {grade=[2,3]} 0.2594752 0.8516746 0.3046647 0.9657005 178
[10] {size=[3,22)} => {hormon=[0,1]} 0.3046647 1.0000000 0.3046647 1.0000000 209
[11] {size=[3,22)} => {meno=[0,1]} 0.3046647 1.0000000 0.3046647 1.0000000 209
[12] {age=[21,48)} => {grade=[2,3]} 0.2842566 0.8986175 0.3163265 1.0189283 195
[13] {age=[21,48)} => {hormon=[0,1]} 0.3163265 1.0000000 0.3163265 1.0000000 217
[14] {age=[21,48)} => {meno=[0,1]} 0.3163265 1.0000000 0.3163265 1.0000000 217
[15] {pgr=[0,13)} => {er=[0,14)} 0.2303207 0.7022222 0.3279883 2.1315241 158
[16] {pgr=[0,13)} => {grade=[2,3]} 0.3236152 0.9866667 0.3279883 1.1187658 222
[17] {pgr=[0,13)} => {hormon=[0,1]} 0.3279883 1.0000000 0.3279883 1.0000000 225
[18] {pgr=[0,13)} => {meno=[0,1]} 0.3279883 1.0000000 0.3279883 1.0000000 225
[19] {er=[0,14)} => {grade=[2,3]} 0.3206997 0.9734513 0.3294461 1.1037812 220
[20] {er=[0,14)} => {hormon=[0,1]} 0.3294461 1.0000000 0.3294461 1.0000000 226
[21] {er=[0,14)} => {meno=[0,1]} 0.3294461 1.0000000 0.3294461 1.0000000 226
...
步骤四:规则可视化
install.packages("arulesViz")
library(arulesViz)
# 绘制关联规则的网络图
plot(rules, method = "graph")
步骤五:规则选择
如何使用支持度、置信度和提升度来选择关联规则?
# 根据支持度降序排序
rules_support <- sort(rules, by = "support", decreasing = TRUE)
# 输出前10条规则
inspect(rules_support[1:10])
# 根据置信度降序排序
rules_confidence <- sort(rules, by = "confidence", decreasing = TRUE)
# 输出前10条规则
inspect(rules_confidence[1:10])
# 根据提升度降序排序
rules_lift <- sort(rules, by = "lift", decreasing = TRUE)
# 输出前10条规则
inspect(rules_lift[1:10])
plot(rules_lift[1:10])
结果展示:
# > inspect(rules_support[1:10])
lhs rhs support confidence coverage lift count
[1] {} => {hormon=[0,1]} 1.0000000 1.0000000 1.0000000 1 686
[2] {} => {meno=[0,1]} 1.0000000 1.0000000 1.0000000 1 686
[3] {hormon=[0,1]} => {meno=[0,1]} 1.0000000 1.0000000 1.0000000 1 686
[4] {meno=[0,1]} => {hormon=[0,1]} 1.0000000 1.0000000 1.0000000 1 686
[5] {grade=[2,3]} => {hormon=[0,1]} 0.8819242 1.0000000 0.8819242 1 605
[6] {grade=[2,3]} => {meno=[0,1]} 0.8819242 1.0000000 0.8819242 1 605
[7] {grade=[2,3], hormon=[0,1]} => {meno=[0,1]} 0.8819242 1.0000000 0.8819242 1 605
[8] {meno=[0,1], grade=[2,3]} => {hormon=[0,1]} 0.8819242 1.0000000 0.8819242 1 605
[9] {} => {grade=[2,3]} 0.8819242 0.8819242 1.0000000 1 605
[10] {hormon=[0,1]} => {grade=[2,3]} 0.8819242 0.8819242 1.0000000 1 605
...
步骤六:规则处理模块
这里对关联规则最终结果有两种处理方法,如下:
-
特征工程:将关联规则的结果作为额外的特征添加到随机森林的输入特征中。可以将关联规则的结果编码为二进制变量,表示某个规则是否满足。然后将这些二进制变量作为新的特征添加到原始数据集中,一起用于训练随机森林模型。这样,随机森林模型可以利用关联规则的结果来辅助预测。 -
集成学习:将关联规则的结果作为一个独立的模型,与随机森林模型进行集成。可以训练一个基于关联规则的模型,例如基于关联规则的分类器,然后将其与随机森林模型进行集成。可以使用投票、加权平均或者堆叠等集成方法来融合两个模型的预测结果,得到最终的预测结果。
lhs <- inspect(rules_lift[1:10])
# 提取关联规则
rules_df <- as(lhs, 'data.frame')
# 查看规则
rules_df
结果展示:
# > rules_df
lhs rhs support confidence coverage lift count
[1] {age=[59,80], pgr=[89,2.38e+03]} => {er=[78.7,1.14e+03]} 0.1020408 0.8433735 0.1209913 2.526438 70
[2] {age=[59,80], pgr=[89,2.38e+03], hormon=[0,1]} => {er=[78.7,1.14e+03]} 0.1020408 0.8433735 0.1209913 2.526438 70
[3] {age=[59,80], meno=[0,1], pgr=[89,2.38e+03]} => {er=[78.7,1.14e+03]} 0.1020408 0.8433735 0.1209913 2.526438 70
[4] {age=[59,80], meno=[0,1], pgr=[89,2.38e+03], hormon=[0,1]} => {er=[78.7,1.14e+03]} 0.1020408 0.8433735 0.1209913 2.526438 70
[5] {size=[30,120], grade=[2,3], er=[0,14)} => {pgr=[0,13)} 0.1020408 0.7526882 0.1355685 2.294863 70
[6] {size=[30,120], grade=[2,3], er=[0,14), hormon=[0,1]} => {pgr=[0,13)} 0.1020408 0.7526882 0.1355685 2.294863 70
[7] {meno=[0,1], size=[30,120], grade=[2,3], er=[0,14)} => {pgr=[0,13)} 0.1020408 0.7526882 0.1355685 2.294863 70
[8] {meno=[0,1], size=[30,120], grade=[2,3], er=[0,14), hormon=[0,1]} => {pgr=[0,13)} 0.1020408 0.7526882 0.1355685 2.294863 70
[9] {size=[30,120], er=[0,14)} => {pgr=[0,13)} 0.1020408 0.7446809 0.1370262 2.270449 70
[10] {size=[30,120], er=[0,14), hormon=[0,1]} => {pgr=[0,13)} 0.1020408 0.7446809 0.1370262 2.270449 70
将规则和数据写入到excel,然后通过excel公式判断该列数据是否符合规则。
write.csv(gbsg, file = "D:/log/gbsg.csv")
好了,到这里就会有人要问了,怎么在excel中利用公式判断是否符合规则了。接下来我会把excel的公式和规则一一对应并列出来。
-
「规则一」: {age=[59,80], pgr=[89,2.38e+03]} & {er=[78.7,1.14e+03]}
excel代码:=AND(AND(B2>=59,B2<80),AND(F2>=89,F2<2380),AND(G2>=78.7,G2<1140))
-
「规则二」: {age=[59,80], pgr=[89,2.38e+03], hormon=[0,1]} & {er=[78.7,1.14e+03]}
规则二和规则一没有本质的区别hormon它的值的范围就是0和1,因此excel代码和规则一一致,重复的就不需要加列值。
-
「规则三」:
{hormon=[0,1]} & {meno=[0,1]}
所有的数据都符合条件,没有实际意义。 -
「规则四」:
{age=[59,80], meno=[0,1], pgr=[89,2.38e+03], hormon=[0,1]} & {er=[78.7,1.14e+03]}
规则四和规则一没有本质的区别hormon它的值的范围就是0和1,因此excel代码和规则一一致,重复的就不需要加列值。
-
「规则五」: {size=[30,120], grade=[2,3], er=[0,14)} & {pgr=[0,13)}
excel代码:=AND(AND(D2>=30,D2<120),AND(E2>=2,E2<=3),AND(G2>=0,G2<14),AND(F2>=0,F2<13))
这里就演示到规则1-5,接下来我们把处理好的数据重新载入到R.
步骤七:构建随机森林模型
-
数据载入
data <- read.csv(file.choose())
head(data)
结果展示:
pid age meno size grade nodes pgr er hormon rfstime status rule_1 rule_5
1 132 49 0 18 2 2 0 0 0 1838 0 FALSE FALSE
2 1575 55 1 20 3 16 0 0 0 403 1 FALSE FALSE
3 1140 56 1 40 3 3 0 0 0 1603 0 FALSE TRUE
4 769 45 0 25 3 1 0 4 0 177 0 FALSE FALSE
5 130 65 1 30 2 5 0 36 1 1855 0 FALSE FALSE
6 1642 48 0 52 2 11 0 0 0 842 1 FALSE TRUE
-
拆分训练集和测试集
gbsg <- data[,-1]
library(randomForest)
set.seed(1234)
# 随机分出训练集和测试集
trainIndex <- sample(1:nrow(gbsg), 0.8 * nrow(gbsg))
train <- gbsg[trainIndex,]
test <- gbsg[-trainIndex,]
# 构建随机森林模型
train$status <- as.factor(train$status)
rf_mod <- randomForest(status ~ ., data = train, ntree = 100)
# 获取模型预测的概率
pred_prob <- predict(rf_mod, newdata = test, type = "prob")
# 计算真阳性率和假阳性率
roc <- pROC::roc(test$status, pred_prob[, 2])
# 绘制ROC曲线
plot(roc, main = "ROC Curve", print.auc = TRUE, auc.polygon = TRUE, grid = TRUE, legacy.axes = TRUE,col="blue")
这里加了规则一和规则五之后,没有变化,下面可能是导致AUC没有变化的原因:
-
弱相关性:关联规则的应用可能在数据集中并没有带来明显的影响。关联规则通常用于描述特征之间的关联关系,但可能在训练数据中没有强烈的相关性。在这种情况下,加入关联规则可能对模型的性能没有显著的影响,因此AUC保持不变。 -
冗余规则:加入的关联规则可能与已有的特征或变量高度重复。如果关联规则提供了与已有特征类似的信息,那么加入这些规则可能不会带来额外的信息增益,并且不会对模型的性能产生显著影响。 -
不适当的规则选择:选择的关联规则可能并不适用于给定的数据集和问题。关联规则的选择应该基于对数据集和问题域的理解和洞察力。如果选择的关联规则与实际情况不符合或不适用于当前问题,那么加入这些规则可能不会对模型的性能产生明显改变。 -
模型鲁棒性:随机森林模型通常对于噪声和不相关的特征具有一定的鲁棒性。即使加入了关联规则,模型能够通过集成学习的方式对噪声进行平均化处理,并且仍然依赖于那些更具预测能力的特征。在这种情况下,加入关联规则可能不会对模型的整体性能产生显著影响。
五、总结
无监督学习在乳腺癌风险评估中扮演着重要的角色。通过无监督学习算法,我们可以发现数据集中的隐藏模式和异常样本,从而帮助我们更好地理解乳腺癌的发展和风险因素。这种无监督的方法可以帮助我们发现新的特征或关联,进一步优化乳腺癌的风险评估和预测模型。
关联规则作为一种挖掘特征之间关联关系的方法,在乳腺癌风险评估中具有潜在的价值。通过发现不同特征之间的关系,我们可以识别出潜在的风险因素,并将这些因素用于乳腺癌风险的预测和评估中。关联规则模型为我们提供了一种将这些关联关系转化为实际预测和决策的方法。
综上所述,无监督学习和关联规则在乳腺癌风险评估中具有潜在的价值。进一步的研究和应用将有助于提高乳腺癌的早期检测和个性化治疗,为乳腺癌患者提供更有效的护理和管理策略。
参考文献
-
Araujo, Lourdes et al. “Discovering HIV related information by means of association rules and machine learning.” Scientific reports vol. 12,1 18208. 28 Oct. 2022, doi:10.1038/s41598-022-22695-y
*「未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。」