Python机器学习(sklearn)——分类模型评估与调参总结(下)

简介: Python机器学习(sklearn)——分类模型评估与调参总结

21.集成方法有随机森林(random forest)和梯度提升树(gradient boosted decision tree)GBDT

随机森林中树的随机化方法有两种:

(1)通过选择用于构造树的数据点
构造随机森林需要确定用于构造的树的个数
为了确保树与树之间的区别,对每棵树的数据进行自助采样
从样本数据中有放回的多次抽取(一个样本可能被抽取多次),抽取创建的新数据集要和原数据集大小相等(数据数量相同)

(2)通过选择每次划分测试集的特征
在每个节点处,算法随机选择特征的一个子集,并对其中一个特征寻找最佳测试,而不是对每个节点都寻找最佳测试。
使用参数max_features, 如果max_features= n_features,则每次考虑所有特征,即第二种随机性没用上
当max_features较大,随机森林中每棵树都会很相似(因为采用的特征基本相同)
如果max_features较小,树的差异较大,为了很好的拟合数据,每棵树的深度都应该较大。
RandomForestClassifier(n_estimators = 5,random_state = 2)#五棵树的随机森林
随机森林比单独一棵树的过拟合都要小,实际应用中,我们会用很多树(通常几百上千),从而达到决策边界更平滑的效果
一般,随机森林给出的特征重要性比单科决策树给出的可靠。
多核CPU可以设置参数n_jobs = -1来使用计算机的所有内核计算
设置不同的随机状态(或者不设置random_state参数)可以彻底改变构建的模型
如果希望结果重现,固定random_state
对于高维稀疏数据(例如文本数据)随机森林常常表现不佳,使用线性模型更为合适
随机森林需要调节的重要参数有n_estimators和max_features,还包括预剪枝选项(如max_depth)
n_estimators总是越大越好(时间内存允许的话)
max_features决定每棵树的随机性大小,较小可以降低过拟合,一般使用默认值
分类时默认值为sqrt(n_features)
对于回归默认值是n_features

22.梯度提升回归树(梯度提升机)
梯度提升采用连续的方式构造树,每棵树都试图纠正前一棵树的错误。
梯度提升树背后的主要思想是合并许多简单的模型(在这个语境中叫做弱学习器),比如深度较小的树
每棵树只能对部分数据作出好的预测,所以添加更多的树可以不断迭代提高性能
除了预剪枝和随机森林里的树的数量之外,梯度提升树的另一个重要参数是学习率(learning_rate)
用于控制每棵树纠正前一棵树错误的强度,通过增大learning_rate或n_estimators都会增加模型的复杂度
降低树的最大深度和学习率都能降低过拟合
GradientBoostingClassifier(random_state=0, max_depth=1, learning_rate=0.01)
随机森林的n_estimators越大越好
梯度提升树的n_estimators提高,模型复杂,会导致过拟合
梯度提升树的max_depth通常设置的很小,一般不超过5
由于梯度提升和随机森林两种方法在类似的数据上表现的都很好
因此一种常用的方法是先尝试随机森林,它的鲁棒性很好,如果随机森林效果很好,但是预测时间太长,选择梯度提升
梯度提升树的需要仔细调参,训练时间也长,也不适合高维稀疏数据

23.对于SVM,将数据映射到更高维空间中有两种常用方法:
(1)多项式核;在一定阶数内计算原始特征所有可能的多项式(例如features12, features25)
(2)径向基函数(RBF) 核,也叫高斯核。它考虑所有阶数的所有可能的多项式,但阶数越高,特征的重要性越小。

24.SVM调参
gamma参数,控制高斯核的宽度,它决定了点与点之间“靠近”是指多大的距离。C参数是正则化参数,与线性模型类似
它限制每个点的重要性
从小增大gamma(0.1-10),它认为点与点之间的距离不断增大,从决策边界平滑往不平滑过渡,模型越加复杂
这两个参数强烈相关,可以同时调节
C从小到大,决策边界越来越不平滑
默认情况下:C=1,gamma=1/n_features
SVM数据需要预处理(常用的是缩放到0~1之间)
常用的是(x-xmin)/(xmax-xmin)
SVM的缺点:需要预处理和小心调参,SVM模型很难检验,也难以解释

25.神经网络的非线性函数常用校正非线性(relu)或正切双曲线(tanh)
relu截断小于0的值
tanh在输入值小时接近-1,较大时接近1
有了这两种非线性函数,神经网络可以学习比线性模型复杂得多的函数
多层感知机(MLP ),也称为普通前馈神经网络,默认时,每层使用100个隐节点
默认的是relu
MLPClassifier(solver='lbfgs',random_state=0,hidden_layer_sizes=[10])
10层
如果是10层且每层10个隐节点
则hidden_layer_sizes=[10,10]
MLPClassifier中调节L2惩罚的参数是alpha(与线性回归模型相同),默认值很小(弱正则化)
控制神经网络的复杂度的方法有很多种,隐层的个数、每个隐层中的单元个数与正则化(alpha)
神经网络要求输入特征的变化范围相似,最理想的情况是均值为0,方差为1
我们必须对数据进行缩放达到这一要求
StandardScaler可以达到数据处理要求
迭代次数参数MLPClassifier(max_iter = 1000,random_state=0)
功能强大的神经网络经常需要很长的训练时间
神经网络的调参常用方法是,首先创建一个大到足以过拟合的网络,确保这个网络可以对任务进行学习
然后通过缩小网络或者增大alpha来增强正则化,从而提高泛化性能
如何学习模型或用来学习参数的算法,由solver参数设定
默认为'adam',在大多数情况下效果很好,但是对数据的缩放相当敏感(需要将数据缩放为均值为0,方差为1)
'lbfgs'的鲁棒性很好,大型数据集和大型模型上时间较长
更高级的'sgd'
初学者建议使用前两种
sklearn中有两个函数可用于获取分类器的不确定性估计:decision_function和predict_proba
大多数分类器都至少有其中一个函数,很多分类器这两个都有
predict_proba的结果是:
每行的第一个元素是第一个类别的估计概率,第二个元素是第二个类别的估计概率
predict_proba输出的是概率,在0~1之间,两个类别的元素之和始终为1
decision_function每一列对应每个类别的确定度分数,分数越高类别的可能性越大

26.如何选择合适的模型:

KNN
适用于小型数据集,容易解释

线性模型
非常可靠的首选算法,适用于非常大的数据集,也适合高维数据

朴素贝叶斯
只适用于分类问题,比线性模型速度还快,适用于非常大的数据集或者高维数据
精度通常要低于线性模型

决策树
速度很快,不需要数据放缩,可以可视化,容易解释

随机森林
几乎总是比单棵决策树表现好,鲁棒性好,不需要数据放缩,不适用于高维数据

梯度提升决策树
精度通常比随机森林略高,但是训练速度比随机森林慢,预测速度比随机森林快,需要的内存少,比随机森林需要调的参数多

SVM
对于特征含义相似的中等大小的数据集很强大,需要数据缩放,对参数敏感

神经网络
可以构建非常复杂的模型,特别是大型数据集,对数据缩放敏感,对参数选取敏感,大型网络需要很长的训练时间

面对数据集,先从简单的模型开始,比如线性回归、朴素贝叶斯、KNN,看看能得到的结果
对数据理解加深后,可以考虑更复杂的模型
如随机森林、梯度提升决策树、SVM、神经网络

原文发布时间为:2018-07-22
本文作者: 王大伟
本文来自云栖社区合作伙伴“ Python爱好者社区”,了解相关信息可以关注“ Python爱好者社区

相关文章
|
9天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品加工优化的深度学习模型
使用Python实现智能食品加工优化的深度学习模型
103 59
|
4天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品市场预测的深度学习模型
使用Python实现智能食品市场预测的深度学习模型
25 5
|
5天前
|
机器学习/深度学习 算法 数据可视化
使用Python实现深度学习模型:智能食品配送优化
使用Python实现深度学习模型:智能食品配送优化
20 2
|
4天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
19 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
4天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
22 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
10天前
|
机器学习/深度学习 数据采集 数据库
使用Python实现智能食品营养分析的深度学习模型
使用Python实现智能食品营养分析的深度学习模型
36 6
|
7天前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
17 2
|
7天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品储存管理的深度学习模型
使用Python实现智能食品储存管理的深度学习模型
21 2
|
9天前
|
机器学习/深度学习 数据采集 搜索推荐
利用Python和机器学习构建电影推荐系统
利用Python和机器学习构建电影推荐系统
23 1
|
9天前
|
机器学习/深度学习 算法 PyTorch
用Python实现简单机器学习模型:以鸢尾花数据集为例
用Python实现简单机器学习模型:以鸢尾花数据集为例
26 1

热门文章

最新文章