查看原文
其他

机器学习预测乳腺肿瘤性质(2)

2017-12-07 汪君 Python爱好者社区

作者:汪君,专职数据分析,Python和R爱好者

个人微信公众号:学英文和玩数据


在上一篇文章里 机器学习预测乳腺肿瘤性质(1),我们分别利用sklearnmodule中的SGD,logistic regression,svm以及random forest的四个分类器在数据集Breast Cancer Wisconsin (Diagnostic) Data Set上进行了初步的对比,发现logistic regression和random forest的效果比较好,但是由于我们是采用这些分类器的默认参数(default value),并没有进行人为参数设置,而且SGD是采取随机梯度下降的算法来完成分类,分类效果是否和随机种子的选择有关不得而知。

在本篇中,我们开始手动设置一些分类器的参数,而且不仅是做单次的五折交叉验证,将五折交叉验证的过程本身再多次重复,求准确率的平均值,看看这四个分类器的效果是否有变化,

还是先加载相关module和数据

import numpy as np
import pandas as pd
import sklearn
import matplotlib.pyplot as plt ws_data=pd.read_csv("data.csv") diagnosis=ws_data.diagnosis predi_features=ws_data.iloc[:,2:32]

这次对SGD分类器和svm分类器的参数进行调整

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()                 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(loss="log",max_iter=1000, learning_rate="optimal")  ### 手动设置参数,详见sklearn官网                 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(kernel="linear",C=1)  ### 这里设置kernal=linear,不再是默认的rbf                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                rfClf=RandomForestClassifier()                rfClf.fit(train_x,train_y)                accuracy.append(rfClf.score(test_x,test_y))              return(np.array(accuracy))

再来看看它们在测试集上的表现

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") #### 还是0.95的参考线
plt.show()


和前一篇文章里的效果再对比一下,发现SGD和SVM的效果都明显提升了。




把五折交叉验证的过程重复50次,看看效果

whole=list()
for i in range(20): ### 重复两百次    mean_acu_score=list()    
   for s in ["SGD",'logistic','SVM',"randomforest"]:        mean_acu_score.append(np.mean(winsconBC(        data_y=diagnosis,method=s,rand_seed=i,        Nfolds=5,shuffled=True).classify()))    whole.append(mean_acu_score)   test_results=np.array(whole)###  我们把200次的对比数值可视化的方式展示出来

plt.figure(figsize=(20,10)) x=np.arange(1,51) y_SGD=test_results[:,0] y_logistic=test_results[:,1] y_svm=test_results[:,2] y_rf=test_results[:,3] L1, =plt.plot(x,y_SGD,label="a") L2, =plt.plot(x,y_logistic,c="r",label="b") L3, =plt.plot(x,y_svm,c="y",label="c") L4, =plt.plot(x,y_rf,c="b",label="d") plt.legend(handles=[L1,L2,L3,L4],labels=["SGD",'logistic','SVM',"randomforest"],loc="best") plt.show()

调整完参数后,svm的表现整体提升,SGD波动较大,还是随机森林给力。

获取本文数据:下图扫码关注Python爱好者公众号,后台回复 data

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复“课程”即可获取:

0.小编的Python入门视频课程!!!

1.崔老师爬虫实战案例免费学习视频。

2.丘老师数据科学入门指导免费学习视频。

3.陈老师数据分析报告制作免费学习视频。

4.玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。

5.丘老师Python网络爬虫实战免费学习视频。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存