机器学习预测乳腺肿瘤性质(1)
作者:汪君,专职数据分析,Python和R爱好者
个人微信公众号:学英文和玩数据
威斯康辛乳腺癌诊断数据(Breast Cancer Wisconsin (Diagnostic) Data Set),是加州大学机器学习和智能系统中心公布在其网站上众多数据集中的一个,下载地址在这里。作为提供给机器学习研究者做classification练习或者是classification算法研究的样本数据,该数据集包含569例乳腺肿瘤组织细胞的电子图像数据,每一图像有32个变量,1个变量是id编号,1个是人工标注的分类标签(良性or恶性),剩余30个变量都是描述电子图像的各种特征,也就是features,这些特征变量描述了细胞核的各种特点,比如半径,对称性,面积等,数据集无缺失值。 利用这30个特征变量构建机器学习模型可以对肿瘤细胞的性质进行预测。
利用这个数据集,我们可以学习sklearn 这个module里面的各种分类算法,利用一些评判标准对算法分类的结果进行对比。
先加载需要的module和数据,数据是csv的格式,利用pandas的read_csv函数把数据加载进来
import numpy as np
import pandas as pd
import sklearn
import matplotlib.pyplot as plt ws_data=pd.read_csv("data.csv")大致看看数据集的情况
ws_data.describe ## 大致看看数据集的情况
ws_data.shape ## 看看有多少行和列
ws_data.dtypes ## 查看每一例的数据类型
ws_data.columns ## 查看每列的变量名
把label也就是人工诊断的结果diagnosis和feature分别提取出来,方便后续数据操作
diagnosis=ws_data.diagnosis ## m表示恶性,b表示良性
### 提取后面30列作为predictive features
predi_features=ws_data.iloc[:,2:32]
利用五折交叉验证法,测试不同的分类算法在该数据集上的表现,本次我们只使用预测的准确率来作为评判标准。
from sklearn.cross_validation import StratifiedKFold
### 加载logistic regression分类器
from sklearn.linear_model import LogisticRegression
### 加载SGD分类器,随机梯度下降分类器,可在网上搜索该算法原理
from sklearn.linear_model import SGDClassifier
### 加载支持向量机分类器
from sklearn.svm import SVC
### StratifiedKFold能够把数据集按照良恶性一定比例分成五份
### 做五折交叉验证,四份作为训练集,一份作为测试集
### 把三种分类算法在测试集上评估预测的准确率
sfk=StratifiedKFold(y=diagnosis,n_folds=5,random_state=42,shuffle=True)
logClf=LogisticRegression(random_state=42)
SGDclf=SGDClassifier()
svmClf=SVC(random_state=42)
i=0
for a,b in sfk:
train_x,train_y=predi_features.iloc[a,:],diagnosis[a]
test_x,test_y=predi_features.iloc[b,:],diagnosis[b]
logClf.fit(X=train_x,y=train_y)
accuracy=logClf.score(X=test_x,y=test_y)
i+=1
print("accuracy socre for logistic regression on test set %d is %.5f" %(i,accuracy))
z=0
for a,b in sfk:
train_x,train_y=predi_features.iloc[a,:],diagnosis[a]
test_x,test_y=predi_features.iloc[b,:],diagnosis[b]
SGDclf.fit(X=train_x,y=train_y)
accuracy=SGDclf.score(X=test_x,y=test_y)
z+=1
print("accuracy socre for SGDclassifier on test set %d is %.5f" %(z,accuracy))
m=0
for a,b in sfk:
train_x,train_y=predi_features.iloc[a,:],diagnosis[a]
test_x,test_y=predi_features.iloc[b,:],diagnosis[b]
svmClf.fit(X=train_x,y=train_y)
accuracy=svmClf.score(X=test_x,y=test_y)
m+=1
print("accuracy socre for SVMclassifier on test set %d is %.5f" %(m,accuracy))
初步计算的结果是:
accuracy socre for logistic regression on test set 1 is 0.92174
accuracy socre for logistic regression on test set 2 is 0.93913
accuracy socre for logistic regression on test set 3 is 0.96460
accuracy socre for logistic regression on test set 4 is 0.97345
accuracy socre for logistic regression on test set 5 is 0.93805
accuracy socre for SGDclassifier on test set 1 is 0.86957
accuracy socre for SGDclassifier on test set 2 is 0.90435
accuracy socre for SGDclassifier on test set 3 is 0.89381
accuracy socre for SGDclassifier on test set 4 is 0.92920
accuracy socre for SGDclassifier on test set 5 is 0.86726
accuracy socre for SVMclassifier on test set 1 is 0.62609
accuracy socre for SVMclassifier on test set 2 is 0.62609
accuracy socre for SVMclassifier on test set 3 is 0.62832
accuracy socre for SVMclassifier on test set 4 is 0.62832
accuracy socre for SVMclassifier on test set 5 is 0.62832
为实现代码的重复使用并更加concise,我们可以构建一个类,将上面的过程包装起来使用,扩展到四种分类器,在上面的基础上增加RandomForest (随机森林)分类器。
class winsconBC:
def __init__(self,data_y,method,rand_seed=42,Nfolds=3,shuffled=True):
from sklearn.cross_validation import StratifiedKFold
self.data=data_y
self.clf=method
self.Rseed=rand_seed
self.Nfolds=Nfolds
self.shuffle=shuffled
self.classifier=method
self.sfk=StratifiedKFold(y=self.data,n_folds=self.Nfolds,random_state=self.Rseed,shuffle=self.shuffle)
def classify(self):
accuracy=list()
for TR,TS in self.sfk:
train_x,train_y=predi_features.iloc[TR,:],diagnosis[TR]
test_x,test_y=predi_features.iloc[TS,:],diagnosis[TS]
if self.classifier=="logistic":
from sklearn.linear_model import LogisticRegression
logClf=LogisticRegression(random_state=42)
logClf.fit(train_x,train_y)
accuracy.append(logClf.score(X=test_x,y=test_y))
if self.classifier=="SGD":
from sklearn.linear_model import SGDClassifier
SGDclf=SGDClassifier(random_state=self.Rseed)
SGDclf.fit(X=train_x,y=train_y)
accuracy.append(SGDclf.score(X=test_x,y=test_y))
if self.classifier=="SVM":
from sklearn.svm import SVC
svmClf=SVC(random_state=self.Rseed)
svmClf.fit(X=train_x,y=train_y)
accuracy.append(svmClf.score(X=test_x,y=test_y))
if self.classifier=="randomforest":
from sklearn.ensemble import RandomForestClassifier
rmClf=RandomForestClassifier()
rmClf.fit(X=train_x,y=train_y)
accuracy.append(rmClf.score(X=test_x,y=test_y))
return(np.array(accuracy))
利用barplot对比一下四种分类算法的平均预测的准确率。
plt.figure()
plt.bar(np.arange(4),np.array([np.mean(winsconBC(data_y=diagnosis,method=i,Nfolds=5).classify()) for i in ["SGD",'logistic','SVM',"randomforest"]]))
plt.xticks(np.arange(4), ("SGD",'logistic','SVM',"randomforest"))
plt.axhline(0.95,c="r") ## 加一条accuracy=0.95的基准曲线做参考
plt.show()
可以看到在这个数据集上,logistics regression 分类算法和随机森林表现比较好。
Python爱好者社区历史文章列表(每周append更新一次)
关注后在公众号内回复“课程”即可获取:
0.小编的Python入门视频课程!!!
1.崔老师爬虫实战案例免费学习视频。
2.丘老师数据科学入门指导免费学习视频。
3.陈老师数据分析报告制作免费学习视频。
4.玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。
5.丘老师Python网络爬虫实战免费学习视频。