精华内容
下载资源
问答
  • 机器学习模型选择

    2020-12-16 16:32:15
    模型选择的原则 我们应该如何选取我们的模型? 另外有: 模型评价 给定了两个候选模型后,哪个模型比较好呢? 准确率,召回率和loss大小 模型复杂度,这里是指模型是线性的还是非线性的。 模型训练时间复杂度和...

    模型特点

    模型都可以一定程度解决问题,但是却显然不同,有什么各自的特点?

    1. 一些模型能够处理高维数据,一些模型泛化能力好,一些模型对样本数据具有很强的拟合能力。

    在这里插入图片描述
    所以有没有一个最好的模型?
    在这里插入图片描述

    模型选择的原则

    我们应该如何选取我们的模型?
    在这里插入图片描述
    在这里插入图片描述
    另外有:
    在这里插入图片描述

    模型评价

    给定了两个候选模型后,哪个模型比较好呢?

    • 准确率,召回率和loss大小
    • 模型复杂度,这里是指模型是线性的还是非线性的。
    • 模型训练时间复杂度和应用的时候响应速度
    • 。。。
      在这里插入图片描述

    还有一个评价方法,就是在非训练数据上的泛化能力。即用留出来的测试集测试来评估待评价的两个模型。

    展开全文
  • 机器学习模型选择如此简单

    千次阅读 2016-11-05 16:45:13
    机器学习模型选择如此简单

    机器学习的讨论经常会涉及到的问题是:什么机器学习模型才是最好的?是逻辑回归模型,随机森林模型,贝叶斯方法模型,支持向量机模型?抑或是神经网络模型?每个人似乎都有自己心中最爱!但这些讨论试图把机器学习的挑战缩减为单个问题,而这对机器学习的初学者带来了特别严重的误解。

    选择一个好的机器学习模型固然重要,但这远远不够。在缺乏领域知识,基本假设,数据选型和实际的应用的情况下,还是值得商榷的。关于机器学习模型评价这部分将留在下一篇文章阐述。

    feature engineering (FE),algorithm selection (AS),and parameter tuning (PT);

    模型选择

    能训练一个“合适”的模型和预测是相当依赖特征工程、参数调优和模型选择。模型选择是机器学习过程比较难的部分,复杂、迭代,经常不断的去“试错”和重复。

    模型选择实战

    相信大家对Scikit-Learn“如何选择Estimator”里的流程图非常熟悉了,不熟悉的点开链接读读。这个流程图是给初学者一个选择机器学习算法的最佳实践的参考手册。




    首先,看下我们的数据集(三个数据集参考上篇《可视化图表让机器学习“biu”的一样简单:特征分析》)的样本数是否够50。

    print len(occupancy) # 8,143
    print len(credit)    # 30,000
    print len(concrete)  # 1,030

    很显然这个条件是满足的。接着看下是否我们是否预测类别。对于房屋入住和信用卡数据集来说是判断类别;而混凝土数据集,缓凝土的抗压强度是连续数据,所以预测的是数量。因此,为前两个数据集选择分类器(classifier);为后者选择回归模型(regressor)。

    因为我们的两个判断类别的数据集都小于100K,接着按图选择sklearn.svm.LinearSVC(其会将数据集映射到高维特征空间);如果失败,就再选择sklearn.neighbors.KNeighborsClassifier(其会分配样本到它的K领域)。你应该还记得房屋入住数据集单位不统一,所以这里引入scale进行归一化:

     
    from sklearn.preprocessing import scale
    from sklearn.svm import LinearSVC
    from sklearn.neighbors import KNeighborsClassifier
    def classify(attributes, targets, model):
        # Split data into 'test' and 'train' for cross validation
        splits = cv.train_test_split(attributes, targets, test_size=0.2)
        X_train, X_test, y_train, y_test = splits
        model.fit(X_train, y_train)
        y_true = y_test
        y_pred = model.predict(X_test)
        print(confusion_matrix(y_true, y_pred))
    # Divide data frame into features and labels
    features = occupancy[['temp', 'humid', 'light', 'co2', 'hratio']]
    labels   = occupancy['occupied']
    # Scale the features
    stdfeatures = scale(features)
    classify(stdfeatures, labels, LinearSVC())
    classify(stdfeatures, labels, KNeighborsClassifier())

    对于信用卡数据集使用相同的classify,根据上篇的特征分析经验,我们这里需要先进行数据缺失处理。

     
    features = credit[[
        'limit', 'sex', 'edu', 'married', 'age', 'apr_delay', 'may_delay',
        'jun_delay', 'jul_delay', 'aug_delay', 'sep_delay', 'apr_bill', 'may_bill',
        'jun_bill', 'jul_bill', 'aug_bill', 'sep_bill', 'apr_pay', 'may_pay',
        'jun_pay', 'jul_pay', 'aug_pay', 'sep_pay'
    ]]
    labels   = credit['default']
    stdfeatures = scale(features)
    classify(stdfeatures, labels, LinearSVC())
    classify(stdfeatures, labels, KNeighborsClassifier())
    对于混凝土数据集,我们得决定是否所有的特征都重要,或者只有一部分重要。如果选择所有的特征都很重要,那根据流程图手册路线应该选择sklearn.linear_model.RidgeRegression或者sklearn.svm.SVR(有点类似LinearSVC classifier);如果觉得只有部分特征重要,那就选择sklearn.linear_model.Lasso(其会在预测时舍弃部分特征)或者sklearn.linear_model.ElasticNet(其介入 Lasso方法和Ridge方法之间,L1和 L2惩罚的线性组合)。
    下面来试试看咯:
     
    from sklearn.linear_model import Ridge, Lasso, ElasticNet
    def regress(attributes, targets, model):
        splits = cv.train_test_split(attributes, targets, test_size=0.2)
        X_train, X_test, y_train, y_test = splits
        model.fit(X_train, y_train)
        y_true = y_test
        y_pred = model.predict(X_test)
        print('Mean squared error = {:0.3f}'.format(mse(y_true, y_pred)))
        print('R2 score = {:0.3f}'.format(r2_score(y_true, y_pred)))
    features = concrete[[
        'cement', 'slag', 'ash', 'water', 'splast', 'coarse', 'fine', 'age'
    ]]
    labels   = concrete['strength']
    regress(features, labels, Ridge())
    regress(features, labels, Lasso())
    regress(features, labels, ElasticNet())
    正如上面代码展示的那样,Scikit-Learn API使得我们可以快速的发布我们需要的模型,这是Scikit-Learn一个强有力的魔力。
    可视化模型

    Scikit-Learn流程图非常有用是因为其提供了使用路径地图,但是它不能提供各种模型的函数。因而另外两幅图成为Scikit-Learn的权威:分类器比较聚类比较

    多个小图形很容易比较出不同的数据集适合的聚类算法:



    类似的,分类器比较图很好的帮助我们对不同的数据集选择哪种合适的分类器:


    一般来说,这些图形仅仅是证明了各种模型对不同数据集的优化;但我相信大家都希望有一种可视化工具可以对同一个数据集使用不同的模型的情况进行比较。

    模型簇

    首先给出“模型”这个词的定义,它包括三方面:

    • 模型簇:比如,linear model,nearest neighbors,SVM,Bayes等模型;

    • 模型形式:比如,sklearn.linear_model.Ridge(),sklearn.linear_model.Lasso(),sklearn.linear_model.ElasticNet等;

    • 拟合模型:比如,Ridge().fit(X_train, y_train)。


    模型簇是由特征空间决定的;模型形式是通过试验和统计检验来选择的;拟合模型是由参数调优和机器计算生成的。

    我们讨论的这些,模型形式的试验会在后续文章中讲到,这部分是我们期望能够得到回报的想象空间。模型形式是指出我们的特征是如何和模型簇相关。

    我喜欢的模型展示工具之一是Dr. Saed Sayad的可交互的“数据挖掘地图”。它比Scikit-Learn的流程图手册综合性更高,并且结合里模型簇和模型形式的概念。除了预测方法外,Sayad地图也包含了统计方法部分。

    这里给出一个普适的流程图,它旨在结合Sayad地图和 Scikit-Learn流程图。颜色和等级代表模型形式和模型簇:


    总结

    通过在同一个数据集上比较和对比不同模型的性能,我们能从模型簇中直观的选取模型形式。

    下期将会讲解拟合模型和调参的可视化工具。

    PS:这周深入的“研究”了下Flume,日志收集利器,但是对Hadoop版本的支持太低,填了不少坑......希望我写的对部分人有用,如果是这样,请让我知道,谢谢。


    侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。


    转载自链接:http://mp.weixin.qq.com/s?__biz=MzI0MDIxMDM0MQ==&mid=2247483750&idx=1&sn=34d9979d6e2608535d9921db54d57a8d&chksm=e91f19acde6890baa7e6950b7133bcf290549c8b2ef150e5422a3c2f0df233e51cbde2b5baf3&scene=21#wechat_redirect

    展开全文
  • 机器学习模型选择:调参参数选择

    万次阅读 2016-10-23 16:49:22
    http://blog.csdn.net/pipisorry/article/details/52902797调参经验好的实验环境是成功的一半由于深度学习实验超参众多,代码风格良好的实验环境,可以让你的...可以输出模型的损失函数值以及训练集和验证集上的准确

    http://blog.csdn.net/pipisorry/article/details/52902797

    调参经验

    好的实验环境是成功的一半

    由于深度学习实验超参众多,代码风格良好的实验环境,可以让你的人工或者自动调参更加省力,有以下几点可能需要注意:

    • 将各个参数的设置部分集中在一起。如果参数的设置分布在代码的各个地方,那么修改的过程想必会非常痛苦。
    • 可以输出模型的损失函数值以及训练集和验证集上的准确率。
    • 可以考虑设计一个子程序,可以根据给定的参数,启动训练并监控和周期性保存评估结果。再由一个主程序,分配参数以及并行启动一系列子程序。

    画图

    画图是一个很好的习惯,一般是训练数据遍历一轮以后,就输出一下训练集和验证集准确率。同时画到一张图上。这样训练一段时间以后,如果模型一直没有收敛,那么就可以停止训练,尝试其他参数了,以节省时间。
    如果训练到最后,训练集,测试集准确率都很低,那么说明模型有可能欠拟合。那么后续调节参数方向,就是增强模型的拟合能力。例如增加网络层数,增加节点数,减少dropout值,减少L2正则值等等。
    如果训练集准确率较高,测试集准确率比较低,那么模型有可能过拟合,这个时候就需要向提高模型泛化能力的方向,调节参数。

    从粗到细分阶段调参

    实践中,一般先进行初步范围搜索,然后根据好结果出现的地方,再缩小范围进行更精细的搜索。

    1. 建议先参考相关论文,以论文中给出的参数作为初始参数。至少论文中的参数,是个不差的结果。
    2. 如果找不到参考,那么只能自己尝试了。可以先从比较重要,对实验结果影响比较大的参数开始,同时固定其他参数,得到一个差不多的结果以后,在这个结果的基础上,再调其他参数。例如学习率一般就比正则值,dropout值重要的话,学习率设置的不合适,不仅结果可能变差,模型甚至会无法收敛。
    3. 如果实在找不到一组参数,可以让模型收敛。那么就需要检查,是不是其他地方出了问题,例如模型实现,数据等等。可以参考我写的深度学习网络调试技巧

    提高速度

    调参只是为了寻找合适的参数,而不是产出最终模型。一般在小数据集上合适的参数,在大数据集上效果也不会太差。因此可以尝试对数据进行精简,以提高速度,在有限的时间内可以尝试更多参数。

    • 对训练数据进行采样。例如原来100W条数据,先采样成1W,进行实验看看。
    • 减少训练类别。例如手写数字识别任务,原来是10个类别,那么我们可以先在2个类别上训练,看看结果如何。

    某小皮



    调参实战

    梯度下降迭代步长/学习率的选择

    learning rate α的设置对cost func的影响


    左图:α太小更新慢,运行时间长;α太大,走过了,可能一直到达不了极值。右图:α设置太大会导致的另外两种情形。

    学习率怎么选择?

    1 try running gradient descent with a range of values for α, like 0.001, 0.01,..., just plot j of theta as a function of number of iterations and then pick the value of alpha that seems to be causing j of theta to decrease rapidly.
    2 trying out gradient descents with each value being about 3X bigger than the previous value.

    learning rate: 1 0.1 0.01 0.001, 一般从1开始尝试。很少见learning rate大于10的。学习率一般要随着训练进行衰减。衰减系数一般是0.5。

    衰减时机,可以是验证集准确率不再上升时,或固定训练多少个周期以后。

    3 线性搜索

    也就是将xk + 步长*梯度(只有梯度是未知参数)代入f(x)中,求解出梯度。

    [统计学习方法]

    4 自适应学习

    自适应梯度的办法,例如adam,adadelta,rmsprop等,这些一般使用相关论文提供的默认值即可,可以避免再费劲调节学习率。

    在算法迭代过程中逐步降低学习率(step_size)通常可以加快算法的收敛速度。常用的用来更新学习率的方法有三种:

    • 逐步降低(Step decay),即经过一定迭代次数后将学习率乘以一个小的衰减因子。典型的做法包括经过5次迭代(epoch)后学习率乘以0.5,或者20次迭代后乘以0.1。
    和多项式衰减类似:
    global_step = min(global_step, decay_steps)
    decayed_learning_rate = (learning_rate - end_learning_rate) * (1 - global_step / decay_steps) ^ (power) + end_learning_rate
    • 指数衰减(Exponential decay),其数学表达式可以表示为:α=α0ekt,其中,α0k是需要设置的超参数,t是迭代次数。

    指数衰减有自然指数衰减和指数衰减:

    decayed_learning_rate = learning_rate * exp(-decay_rate * global_step)

    或者decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)如 0.5 * 0.96 ^ (global_step / 1000)

    • 倒数衰减(1/t decay),其数学表达式可以表示为:α=α0/(1+kt),其中,α0k是需要设置的超参数,t是迭代次数。

    即inverse_time_decay : decayed_learning_rate = learning_rate / (1 + decay_rate * t), 如inverse_time_decay(0.5, global_step, decay_steps=1000, decay_rate=0.5)

    有人说实践中发现逐步衰减的效果优于另外两种方法,一方面在于其需要设置的超参数数量少,另一方面其可解释性也强于另两种方法。

    对RNN来说,有个经验,如果RNN要处理的序列比较长,或者RNN层数比较多,那么learning rate一般小一些比较好,否则有可能出现结果不收敛,甚至Nan等问题。

    gradient descent中α值的自动变化

    实际上迭代步长自适应减小:在最终推导出的更新公式中,可以得出以下直观结论:如果遇到一个数据使得(y−hθ(x))比较小,这时候θ的更新也会很小,这也符合直观感觉。当一个数据使得差值比较大时,θ的更新也会比较大。

    the derivative here will be even smaller than it was at the green point.

    As gradient descent runs. You will automatically take smaller and smaller steps until eventually you are taking very small steps.so actually there is no need to decrease alpha overtime.

    [machine learning ng]

    某小皮

    规格化参数λ选择

    l2正则系数0.002, 1e-5。0.0表示不正则, -1表示0.25 / batch_size。超过10的很少见

    [-1, 0.0, 5.0, 1.0, 0.1, 0.01, 0.001]


    选择交叉验证集(而不是test set)上 error最小的模型及其对应的λ。

    通过交叉验证集上的的函数来选择λ的值。

    太大的λ对应高bias(underfit),这时训练集和交叉验证集可能都没拟合好;太小的λ对应高variance(overfit),这时across validation error也会很高。

    所以我们一般选择适当大的λ,此时交叉验证集上的error最小,而训练集上的误差也不大。

    某小皮

    深度学习网络调参技巧

    [深度学习网络调参技巧]

    from: http://blog.csdn.net/pipisorry/article/details/52902797

    ref:


    展开全文
  • 选择合适的模型,对于在实践中成功应用机器学习模型是很重要的。关于何时使用哪种模型,下面是一份快速总结。 最近邻 适用于小型数据集,是很好的基准模型,很容易解释。 线性模型 非常可靠的首选算法,适用...
    • 选择合适的模型,对于在实践中成功应用机器学习模型是很重要的。关于何时使用哪种模型,下面是一份快速总结。

     

    最近邻

    from sklearn.model_selection import train_test_split
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
    
    from sklearn.neighbors import KNeighborsClassifier
    
    clf = KNeighborsClassifier(n_neighbors=3)
    clf.fit(X_train, y_train)
    
    print("Test set predictions: {}".format(clf.predict(X_test)))
    print("Test set accuracy: {:.2f}".format(clf.score(X_test, y_test)))
    

    适用于小型数据集,是很好的基准模型,很容易解释。

     线性模型

    from sklearn.linear_model import LinearRegression
    

    非常可靠的首选算法,适用于非常大的数据集,也适用于高维数据。

    朴素贝叶斯

    from sklearn.naive_bayes import GaussianNB

    只适用于分类问题。比线性模型速度还快,适用于非常大的数据集和高维数据。精度通常要低于线性模型。

    决策树

    from sklearn import tree

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

    随机森林

    from sklearn.tree import DecisionTreeClassifier

    几乎总是比单棵决策树的表现要好,鲁棒性很好,非常强大。不需要数据缩放。不适用于高维稀疏数据。

    梯度提升决策树

    from sklearn.ensemble import GradientBoostingRegressor

    精度通常比随机森林略高。与随机森林相比,训练速度更慢,但预测速度更快,需要的内存也更少。比随机森林需要更多的参数调节。

    支持向量机

    from sklearn.svm import LinearSVC

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

    神经网络

    from sklearn.neural_network import MLPClassifier

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

     

    来源:python机器学习基础教程

     

    展开全文
  • 模型选择与调优 常见方法: 交叉验证(cross validation) 超参数搜索-网格搜索(Grid Search) 1、交叉验证(cross validation) 交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,...
  • 针对特定的数据集选择合适的机器学习算法是冗长的过程,即使是针对特定的机器学习算法,亦需要花费大量时间和精力调整参数,才能让模型获得好的效果,Hyperopt-sklearn可以辅助解决这样的问题。
  • 交叉验证首先选择模型最简单的方法就是,利用每一种机器学习算法(逻辑回归、SVM、线性回归等)计算训练集的损失值,然后选择其中损失值最小的模型,但是这样是不合理的,因为当训练集不够、特征过多时容易过拟合,...
  • 本文将介绍选择合适机器学习模型时要注意的一些关键问题。a)奥卡姆剃刀预测模型必须尽可能简单,但不要太简单。通常被称为奥卡姆剃刀,这是所有机器学习的基本原则。因此,奥卡姆剃刀是一条简单的经验法则-鉴于两个...
  • 在数据分析领域,机器学习是一种重要的工具,机器学习模型选择在一定程度上会影响数据分析效果,那么,选择模型的原则有哪些?本文就此问题探讨一二。 # 模型效果 使用机器学习进行判断/预测的效果,如果不能接近/...
  • 选择正确的度量来评估机器学习模型我们什么时候评估我们的机器学习模型呢?答案不是只有一次。通常,我们在实际的数据科学工作流中两次使用机器学习模型验证指标:模型比较:为您的任务选择最佳机器学习(ML)模型模型...
  • 机器学习模型选择

    2015-11-02 16:27:52
    机器学习模型选择
  • 选择正确的度量来评估机器学习模型我们什么时候评估我们的机器学习模型呢?答案不是只有一次。通常,我们在实际的数据科学工作流中两次使用机器学习模型验证指标:模型比较:为您的任务选择最佳机器学习(ML)模型模型...
  • 机器学习模型选择和评估 误差(Error):是模型的预测输出值与其真实值之间的差异。 训练(Training):通过已知的样本数据进行学习,从而得到模型的过程。 训练误差(Training Error):模型作用于训练集时的误差...
  • 机器学习模型选择机器学习模型选择交叉验证特征选择 【机器学习模型选择 交叉验证 以线性回归为例,假设我们有一个训练集S,如果仅根据训练误差最小来选择模型,即如下步骤: 在训练集S上训练所有备胎...
  • 本次分享主要面向一些刚刚进入工业届的初学者,他们对机器学习算法非常感兴趣,但可能还没有很好的直觉去挑选合适的模型来解决他们的业务问题。...希望本场 Chat 可以带你进入机器学习模型选择之门。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,034
精华内容 3,213
关键字:

机器学习模型选择