练习(三)——乳腺肿瘤(良、恶性)数据分类

该数据集来自威斯康星医院,由WIlliam H. Wolberg博士提供。


这个数据集,将肿瘤细胞分为两类,为良性肿瘤和恶性肿瘤,根据肿瘤细胞的外观特征以及细胞核的特征来划分的。这些特征有十个,分别为:
1.Sample code number id number(患者编号)
2. Clump Thickness 1 - 10(肿瘤厚度)
3. Uniformity of Cell Size 1 - 10 (细胞大小均匀性)
4. Uniformity of Cell Shape 1 - 10(细胞形状均匀性)
5. Marginal Adhesion 1 - 10(边缘粘附力)
6. Single Epithelial Cell Size 1 - 10(单上皮细胞大小)
7. Bare Nuclei 1 - 10(裸核)
8. Bland Chromatin 1 - 10(染色质的颜色)
9. Normal Nucleoli 1 - 10(核仁正常情况)
10. Mitoses 1 - 10(有丝分裂情况)

class是分类情况,2为良性,4为恶性
我在导入数据时候,将标签栏的名称缩写了一下。在这里插入图片描述


在这里插入图片描述
良性肿瘤和恶性肿瘤的区分如上表。
我们身体内的细胞,除了干细胞能不断分裂外,其他细胞在分裂过程中都向着特定的方向分化,分化之后会降低或失去分裂能力。而肿瘤细胞的分化能力降低,几乎一直在分裂。良性肿瘤危害较小,良性的肿瘤细胞的分化程度较高,它与正常组织细胞虽不完全一样,但还是有许多近似之处。恶性肿瘤的细胞分化程度低,就与如同胚胎干细胞一样可以无限的分裂,其生长迅速,与人体争夺营养物质,并且产生有害代谢产物,破坏人体正常器官组织结构,危害严重。


我们先排除患者编号这一列,不同编号对肿瘤良性与否无关。

第2~6个特征主要和肿瘤细胞的外形相关,例如肿瘤厚度,肿瘤细胞的大小粘附力等。 良性肿瘤呈膨胀性生长,不侵入周围组织,有完整包膜,与周围界限清楚,并且良性肿瘤细胞分化良好,无明显异型性。良性肿瘤一般不侵袭,不转移。

下图红色图表将数据中,良性肿瘤的2~6个特征做了可视化,可以看出良性肿瘤的肿瘤细胞较小,且形状均匀,粘附力弱(我认为这个可以解释为浸润其他细胞和转移的能力),肿块厚度分布不均,不过多数都在5以下。
图一
蓝色图表则是恶性肿瘤的数据分布。很明显的看出,恶性肿瘤的细胞形状大小很不均一,并且肿块厚度较大,这和恶性肿瘤呈浸润性生长有关。恶性肿瘤细胞可以从组织间隙、淋巴管和血管向周围组织侵入,故恶性肿瘤的形态极不规则,也无完整包膜,与周围组织界限不清,紧密连在一起,有时早期就出现固定,不易移动。
在这里插入图片描述
第7~10个特征描述的是良/恶性肿瘤细胞的核的变化。恶性肿瘤的细胞及细胞核是大小不等、形态不一,核膜增厚。细胞核增大尤其显著,致使核与细胞浆的比例失常。核染色深且增多,有多数核分裂。除此之外,核算代谢旺盛,导致人体尝试异常代谢。
对良/恶性肿瘤的这四个特征进行了可视化,看得出除了有丝分裂情况以外,其他的区分度还是很高的(黄色是良性,绿色是恶性)
在这里插入图片描述
在这里插入图片描述


因为数据已经标签化完全了,所以直接开始建模分析

拆分数据

我们将数据集拆分为训练集(X_train,y_train)和测试集(X_test,y_test),用训练集训练模型后,用测试集来测试模型的性能。

from sklearn.model_selection import train_test_split

predictors=breast_pro.columns[:-1]
X_train,X_test,y_train,y_test=train_test_split(breast_pro[predictors],breast_pro['class'],test_size=0.3,random_state=1)
构建模型

以决策树算法为例

#决策树
from sklearn.model_selection import GridSearchCV 
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics 

