查看原文
其他

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

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

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

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


前文传送门:

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

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

机器学习预测乳腺肿瘤性质(3)——贝叶斯分类器

机器学习预测乳腺肿瘤性质(4)——神经网络

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

作为开篇,先引用冯诺依曼非常有趣的一句话:

With four parameters I can fit an elephant, and with five I can make him wiggle his trunk


模型的参数选择和调整是机器学习中的重要环节,在本系列的第二篇文章机器学习预测乳腺肿瘤性质(2)中,我们通过人为调整SVM的kernal参数,使SVM分类器的效果有了明显提升,我个人倾向于认为kernal也可以理解为一种广义的机器学习模型的参数。本篇笔记重点关注如何借助sckkit-learn中的最佳参数搜索的方法对前面几种分类器模型参数进行调整,以提升分类器的类别预测效果。

首先我们看看在scikit-learn中这几个分类器模型都有哪些主要参数可以进行调整


一 、SVM支持向量机

在支持向量机函数中,kernal可以选择’linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’,如果kernal选择为rbf、poly、 sigmoid,超参数gamma也可以调整。


二、Logistic回归分类器

logistic regression里面可以调整的超参数有:

penalty:正则惩罚项:使用L1还是L2惩罚项,默认一般是L2.

: 正则化程度的倒数,C越小,正则化程度越强

solver:优化算法选择,有四个:newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, 默认采取是liblinear的优化算法,该方法对规模小的数据集效果较好,数据集规模较大的时候sag的速度更快. 面对多分类变量问题的时候,只有 ‘newton-cg’, ‘sag’ 和’lbfgs’能处理多分类变量损失函数,‘liblinear’ 只能处理两分类(是或者否). ‘newton-cg’, ‘lbfgs’ 和 ‘sag’ 只支持L2惩罚项。

三、Random Forest 随机森林

在Random Forest 模型中,常见可调参数有 :
n_estimators : 随机森林中树的数量,也就是弱分类器的数量
criterion: 两种衡量分割效果的方法,有基尼系数法和熵法。
max_features : 寻找最佳分割时要考虑特征变量的个数
max_depth :设置决策树最大深度,如果不设置该变量,决策树一直延伸直至每个叶节点都完美分类,或者所有叶节点内数量达到min_samples_split指定的样本数量。
min_samples_split: 分割一个内部节点所要求的最低样本含量,低于这个数量就不再分割了。
max_leaf_nodes :  叶节点最大数目,默认不限制叶节点的最大数量。
min_impurity_split: 如果纯度还高于阈值,继续分割,如果达到阈值,成为叶节点。
bootstrap : 在生长树的时候是否采用bootstrap的方法

四、最佳参数搜索

面对各个分类算法中各种参数,如何设置能使分类器发挥出最佳效果了?scikit-learn提供了多种暴力搜索的方法来进行参数优化,见下图



归纳起来,主要是两种原理,一种是Grid search(网格式搜索),把可调参数排列组合,比如模型有两个参数A和B,参数A有3个取值,参数B有2个取值,组合起来就是6种,用这6种取值去拟合数据后得到6个模型,利用交叉验证和评价指标来筛选最佳参数组合。第二种看函数名就可以猜到,是根据各参数的分布范围随机抽样后组合,同样利用交叉验证和评价指标来筛选最佳参数组合。

(1) 网格搜索

一起来看代码,还是使用我们的乳腺数据,先采用网格搜索。

from sklearn.ensemble import RandomForestClassifier

##先建一个随机森林分类器

rfClf=RandomForestClassifier()

from sklearn.model_selection import GridSearchCV

##设置参数网格,随机森林默认的bootstrap是True,第一个网格只涉及两个参
##数:树的数量和特征变量个数,前者有三个值可以选择,后者有四个值可
##选,有12种组合,后面一个dict格式储存的是另一种网格,在bootstrap参数设
##置为False的情况下,树的数量有两个值可选,max_feature有三个值可选,
##共有6种组合,加上前面12种就是18种组合。

hypermeter_grid=[{‘n_estimators’:[3,10,15],’
               max_features’:[2,4,6,8]},                
                {‘bootstrap’:[False],
                ’n_estimators’:[3,10],
                ’max_features’:[2,3,4]}]           

##设置三折交叉验证,评价指标选F1

grid_search=GridSearchCV(rfClf,hypermeter_grid,cv=3,scoring=”f1”)

##用不同参数组合去拟合数据,建立模型

grid_search.fit(predi_features,diagnosis==”M”)

##查看最佳参数设置和各种组合的得分情况

gridsearch.best_params gridsearch.grid_scores

最佳参数: {‘max_features’: 6, ‘n_estimators’: 15}

那就是bootstrap设置为True,max_feature设置为6,树数量设置为15的时候效果最好。



(2)随机搜索

接下来我们再试试随机搜索的方法

## 调用scipy里的整数随机分布

from scipy.stats import randint as sp_randint
from sklearn.model_selection import RandomizedSearchCV

## 将max_features,min_samples_split,以及min_samples_leaf的随机分布设置
## 好,注意这里不能用np.random.randomint函数,这里要求的是分布不是抽
## 样结果

random_grid={"max_depth": [3, None],
             "max_features": sp_randint(1, 20),  
             "min_samples_split":sp_randint(2, 11),
              "min_samples_leaf": sp_randint(1, 11),  
             "bootstrap": [True, False],
             "criterion": ["gini", "entropy"]}

## 随机抽取10次参数组合

n_iteration=10

## 设置三折交叉验证,评价分数为F1

random_grid_search=RandomizedSearchCV(cv=3,estimator=rfClf,n_iter=n_iteration,                                      scoring='f1',param_distributions=random_grid)
## 拟合数据

random_grid_search.fit(predi_features,diagnosis=="M")
## 查看最佳F1得分

random_grid_search.best_score_
## 查看最佳参数组合

random_grid_search.best_params_

## 查看10次参数组合的得分情况

random_grid_search.grid_scores_

最佳的F1得分是:0.9362

最佳参数组合:

{‘bootstrap’: False,  

‘criterion’: ‘entropy’, 

 ‘max_depth’: None, 

 ‘max_features’: 14,  

‘min_samples_leaf’: 3, 

 ‘min_samples_split’: 5}

10次得分情况:


如果这篇笔记对您有帮助,请帮我点赞

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

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

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

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

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

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

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

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

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

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

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

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