本文立足于通过多分类模型实现乳腺癌诊断,基于WDBC(Breast Cancer Wisconsin ( Diagnostic) Data Set (WDBC))数据集进行代码实现。
数据集链接:WDBC乳腺癌数据集
该数据集是根据乳房肿块的细针抽取采样的数字化图像化后计算出来的,它描述了图像中肿瘤细胞核的特征。
- 数据集特征:多变量的
- 样本容量:569(357条良性benign,212条恶性malignant)
- 每条样本特征数:32 (ID,标签,30个实值输入特征)
- 相关任务:分类
其中数据集样本特征中除ID和标签外,主要包含半径、纹理、周界、面积等等细胞核实值特征,共计30个。在此就不再一一介绍,均放置于总体程序压缩包中。
以下以Random Forest模型举例:
# 读取数据
import numpy as np
import pandas as pd
from sklearn import preprocessing
# 原始数据以csv格式读取
dataset = pd.read_csv(r'C:\Users\Lenovo\Desktop\analyse\wdbc.data.csv',header=None)
# 标签化diagnosis列
encoder = preprocessing.LabelEncoder().fit(dataset['diagnosis'])
dataset['diagnosis'] = encoder.transform(dataset['diagnosis'])
print('标签: %s' % encoder.classes_)
# 获取数据
X = np.array(dataset)
dataset_target = X[:, 1] # 原始标签数据
dataset_data = X[:, 2:32] # 原始输入数据
# 数据集计数
from collections import Counter
Counter(dataset_target)
# Counter({1.0: 212, 0.0: 357})
# SMOTE过采样,平衡正负样本数据量,提升识别效果
from imblearn.over_sampling import SMOTE
smo = SMOTE()
# 得到采样后的数据样本
dataset_data_sm, dataset_target_sm = smo.fit_resample(dataset_data, dataset_target)
Counter(dataset_target_sm)
from sklearn import preprocessing
import numpy as np
dataset_data_scaled = preprocessing.scale(dataset_data_sm)
# 通过网格搜索法得出最优的参数组合
# 随机森林是由多个决策树集成而成。n_estimators为弱学习器的个数,n_estimators太小,容易欠拟合,太大,容易过拟合。max_depth决定了决策树的最大深度。
from sklearn.model_selection import GridSearchCV
param = {'n_estimators': np.arange(2, 20, 2),'max_depth': np.arange(2, 11)}
gc = GridSearchCV(model, param_grid=param, cv=5)
gc.fit(X_train,y_train)
print("最佳参数组合:",gc.best_params_)
depth = gc.best_params_['max_depth']
estimator = gc.best_params_['n_estimators']
# 最佳参数组合: {'max_depth': 7, 'n_estimators': 16}
# 确定n_estimators和max_depth参数,调整其他两个参数
# max_features的增加一般能提升模型性能,在每个节点,选择更多。但是会降低算法的速度,需要适当平衡选择最佳的值。
# criterion为CART树做划分时对特征的评价标准,分类模型和回归模型的损失函数是不一样的
model = RandomForestClassifier(random_state=90, max_depth=depth, n_estimators=estimator)
param = {"max_features":np.arange(2,30,2),"criterion":['gini','entropy']}
gc = GridSearchCV(model, param_grid=param, cv=5)
gc.fit(X_train,y_train)
print("最佳参数组合:",gc.best_params_)
criterion = gc.best_params_['criterion']
feature = gc.best_params_['max_features']
# 最佳参数组合: {'criterion': 'gini', 'max_features': 14}
model = RandomForestClassifier(random_state=90, max_depth=depth, n_estimators=estimator,criterion=criterion,max_features=feature)
model.fit(X_train, y_train)
# 基于测试数据进行预测
y_pred = model.predict(X_test)
# 得到预测结果,四舍五入去掉小数点位
predictions = [round(value) for value in y_pred]
# 评估准确率效果
accuracy = accuracy_score(y_test, predictions)
precision = precision_score(y_test, predictions)
recall = recall_score(y_test, predictions)
f1 = f1_score(y_test,predictions)
tn, fp, fn, tp = confusion_matrix(y_test, y_pred,labels=[0,1]).ravel()
fpr = fp/(fp+tn)
spe = tn/(fp+tn)
#准确率: 0.958041958041958
#精度: 0.948051948051948
#召回率: 0.9733333333333334
#FPR: 0.058823529411764705
#特异度: 0.9411764705882353
#F1值: 0.9605263157894737
分别采用Bayes、KNN、SVM、决策树及随机森林算法进行模型参数调整,实现乳腺癌诊断任务。
资源代码已集成:CSV格式数据集、数据集介绍文档、(五类机器学习算法的乳腺癌诊断Python实现)。