温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :)
1. 项目简介
乳腺癌是全球女性最常见的恶性肿瘤之一,早期发现和诊断对于提高治愈率至关重要。传统的乳腺癌检测方法依赖于医生的经验和技术,但随着医学影像技术和计算机科学的发展,基于机器学习的方法逐渐成为辅助诊断的重要手段。乳腺癌的早期诊断对于治疗至关重要,本系统致力于通过分析肿瘤的各种特征,如半径、纹理、形状等,利用Matplotlib、Seaborn 等工具进行可视化统计分析,并建立机器学习模型来预测肿瘤是否为恶性,测试集预测 AUC 达到 98.41%。系统的设计目的是为了帮助医疗专业人员更快地做出决策,并为患者提供更及时的治疗方案。
B站系统演示视频: 基于机器学习的乳腺癌肿瘤智能分析预测系统_哔哩哔哩_bilibili
【演示视频】基于机器学习的乳腺癌肿瘤智能分析预测系统
2. 数据探索式可视化分析
系统首先对乳腺癌肿瘤的检测数据进行了详细的统计描述,并使用 matplotlib
和 seaborn
等可视化工具进行了图表展示。这些图表有助于直观理解不同特征之间的关系及其分布情况,从而为后续的建模工作提供依据。
2.1 读取数据与数据预处理
利用 pandas 读取数据集,并进行预处理:
python
df = pd.read_csv("./breast-cancer.csv")
# 去除无用的特征
del df['Unnamed: 32']
df.columns.values
# 列名汉化
df.rename(columns=columns_zh_dict,inplace=True)
df.info()
可以看出,数据集不存在缺失值,且均为数值类型。
2.2 肿瘤类型数量分布
python
tmp = df["诊断"].value_counts().to_frame().reset_index().rename(columns={"count":"数量"})
tmp["百分比"] = tmp["数量"].map(lambda x:round(x/tmp["数量"].sum()*100,2))
labels,values,percent = tmp["诊断"].tolist(),tmp["数量"].tolist(),tmp["百分比"].tolist()
可以看出,诊断为恶性肿瘤的患者占 37.26%,这是一个类别不均衡的二分类问题,需要采用采样算法去平衡数据集的占比。
2.3 特征与肿瘤类型的相关性
python
df['诊断'] = df['诊断'].map(lambda d: 1 if d == '恶性' else 0)
fig,ax = plt.subplots(1,1,figsize=(20, 16))
cmap = sns.diverging_palette(200, 20, as_cmap=True)
sns.heatmap(df.corr(), annot= True, cmap=cmap, vmax=.5, center=0,
square=True, linewidths=.5, cbar_kws={"shrink": .5})
ax.set_xticklabels(labels=df.columns, rotation=90, fontsize=12)
ax.set_yticklabels(labels=df.columns, rotation=0, fontsize=12)
plt.show()
乳腺癌诊断中,半径、纹理和形状是最相关的特征,它们与诊断高度相关,其中半径、纹理、平均值、标准偏差、长轴比、表面粗糙度、凹度、圆锥度、斑点强度、斑点大小、分形维数等特征的相关系数接近或超过0.5,表明这些特征是诊断乳腺癌的重要因素。
2.4 不同类型肿瘤的最坏情况凹陷点分布
python
feature = '最坏情况凹陷点'
plt.figure(figsize=(20, 6))
plt.subplot(121)
# 省略部分代码
plt.legend(fontsize=14)
plt.title('不同类型肿瘤{}的特征值分布'.format(feature), fontsize=18)
plt.subplot(122)
# 省略部分代码
plt.title("不同类型肿瘤{}的分布散点图".format(feature), fontsize=18)
plt.legend(fontsize=14)
plt.ylabel(feature, fontsize=14)
plt.xlabel('样本', fontsize=14)
plt.show()
2.5 不同类型肿瘤的最坏情况周长平均值分布
2.6 不同类型肿瘤的凹陷点平均值分布
2.7 不同类型肿瘤的凹陷情况联合分布
2.8 不同类型肿瘤的纹理情况联合分布
2.9 不同类型肿瘤的表面光滑度情况联合分布
2.10 不同类型肿瘤的半径、周长、面积的几何特征联合分布
python
tmp = df.loc[:,['最坏情况半径','最坏情况周长','最坏情况面积']]
g = sns.PairGrid(tmp, diag_sharey=False)
g.map_lower(sns.kdeplot, cmap="Blues_d")
g.map_upper(plt.scatter)
g.map_diag(sns.kdeplot, lw=3)
plt.show()
2.11 不同类型肿瘤的紧凑、凹陷、对称性、光滑度等外形特征分布情况
图中显示了不同类型肿瘤的紧凑、凹陷、对称性、光滑度等外形特征的分布情况,其中蓝色代表恶性肿瘤,橙色代表良性肿瘤。从图中可以看出,在紧凑度、凹陷度、对称性、光滑度等方面,恶性肿瘤的分布范围较宽,而良性肿瘤的分布范围相对较窄。这意味着恶性肿瘤在外形上的变异程度更大,而良性肿瘤则更为规则。因此,这些特征可用于区分恶性肿瘤和良性肿瘤。
3. 肿瘤特征聚类可视化分析
在进行聚类分析之前进行特征归一化是非常重要的,这是因为不同的特征可能会有不同的量纲和尺度,如果不进行归一化处理,那么在距离计算或相似度度量时,那些数值范围较大的特征将会主导结果,导致聚类结果偏向于那些尺度较大的特征,而忽略了其他同样重要的特征。特征归一化是为了确保每个特征在聚类分析中都能公平地反映数据本身的特性,而不是被其测量尺度所左右。这有助于提高聚类算法的效果和可靠性。
python
feat_df = df.drop(columns=['诊断'])
feat_df = 1.0*(feat_df - feat_df.mean()) / feat_df.std()
feat_df
t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种广泛应用于数据可视化和高维数据降维的技术。t-SNE 的主要目的是将高维空间中的数据映射到二维或三维空间,以便于人类可以直观地理解数据的结构。
python
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2)
tsne.fit_transform(feat_df)
feat_embed = tsne.embedding_
将数据集进行 TSNE 聚类降维可视化:
可以看出,良性肿瘤与恶性肿瘤的样本存在明显的区分性。
4.基于机器学习的乳腺癌肿瘤预测建模
4.1 多模型预测性能对比初探
初步对 "Gradient Boosting", "Logistic Regression", "Support Vector Machine", "XGBoost", 'KNN' 5种模型集成训练和测试,进行模型性能对比:
python
gbc = GradientBoostingClassifier()
lgr = LogisticRegression()
svc = SVC()
xgb_clf = XGBClassifier()
knn = KNeighborsClassifier(n_neighbors=12)
models = [gbc, lgr, svc, xgb_clf, knn]
names = ["Gradient Boosting", "Logistic Regression", "Support Vector Machine", "XGBoost", 'KNN']
def training(model):
model.fit(X_train, y_train)
pred = model.predict(X_test)
score = accuracy_score(pred, y_test)
report = classification_report(pred, y_test)
cm = confusion_matrix(pred, y_test)
return score*100, report, cm
将测试集的预测 AUC 进行对比:
可以看出,默认参数条件下,XGBoost 和 Gradient Boost 分类器的效果最好,达到 96.15%。
4.2 Xgboost 模型继续优化
python
df_columns = X_train.columns.values
print('===> feature count: {}'.format(len(df_columns)))
xgb_params = {
'eta': 0.1,
'colsample_bytree': 0.4,
'max_depth': 8,
'lambda': 2.0,
'eval_metric': 'auc',
'objective': 'binary:logistic',
'nthread': -1,
'silent': 1,
'booster': 'gbtree'
}
dtrain = xgb.DMatrix(X_train, y_train, feature_names=df_columns)
dvalid = xgb.DMatrix(X_valid, y_valid, feature_names=df_columns)
watchlist = [(dtrain, 'train'), (dvalid, 'valid')]
模型训练:
python
model = xgb.train(dict(xgb_params),
dtrain,
evals=watchlist,
verbose_eval=10,
early_stopping_rounds=100,
num_boost_round=4000)
[0] train-auc:0.99068 valid-auc:0.98088
[10] train-auc:0.99874 valid-auc:0.99118
[20] train-auc:0.99942 valid-auc:0.99265
[30] train-auc:0.99986 valid-auc:0.99412
[40] train-auc:0.99998 valid-auc:0.99412
[50] train-auc:1.00000 valid-auc:0.99412
[60] train-auc:1.00000 valid-auc:0.99412
[70] train-auc:1.00000 valid-auc:0.99412
[80] train-auc:1.00000 valid-auc:0.99412
[90] train-auc:1.00000 valid-auc:0.99412
[100] train-auc:1.00000 valid-auc:0.99412
[107] train-auc:1.00000 valid-auc:0.99412
4.3 特征重要程度情况
4.4 模型性能评估
python
# predict train
predict_train = model.predict(dtrain)
train_auc = evaluate_score(predict_train, y_train)
# predict validate
predict_valid = model.predict(dvalid)
valid_auc = evaluate_score(predict_valid, y_valid)
# predict test
dtest = xgb.DMatrix(X_test, feature_names=df_columns)
predict_test = model.predict(dtest)
test_auc = evaluate_score(predict_test, y_test)
print('训练集 auc = {:.7f} , 验证集 auc = {:.7f} , 测试集 auc = {:.7f}\n'.format(train_auc, valid_auc, test_auc))
训练集 auc = 1.0000000 , 验证集 auc = 0.9941176 , 测试集 auc = 0.9840510
可以看出,经过优化后,测试集 AUC 达到 98.41%,提升明显。
5. 基于机器学习的乳腺癌肿瘤智能分析预测系统
为了让非专业人士也能方便地使用该系统,我们采用了 Flask
框架来搭建后端服务接口,并结合 Bootstrap
和 echarts
等前端框架构建了一个易于操作的用户界面。用户可以通过这个平台上传自己的检测数据,并获取即时的肿瘤评估结果。
5.1 系统首页
5.2 乳腺癌肿瘤知识百科
5.3 乳腺癌肿瘤在线预测
6. 总结
本系统致力于通过分析肿瘤的各种特征,如半径、纹理、形状等,利用Matplotlib、Seaborn 等工具进行可视化统计分析,并建立机器学习模型来预测肿瘤是否为恶性,测试集预测 AUC 达到 98.441%。系统的设计目的是为了帮助医疗专业人员更快地做出决策,并为患者提供更及时的治疗方案。
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取 认准下方 CSDN 官方提供的师姐 QQ 名片 :)
精彩专栏推荐订阅: