A guide for data scientists-ML

 

sklearn中常用的算法模型
算法名称算法特点或描述sklearn算法实现重要调节参数及影响过拟合、欠拟合怎么判断和调参数?特征的重要性训练、预测和评价适用场景和其他算法之间的优缺点比较备注
梯度提升回归树(既可以用作回归,也可以用作分类)
Gradient boosted regression trees
通过连续方式来创建树,每一个树试图修正前一个树的分类错误。
通常使用很浅的树(<=5)组合成模型,所以使用内存相对较少、预测也更快。
核心思想:每个浅树都能在一部分数据上提供很好的预测,这样更多的树加起来就能迭代处好的表现。
from sklearn.ensemble import GradientBoostingClassifierlearning_rate:控制每一个树学习前一个树预测错误的强度。强度越大,错误修正越多,模型越复杂,完成同样复杂度的模型需要的树就越少。
n_estimators:通过增加在训练集上修正错误的树的个数来增加模型复杂度。
max_depth:树的深度参数。对于梯度提升模型一般设置的较低,不超过5。
max_features:最大特征数。
通常操作是:根据时间和内存预算先确定n_estimators,再搜索调整learning_rates。
当训练集得分很高、测试集得分不高或不够高时,可能是过拟合了。
这里就需要调节max_depth先剪枝限制树的深度,或者降低learning_rate学习率,都可以降低决策树的复杂度,从而降低模型的复杂度。
Max_depth和learning_rate对结果的影响分别如何?
Max_depth整体上的影响较大。
通过可视化的方式呈现特征的重要性。
通过模型的参数查看即可查看 .feature_importances_
使用绘图工具可视化。
.fit()
.score()
梯度提升决策树在数据未经过放缩处理、二元特征和连续特征都存在的数据集上能运行良好。
和所有基于树的模型一样,在高维稀疏数据集上它的效果并不好。
随机森林和梯度提升回归树在相似数据集上的表现差不多,通常是先尝试随机森林,它的健壮性更好些。如果随机森林运行良好,但预测时间很长,或者从机器学习模型中挤出最后一个百分比的准确性很重要,那么用梯度增强通常会有帮助。如果要将梯度提升应用于大规模数据,建议研究xgboost包及其Python接口。 
随机森林        
xgboost包        
支持向量机-线性分类模型用线性超平面对数据集进行划分from sklearn.svm import LinearSVC   模型训练、查看系数和截距
linear_svm_3d = LinearSVC().fit(X_new, y)
coef, intercept = linear_svm_3d.coef_.ravel(), linear_svm_3d.intercept_
决策方程:dec = linear_svm_3d.decision_function(np.c_[XX.ravel(), YY.ravel(), ZZ.ravel()])
   
支持向量机回归 SVR       
核化支持向量机
Kernelized Support Vector Machines
SVM中常用的两种把数据映射到高维空间中的方式是:多项式核技法(基本特征的指定degree的所有可能多项式形式)、高斯核技法(亦作RBF径向基函数核技法)。
直接计算扩展特征(交叉、幂),而不用实际上去扩展特征。
from sklearn.svm import SVC

svm = SVC(kernel='rbf', C=10, gamma=0.1).fit(X, y)
参数C:正则项参数,限制了每个点的重要性。
参数gamma:度量数据点间距离的公式由高斯核公司给出,k_rbf(x1,x2)=exp(gamma||x1-x2||^2),gamma函数控制高斯核的宽度,决定了数据点间怎样算紧密。
高斯核函数:是一个单调函数,内部复合欧式距离,这也就解释了径向基函数的来源,是关于某径向对象的锥形曲线函数。【想象一个三维的高斯核函数】
gamma和C都控制模型复杂度,其值越大模型越复杂。

gamma越小,模型越简单,易欠拟合;gamma越大,模型越复杂,易过拟合。

C越小,误分类的影响很小,模型受限制,曲线越光滑;
C越大,误分类点的影响越大,模型变复杂以便来正确分类这些点。
对于SVM重要的是支持向量,由参数.support_vectors_ 给出支持向量和参数.dual_coef_给出支持向量的类别标记 数据特征的scale是相似的、样本量不超过十万,很值得一试SVM。
注意选择核函数kernal、核函数对应的gamma参数、以及正则项参数C。
虽然支持向量机通常性能很好,但它们对参数设置和数据缩放非常敏感。特别是,它们要求所有的特征在相似的尺度/scale上变化,需要预处理。
核化的SVM能在少数特征数据上生成复杂的决策边界,在低维、高维数据上效果都好,但是样本量超过十万时对于内存和计算时间消耗很大。
 
前馈神经网络-多层感知机MLPs多层感知机可以看作线性模型的泛化。
(圆可以用多边形逼近)
from sklearn.neural_network import MLPClassifier

mlp = MLPClassifier(solver='lbfgs', random_state=0,hidden_layer_sizes=[10,10],alpha=0.01).fit(X_train, y_train)
hidden_layer_sizes,如设置隐藏层层数为两层,每层十个隐藏节点,=[10,10]
activation激活函数:   ('identity', 'logistic', 'tanh', 'relu')
,其中relu即rectified linear unit,校正线性单元函数,max(x,0).
solver求解权重系数的算法:{'lbfgs', 'sgd', 'adam'}
adam算法在大数据样本时训练和预测较快,在小样本时lbfgs更快。
alpha:L2正则项惩罚系数,
max_iter:最大迭代次数
调节参数增加模型复杂度或让决策边界更光滑:
增加隐藏层层数、增加每层隐藏层个数、使用非线性的激活函数、调节alpha参数(默认值设置的很低,alpha值可以调整正则项的权重,正则项的权重越小,模型越复杂,目标函数的值应该越小,越可能过拟合)
如果要损失一点模型复杂度来提高其泛化能力,调参:调大alpha
神经网络也需要输入特征先做预处理,最好平均值是0,方差是1。

.coefs_模型参数可以查看训练得到的各层系数。特征对于隐藏层的权重系数相对很小的,说明其重要性相对较低,或者这个特征表达对于机器学习很难学习到。
.fit()
.predict()
.score()

确定神经网络的隐藏层数和隐藏节点数,一般先从一两层隐藏层开始,逐步展开。每层隐藏层的节点数一般与输入特征数类似,但不会过千。
估计模型复杂度的一个度量方法是看看有多少权重系数需要学习。
 优点:如果参数调好,计算时间足够,通常能获得很好的效果(不管是分类还是回归问题),能学习到大数据集中的信息创建复杂模型。
缺点:需要的训练时间长,数据需要预处理标准化,调参过程比较繁琐。
常用调参套路:先创建一个可能过拟合的复杂模型,然后逐步缩小网络、增大正则项alpha,提高泛化能力。
神经网络的权值是训练前随机设置的,会影响所学习的模型。即使用完全相同的参数,当使用不同的随机种子时,也可以获得完全不同的模型。如果网络很大,并且其复杂性选择得当,则这不会对准确性产生太大影响,但值得记住(特别是对于较小的网络)。
基于分类器的不确定性估计
Uncertainty Estimates from Classifiers
预测属于某个分类的可能性scikit-learn中可以用的两个基于分类器的不确定性估计函数为.decision_function,.predict_proba。大部分分类器至少包含它们中的一个,多数两个都有。   
.predict_proba预测的是属于每个类的概率大小,所以值在0-1之间,并且按列相加和为1。
  .decision_function()的结果在二元分类中数值有正有负。正值表示数据属于正类的确信程度,负值表示负类。数据范围是任意的,取决于数据和模型参数,所以导致结果比较难解释。
          
          
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值