#设置决策树的最大深度、最小非叶子节点的最小样本数和叶子节点的最小样本数的取值范围
max_depth=range(2,10,1) 
min_samples_split=range(2,12,1) 
min_samples_leaf=range(2,12,1) 
parameters_dtc={'max_depth':max_depth,'min_samples_split':min_samples_split,'min_samples_leaf':min_samples_leaf}

#采用GridSearchCV选择最优的参数
grid_search=GridSearchCV(estimator=DecisionTreeClassifier(),param_grid=parameters_dtc,cv=10,n_jobs=-1) 
grid_search.fit(X_train,y_train) 
grid_search.best_params_
import pydotplus
from sklearn.tree import export_graphviz
from sklearn.metrics import precision_score, recall_score, f1_score
from sklearn.metrics import classification_report

#根据调参结果构建决策树 
dtc=DecisionTreeClassifier(max_depth=3,min_samples_split=7,min_samples_leaf=5) 
dtc.fit(X_train,y_train) 
y_predict=dtc.predict(X_test) 

print("决策树模型在测试集上的准确率为:",metrics.accuracy_score(y_test,y_predict))
###classification_report可以直接算出precision、recall和f1_score,就不用一个个的算啦
print(classification_report(y_true=y_test, y_pred=y_predict))

#print('Precision: ',metrics.precision_score(y_test,y_predict))
#print('Recall: ',recall_score(y_test,y_predict))
#print('F1:',f1_score(y_test,y_predict))

#保存决策树图像到pdf文件
#dot_data = export_graphviz(dtc,out_file=None,feature_names=predictors,class_names="class",filled=True, rounded=True,special_characters=True)
#graph = pydotplus.graph_from_dot_data(dot_data)
#graph.write_pdf("breast_tree.pdf")

结果如下:
决策树模型在测试集上的准确率为: 0.9476190476190476

                precision    recall  f1-score   support
            0       0.94      0.90      0.92        68
            1       0.95      0.97      0.96       142
  avg / total       0.95      0.95      0.95       210
混淆矩阵
from sklearn.metrics import confusion_matrix

dtc_confmat = confusion_matrix(y_true=y_test, y_pred=y_predict)

fig, ax = plt.subplots(figsize=(4,4))
ax.matshow(dtc_confmat,alpha=0.4, cmap=plt.cm.Reds)
for i in range(dtc_confmat.shape[0]):
    for j in range(dtc_confmat.shape[1]):
        ax.text(x=j, y=i, s=dtc_confmat[i, j], va='center', ha='center')

plt.xlabel('predicted label')
plt.ylabel('true label')

plt.tight_layout()
# plt.savefig('./figures/confusion_matrix.png', dpi=300)
plt.show()

结果:
在这里插入图片描述
我们可以通过混淆矩阵得到才测试集中,真正例、假反例,假正例和真反例各为多少。在这个测试集中,成功被分类的样本有138(TP)+61(TN)=199个,有4(FP)+7(FN)=11个样本被误分类。

ROC曲线
from sklearn.metrics import roc_curve, auc

# y_test:实际的标签, dataset_pred:预测的概率值。
y_score=dtc.predict_proba(X_test)[:,1]
fpr, tpr, threshold = roc_curve(y_test,y_score)
roc_auc = auc(fpr, tpr)  
#画图,只需要plt.plot(fpr,tpr),变量roc_auc只是记录auc的值,通过auc()函数能计算出来  
#画面积图
plt.stackplot(fpr,tpr,color='steelblue',alpha=0.3,edgecolor='black')
plt.plot(fpr, tpr, lw=1, label='ROC(area = %0.2f)' % (roc_auc))
#对角线
plt.plot([0,1],[0,1],color='r',linestyle='--',alpha=0.5)
plt.text(0.5,0.4,'ROC curve (area=%0.2f)'%roc_auc)
plt.xlabel("FPR (False Positive Rate)")
plt.ylabel("TPR (True Positive Rate)")
plt.title("Receiver Operating Characteristic, ROC(AUC = %0.2f)"% (roc_auc))
plt.show()

在这里插入图片描述
各个评价指标都非常高,说明决策树模型能够非常准确地对数据集进行分类,这也由于该数据集对不同的类别,其数据分布有很大的不同,所以也很容易可以区分开来。

  • 11
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值